diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index c753546..8cec163 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,8 @@ /yarn-error.log /public/assets .byebug_history +.DS_Store +dump.sql +*.duckdb +*.duckdb.wal +shared/ diff --git a/.ruby-version b/.ruby-version old mode 100644 new mode 100755 diff --git a/Gemfile b/Gemfile deleted file mode 100644 index a6709ad..0000000 --- a/Gemfile +++ /dev/null @@ -1,29 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '2.6.5' - -gem 'rails', '~> 5.2.3' -gem 'puma', '~> 3.11' -gem 'sass-rails', '~> 5.0' -gem 'uglifier', '>= 1.3.0' -gem 'coffee-rails', '~> 4.2' -gem 'bootsnap', '>= 1.1.0', require: false - -gem 'haml' -gem 'mysql2' -gem 'activeadmin' -gem 'devise' -gem 'will_paginate' -gem "awesome_print" - -group :development, :test do - gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] -end - -group :development do - gem 'web-console', '>= 3.3.0' - gem 'listen', '>= 3.0.5', '< 3.2' - gem 'spring' - gem 'spring-watcher-listen', '~> 2.0.0' -end diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index bd3fd75..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,269 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - actioncable (5.2.3) - actionpack (= 5.2.3) - nio4r (~> 2.0) - websocket-driver (>= 0.6.1) - actionmailer (5.2.3) - actionpack (= 5.2.3) - actionview (= 5.2.3) - activejob (= 5.2.3) - mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (5.2.3) - actionview (= 5.2.3) - activesupport (= 5.2.3) - rack (~> 2.0) - rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.3) - activesupport (= 5.2.3) - builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - activeadmin (2.4.0) - arbre (~> 1.2, >= 1.2.1) - formtastic (~> 3.1) - formtastic_i18n (~> 0.4) - inherited_resources (~> 1.7) - jquery-rails (~> 4.2) - kaminari (~> 1.0, >= 1.0.1) - railties (>= 5.0, < 6.1) - ransack (~> 2.1, >= 2.1.1) - sassc-rails (~> 2.1) - sprockets (>= 3.0, < 4.1) - sprockets-es6 (~> 0.9, >= 0.9.2) - activejob (5.2.3) - activesupport (= 5.2.3) - globalid (>= 0.3.6) - activemodel (5.2.3) - activesupport (= 5.2.3) - activerecord (5.2.3) - activemodel (= 5.2.3) - activesupport (= 5.2.3) - arel (>= 9.0) - activestorage (5.2.3) - actionpack (= 5.2.3) - activerecord (= 5.2.3) - marcel (~> 0.3.1) - activesupport (5.2.3) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - arbre (1.2.1) - activesupport (>= 3.0.0) - arel (9.0.0) - awesome_print (1.8.0) - babel-source (5.8.35) - babel-transpiler (0.7.0) - babel-source (>= 4.0, < 6) - execjs (~> 2.0) - bcrypt (3.1.13) - bindex (0.8.1) - bootsnap (1.4.5) - msgpack (~> 1.0) - builder (3.2.3) - byebug (11.0.1) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - concurrent-ruby (1.1.5) - crass (1.0.5) - devise (4.7.1) - bcrypt (~> 3.0) - orm_adapter (~> 0.1) - railties (>= 4.1.0) - responders - warden (~> 1.2.3) - erubi (1.9.0) - execjs (2.7.0) - ffi (1.11.3) - formtastic (3.1.5) - actionpack (>= 3.2.13) - formtastic_i18n (0.6.0) - globalid (0.4.2) - activesupport (>= 4.2.0) - haml (5.1.2) - temple (>= 0.8.0) - tilt - has_scope (0.7.2) - actionpack (>= 4.1) - activesupport (>= 4.1) - i18n (1.7.0) - concurrent-ruby (~> 1.0) - inherited_resources (1.11.0) - actionpack (>= 5.0, < 6.1) - has_scope (~> 0.6) - railties (>= 5.0, < 6.1) - responders (>= 2, < 4) - jquery-rails (4.3.5) - rails-dom-testing (>= 1, < 3) - railties (>= 4.2.0) - thor (>= 0.14, < 2.0) - kaminari (1.1.1) - activesupport (>= 4.1.0) - kaminari-actionview (= 1.1.1) - kaminari-activerecord (= 1.1.1) - kaminari-core (= 1.1.1) - kaminari-actionview (1.1.1) - actionview - kaminari-core (= 1.1.1) - kaminari-activerecord (1.1.1) - activerecord - kaminari-core (= 1.1.1) - kaminari-core (1.1.1) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - loofah (2.3.1) - crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) - mini_mime (>= 0.1.1) - marcel (0.3.3) - mimemagic (~> 0.3.2) - method_source (0.9.2) - mimemagic (0.3.3) - mini_mime (1.0.2) - mini_portile2 (2.4.0) - minitest (5.13.0) - msgpack (1.3.1) - mysql2 (0.5.2) - nio4r (2.5.2) - nokogiri (1.10.5) - mini_portile2 (~> 2.4.0) - orm_adapter (0.5.0) - polyamorous (2.3.0) - activerecord (>= 5.0) - puma (3.12.1) - rack (2.0.7) - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (5.2.3) - actioncable (= 5.2.3) - actionmailer (= 5.2.3) - actionpack (= 5.2.3) - actionview (= 5.2.3) - activejob (= 5.2.3) - activemodel (= 5.2.3) - activerecord (= 5.2.3) - activestorage (= 5.2.3) - activesupport (= 5.2.3) - bundler (>= 1.3.0) - railties (= 5.2.3) - sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) - nokogiri (>= 1.6) - rails-html-sanitizer (1.3.0) - loofah (~> 2.3) - railties (5.2.3) - actionpack (= 5.2.3) - activesupport (= 5.2.3) - method_source - rake (>= 0.8.7) - thor (>= 0.19.0, < 2.0) - rake (13.0.1) - ransack (2.3.0) - actionpack (>= 5.0) - activerecord (>= 5.0) - activesupport (>= 5.0) - i18n - polyamorous (= 2.3.0) - rb-fsevent (0.10.3) - rb-inotify (0.10.0) - ffi (~> 1.0) - responders (3.0.0) - actionpack (>= 5.0) - railties (>= 5.0) - ruby_dep (1.5.0) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.1.0) - railties (>= 5.2.0) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) - sassc (2.2.1) - ffi (~> 1.9) - sassc-rails (2.1.2) - railties (>= 4.0.0) - sassc (>= 2.0) - sprockets (> 3.0) - sprockets-rails - tilt - spring (2.1.0) - spring-watcher-listen (2.0.1) - listen (>= 2.7, < 4.0) - spring (>= 1.2, < 3.0) - sprockets (3.7.2) - concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-es6 (0.9.2) - babel-source (>= 5.8.11) - babel-transpiler - sprockets (>= 3.0.0) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) - sprockets (>= 3.0.0) - temple (0.8.2) - thor (0.20.3) - thread_safe (0.3.6) - tilt (2.0.10) - tzinfo (1.2.5) - thread_safe (~> 0.1) - uglifier (4.2.0) - execjs (>= 0.3.0, < 3) - warden (1.2.8) - rack (>= 2.0.6) - web-console (3.7.0) - actionview (>= 5.0) - activemodel (>= 5.0) - bindex (>= 0.4.0) - railties (>= 5.0) - websocket-driver (0.7.1) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.4) - will_paginate (3.2.1) - -PLATFORMS - ruby - -DEPENDENCIES - activeadmin - awesome_print - bootsnap (>= 1.1.0) - byebug - coffee-rails (~> 4.2) - devise - haml - listen (>= 3.0.5, < 3.2) - mysql2 - puma (~> 3.11) - rails (~> 5.2.3) - sass-rails (~> 5.0) - spring - spring-watcher-listen (~> 2.0.0) - uglifier (>= 1.3.0) - web-console (>= 3.3.0) - will_paginate - -RUBY VERSION - ruby 2.6.5p114 - -BUNDLED WITH - 1.17.2 diff --git a/README.md b/README.md deleted file mode 100644 index 8aa0637..0000000 --- a/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Ambiente Já! - -### = fase#01 - -[ x ] Re-estructure old database - -[ x ] Setup web application - -[ x ] List articles @ sketch design - - -### = fase#02 - -[...] New design - -[ ] Fix informativo links diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png deleted file mode 100644 index 8487538..0000000 Binary files a/app/assets/images/logo.png and /dev/null differ diff --git a/app/assets/javascripts/masonry.pkgd.min.js b/app/assets/javascripts/masonry.pkgd.min.js deleted file mode 100644 index 53386ae..0000000 --- a/app/assets/javascripts/masonry.pkgd.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Masonry PACKAGED v4.2.2 - * Cascading grid layout library - * https://masonry.desandro.com - * MIT License - * by David DeSandro - */ - -!function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,r,a){function h(t,e,n){var o,r="$()."+i+'("'+e+'")';return t.each(function(t,h){var u=a.data(h,i);if(!u)return void s(i+" not initialized. Cannot call methods, i.e. "+r);var d=u[e];if(!d||"_"==e.charAt(0))return void s(r+" is not a valid method");var l=d.apply(u,n);o=void 0===o?l:o}),void 0!==o?o:t}function u(t,e){t.each(function(t,n){var o=a.data(n,i);o?(o.option(e),o._init()):(o=new r(n,e),a.data(n,i,o))})}a=a||e||t.jQuery,a&&(r.prototype.option||(r.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=o.call(arguments,1);return h(this,t,e)}return u(this,t),this},n(a))}function n(t){!t||t&&t.bridget||(t.bridget=i)}var o=Array.prototype.slice,r=t.console,s="undefined"==typeof r?function(){}:function(t){r.error(t)};return n(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},n=i[t]=i[t]||[];return-1==n.indexOf(e)&&n.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},n=i[t]=i[t]||{};return n[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=i.indexOf(e);return-1!=n&&i.splice(n,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var n=this._onceEvents&&this._onceEvents[t],o=0;oe;e++){var i=h[e];t[i]=0}return t}function n(t){var e=getComputedStyle(t);return e||a("Style returned "+e+". Are you running this code in a hidden iframe on Firefox? See https://bit.ly/getsizebug1"),e}function o(){if(!d){d=!0;var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style.boxSizing="border-box";var i=document.body||document.documentElement;i.appendChild(e);var o=n(e);s=200==Math.round(t(o.width)),r.isBoxSizeOuter=s,i.removeChild(e)}}function r(e){if(o(),"string"==typeof e&&(e=document.querySelector(e)),e&&"object"==typeof e&&e.nodeType){var r=n(e);if("none"==r.display)return i();var a={};a.width=e.offsetWidth,a.height=e.offsetHeight;for(var d=a.isBorderBox="border-box"==r.boxSizing,l=0;u>l;l++){var c=h[l],f=r[c],m=parseFloat(f);a[c]=isNaN(m)?0:m}var p=a.paddingLeft+a.paddingRight,g=a.paddingTop+a.paddingBottom,y=a.marginLeft+a.marginRight,v=a.marginTop+a.marginBottom,_=a.borderLeftWidth+a.borderRightWidth,z=a.borderTopWidth+a.borderBottomWidth,E=d&&s,b=t(r.width);b!==!1&&(a.width=b+(E?0:p+_));var x=t(r.height);return x!==!1&&(a.height=x+(E?0:g+z)),a.innerWidth=a.width-(p+_),a.innerHeight=a.height-(g+z),a.outerWidth=a.width+y,a.outerHeight=a.height+v,a}}var s,a="undefined"==typeof console?e:function(t){console.error(t)},h=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],u=h.length,d=!1;return r}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("desandro-matches-selector/matches-selector",e):"object"==typeof module&&module.exports?module.exports=e():t.matchesSelector=e()}(window,function(){"use strict";var t=function(){var t=window.Element.prototype;if(t.matches)return"matches";if(t.matchesSelector)return"matchesSelector";for(var e=["webkit","moz","ms","o"],i=0;is?"round":"floor";r=Math[a](r),this.cols=Math.max(r,1)},n.getContainerWidth=function(){var t=this._getOption("fitWidth"),i=t?this.element.parentNode:this.element,n=e(i);this.containerWidth=n&&n.innerWidth},n._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,i=e&&1>e?"round":"ceil",n=Math[i](t.size.outerWidth/this.columnWidth);n=Math.min(n,this.cols);for(var o=this.options.horizontalOrder?"_getHorizontalColPosition":"_getTopColPosition",r=this[o](n,t),s={x:this.columnWidth*r.col,y:r.y},a=r.y+t.size.outerHeight,h=n+r.col,u=r.col;h>u;u++)this.colYs[u]=a;return s},n._getTopColPosition=function(t){var e=this._getTopColGroup(t),i=Math.min.apply(Math,e);return{col:e.indexOf(i),y:i}},n._getTopColGroup=function(t){if(2>t)return this.colYs;for(var e=[],i=this.cols+1-t,n=0;i>n;n++)e[n]=this._getColGroupY(n,t);return e},n._getColGroupY=function(t,e){if(2>e)return this.colYs[t];var i=this.colYs.slice(t,t+e);return Math.max.apply(Math,i)},n._getHorizontalColPosition=function(t,e){var i=this.horizontalColIndex%this.cols,n=t>1&&i+t>this.cols;i=n?0:i;var o=e.size.outerWidth&&e.size.outerHeight;return this.horizontalColIndex=o?i+t:this.horizontalColIndex,{col:i,y:this._getColGroupY(i,t)}},n._manageStamp=function(t){var i=e(t),n=this._getElementOffset(t),o=this._getOption("originLeft"),r=o?n.left:n.right,s=r+i.outerWidth,a=Math.floor(r/this.columnWidth);a=Math.max(0,a);var h=Math.floor(s/this.columnWidth);h-=s%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var u=this._getOption("originTop"),d=(u?n.top:n.bottom)+i.outerHeight,l=a;h>=l;l++)this.colYs[l]=Math.max(d,this.colYs[l])},n._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this._getOption("fitWidth")&&(t.width=this._getContainerFitWidth()),t},n._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},n.needsResizeLayout=function(){var t=this.containerWidth;return this.getContainerWidth(),t!=this.containerWidth},i}); \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css deleted file mode 100644 index e926403..0000000 --- a/app/assets/stylesheets/application.css +++ /dev/null @@ -1,78 +0,0 @@ -body { - padding: 20px; - font-family: 'Inconsolata', monospace; - background-color: #fff; - color: #4c4e4d; -} - -a{ - text-decoration: none; - color: #4c4e4d; - font-size: 17px; - font-weight: bold; -} -a:hover { - color:black; -} - -#all{ - width: 900px; - margin: 0px auto; - margin-top: 35px; -} - -.tags{ - font-size: 13px; - margin: 5px 0px 5px 0px; -} -h2{ - margin: 0px -} -h3{ - text-align: right; - font-size:15px; -} - -#topo{ - background-color: #8bf712; - width: 100%; - text-align: center; - display: inline-block; - top: 0px; - left: 0px; - position: absolute; - font-size: 10px; - height: 35px; - border-bottom: 1px solid lightgray -} - -.card{ - /* color: black; */ - border-top: 1px solid lightgray; - padding-top: 10px; - padding-bottom: 10px; - /* width: 200px; */ - /* float: left; - border: 2px solid green; - margin: 10px; - padding: 25px; - font-size: 22px; - text-align: center; - box-shadow: 8px 8px 3px #1a54027a; */ -} -.date{ - font-size: 13px; - color: gray; - padding-top: 10px -} - - -#nav{ - display: inline-block; - width: 100%; - text-align: center; - padding: 10px; - font-size: 19px; - background-color: #8bf712; - border: 1px solid gray; -} diff --git a/app/controllers/page_controller.rb b/app/controllers/page_controller.rb deleted file mode 100644 index 8e0556c..0000000 --- a/app/controllers/page_controller.rb +++ /dev/null @@ -1,11 +0,0 @@ -class PageController < ApplicationController - - def home - @informativos = Informativo.order("data_inc desc").page(params[:page] || 1) - end - - def informativo - @informativo = Informativo.find(params[:id]) - end - -end diff --git a/app/models/informativo.rb b/app/models/informativo.rb deleted file mode 100644 index 73dfc53..0000000 --- a/app/models/informativo.rb +++ /dev/null @@ -1,15 +0,0 @@ -class Informativo < ApplicationRecord - self.table_name = "informativo" - paginates_per 10 - - def tags - tags = [] - tags << self.tag1 - tags << self.tag2 - tags << self.tag3 - tags = tags.uniq.join(", ").downcase - tags.chop! if tags[tags.size-1]=="," - tags - end - -end diff --git a/app/views/layouts/application.haml b/app/views/layouts/application.haml deleted file mode 100644 index ff0f4f9..0000000 --- a/app/views/layouts/application.haml +++ /dev/null @@ -1,17 +0,0 @@ -!!! -%html - %head - %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/ - %title Ambiente Já! - = csrf_meta_tags - = csp_meta_tag - = stylesheet_link_tag "https://fonts.googleapis.com/css?family=Inconsolata&display=swap" - = stylesheet_link_tag 'application', media: 'all' - = javascript_include_tag 'application' - - %body - - #all - #topo - = link_to (image_tag "logo.png"), "/" - = yield diff --git a/app/views/page/home.haml b/app/views/page/home.haml deleted file mode 100644 index 1fb288c..0000000 --- a/app/views/page/home.haml +++ /dev/null @@ -1,11 +0,0 @@ -%h3= "#{@informativos.count} informativos" - -#infos - - @informativos.each do |i| - .card - %span.link= link_to i.titulo.html_safe, CGI.unescapeHTML("/informativo/#{i.id}") - %p.tags= i.tags - .date= "#{i.data_inc} | #{i.operador_inc.downcase.capitalize}" - -#nav - = will_paginate @informativos diff --git a/app/views/page/informativo.haml b/app/views/page/informativo.haml deleted file mode 100644 index 59f4af0..0000000 --- a/app/views/page/informativo.haml +++ /dev/null @@ -1,15 +0,0 @@ -// :javascript -// $(document).ready(function(){ -// $("a").each(function(a){ -// a.href = a.href.replace("http://localhost:3000/informativo/%22", "").replace("\"", ""); -// }) -// }); - -#todo - %h2= @informativo.titulo.html_safe - .tags= @informativo.tags - .date= @informativo.data_inc - -# %p= "Por #{@informativo.operador_inc}" - != @informativo.Descricao.gsub(""", "\"") - -# %hr - -# != ap @informativo diff --git a/bin/rake b/bin/rake deleted file mode 100755 index 1724048..0000000 --- a/bin/rake +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/bin/yarn b/bin/yarn deleted file mode 100755 index 460dd56..0000000 --- a/bin/yarn +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env ruby -APP_ROOT = File.expand_path('..', __dir__) -Dir.chdir(APP_ROOT) do - begin - exec "yarnpkg", *ARGV - rescue Errno::ENOENT - $stderr.puts "Yarn executable was not detected in the system." - $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" - exit 1 - end -end diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc deleted file mode 100644 index 7eee4ae..0000000 --- a/config/credentials.yml.enc +++ /dev/null @@ -1 +0,0 @@ -ZaWn2LkcPpkh1b4NwpoKP10kmIxshga41mh90XZx9Rm8DjmvKwRzMl3yNTyetWrIRmqNxzf0rqtvXoWli1GnEupvCCs9cuX4awxP8TS7AXQsXORhoadZGIfEe8YbsqfswFatIcLCzKCep7mEVn2FoElfXpwYNbxjkTEJGNLouaHJnFsfYt5WtldaDDNMV58oBEUupOc0MMRGQv29bhtATQkwSIdfvA0l6wlKsygNZNcC1ehF6vnFYTfKsQIJEFQzMkdlwfC/NW/ulb7XAHGaBHWMgvct7ApceOH/DYZQkmnzDgxlOpyH+/IArdE8yGuwnrRrIItnnrJBMSJPNxr1KPzlOvizQ3XXq1NM1lvwNv9XN4gSyhlh/bjWm0QrS1DEI+/HzcEeFIG+bpPkQ+7hoiyyLWi/wTL/Gyki--CIu5O4MaiFuFVxEi--dQNVGD340dDibi8ojYyHGQ== \ No newline at end of file diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb deleted file mode 100644 index 89d2efa..0000000 --- a/config/initializers/application_controller_renderer.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# ActiveSupport::Reloader.to_prepare do -# ApplicationController.renderer.defaults.merge!( -# http_host: 'example.org', -# https: false -# ) -# end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cd..0000000 --- a/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb deleted file mode 100644 index d3bcaa5..0000000 --- a/config/initializers/content_security_policy.rb +++ /dev/null @@ -1,25 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy - -# Rails.application.config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https - -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" -# end - -# If you are using UJS then enable automatic nonce generation -# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } - -# Report CSP violations to a specified URI -# For further information see the following documentation: -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only -# Rails.application.config.content_security_policy_report_only = true diff --git a/config/puma.rb b/config/puma.rb deleted file mode 100644 index ada8926..0000000 --- a/config/puma.rb +++ /dev/null @@ -1,34 +0,0 @@ -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum; this matches the default thread size of Active Record. -# -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } -threads threads_count, threads_count - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. -# -port ENV.fetch("PORT") { 3333 } - -# Specifies the `environment` that Puma will run in. -# -environment ENV.fetch("RAILS_ENV") { "production" } - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked webserver processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. -# -# preload_app! - -# Allow puma to be restarted by `rails restart` command. -plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb deleted file mode 100644 index 8c6d477..0000000 --- a/config/routes.rb +++ /dev/null @@ -1,10 +0,0 @@ -Rails.application.routes.draw do - devise_for :admin_users, ActiveAdmin::Devise.config - ActiveAdmin.routes(self) - # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - - root to: "page#home" - - -get '/informativo/:id', to: 'page#informativo' -end diff --git a/config/spring.rb b/config/spring.rb deleted file mode 100644 index 9fa7863..0000000 --- a/config/spring.rb +++ /dev/null @@ -1,6 +0,0 @@ -%w[ - .ruby-version - .rbenv-vars - tmp/restart.txt - tmp/caching-dev.txt -].each { |path| Spring.watch(path) } diff --git a/config/storage.yml b/config/storage.yml deleted file mode 100644 index d32f76e..0000000 --- a/config/storage.yml +++ /dev/null @@ -1,34 +0,0 @@ -test: - service: Disk - root: <%= Rails.root.join("tmp/storage") %> - -local: - service: Disk - root: <%= Rails.root.join("storage") %> - -# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) -# amazon: -# service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> -# region: us-east-1 -# bucket: your_own_bucket - -# Remember not to checkin your GCS keyfile to a repository -# google: -# service: GCS -# project: your_project -# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> -# bucket: your_own_bucket - -# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) -# microsoft: -# service: AzureStorage -# storage_account_name: your_account_name -# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> -# container: your_container_name - -# mirror: -# service: Mirror -# primary: local -# mirrors: [ amazon, google, microsoft ] diff --git a/current/.gitignore b/current/.gitignore new file mode 100644 index 0000000..52d69b5 --- /dev/null +++ b/current/.gitignore @@ -0,0 +1,12 @@ +/.bundle +/vendor +/log/* +/tmp/* +/config/database.yml +/config/master.key +/public/assets +.byebug_history +.DS_Store +/db/*.sqlite3 +/db/*.sqlite3-shm +/db/*.sqlite3-wal diff --git a/current/.ruby-version b/current/.ruby-version new file mode 100644 index 0000000..5ae69bd --- /dev/null +++ b/current/.ruby-version @@ -0,0 +1 @@ +3.2.5 diff --git a/current/Gemfile b/current/Gemfile new file mode 100644 index 0000000..c75f480 --- /dev/null +++ b/current/Gemfile @@ -0,0 +1,30 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +# core +gem 'rails', '~> 8.0' +gem 'puma', '~> 6.0' +gem 'sqlite3', '>= 2.0' + +#assets +gem 'sprockets-rails' +gem 'sassc-rails' +gem 'bootsnap', '>= 1.1.0', require: false +gem 'redcarpet' +gem 'trix-rails', require: 'trix' +gem 'haml-rails' +gem 'will_paginate' + +#admin +gem 'devise' +gem 'activeadmin' +gem 'activeadmin_addons' + +group :development do + gem 'listen', '>= 3.0.5' + gem 'byebug' + gem 'awesome_print' + gem 'web-console', '>= 3.3.0' + gem 'spring' + gem 'spring-watcher-listen' +end diff --git a/current/Gemfile.lock b/current/Gemfile.lock new file mode 100644 index 0000000..f5d4d63 --- /dev/null +++ b/current/Gemfile.lock @@ -0,0 +1,383 @@ +GEM + remote: https://rubygems.org/ + specs: + action_text-trix (2.1.19) + railties + actioncable (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + mail (>= 2.8.0) + actionmailer (8.1.3) + actionpack (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activesupport (= 8.1.3) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (8.1.3) + actionview (= 8.1.3) + activesupport (= 8.1.3) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + useragent (~> 0.16) + actiontext (8.1.3) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (8.1.3) + activesupport (= 8.1.3) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + active_material (1.5.2) + activeadmin (3.5.1) + arbre (~> 1.2, >= 1.2.1) + csv + formtastic (>= 3.1) + formtastic_i18n (>= 0.4) + inherited_resources (~> 1.7) + jquery-rails (>= 4.2) + kaminari (>= 1.2.1) + railties (>= 6.1) + ransack (>= 4.0) + activeadmin_addons (1.10.2) + active_material (~> 1.5) + railties + redcarpet + require_all + sassc + sassc-rails + xdan-datetimepicker-rails (~> 2.5.1) + activejob (8.1.3) + activesupport (= 8.1.3) + globalid (>= 0.3.6) + activemodel (8.1.3) + activesupport (= 8.1.3) + activerecord (8.1.3) + activemodel (= 8.1.3) + activesupport (= 8.1.3) + timeout (>= 0.4.0) + activestorage (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activesupport (= 8.1.3) + marcel (~> 1.0) + activesupport (8.1.3) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + arbre (1.7.0) + activesupport (>= 3.0.0) + ruby2_keywords (>= 0.0.2) + awesome_print (1.9.2) + base64 (0.3.0) + bcrypt (3.1.22) + bigdecimal (4.1.2) + bindex (0.8.1) + bootsnap (1.24.6) + msgpack (~> 1.2) + builder (3.3.0) + byebug (13.0.0) + reline (>= 0.6.0) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + crass (1.0.6) + csv (3.3.5) + date (3.5.1) + devise (5.0.4) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 7.0) + responders + warden (~> 1.2.3) + drb (2.2.3) + erb (6.0.4) + erubi (1.13.1) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + formtastic (6.0.0) + actionpack (>= 7.2.0) + formtastic_i18n (0.7.0) + globalid (1.3.0) + activesupport (>= 6.1) + haml (7.2.0) + temple (>= 0.8.2) + thor + tilt + haml-rails (3.0.0) + actionpack (>= 5.1) + activesupport (>= 5.1) + haml (>= 4.0.6) + railties (>= 5.1) + has_scope (0.9.0) + actionpack (>= 7.0) + activesupport (>= 7.0) + i18n (1.15.1) + concurrent-ruby (~> 1.0) + inherited_resources (1.14.0) + actionpack (>= 6.0) + has_scope (>= 0.6) + railties (>= 6.0) + responders (>= 2) + io-console (0.8.2) + irb (1.18.0) + pp (>= 0.6.0) + prism (>= 1.3.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + jquery-rails (4.6.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + json (2.19.9) + kaminari (1.2.2) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) + actionview + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) + activerecord + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + loofah (2.25.1) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.9.0) + logger + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.2.1) + mini_mime (1.1.5) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + msgpack (1.8.3) + net-imap (0.6.4.1) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.5.1) + net-protocol + nio4r (2.7.5) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) + racc (~> 1.4) + orm_adapter (0.5.0) + pp (0.6.3) + prettyprint + prettyprint (0.2.0) + prism (1.9.0) + psych (5.4.0) + date + stringio + puma (6.6.1) + nio4r (~> 2.0) + racc (1.8.1) + rack (3.2.6) + rack-session (2.1.2) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rack-test (2.2.0) + rack (>= 1.3) + rackup (2.3.1) + rack (>= 3) + rails (8.1.3) + actioncable (= 8.1.3) + actionmailbox (= 8.1.3) + actionmailer (= 8.1.3) + actionpack (= 8.1.3) + actiontext (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activemodel (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + bundler (>= 1.15.0) + railties (= 8.1.3) + rails-dom-testing (2.3.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + railties (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) + irb (~> 1.13) + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) + zeitwerk (~> 2.6) + rake (13.4.2) + ransack (4.4.1) + activerecord (>= 7.2) + activesupport (>= 7.2) + i18n + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rdoc (7.2.0) + erb + psych (>= 4.0.0) + tsort + redcarpet (3.6.1) + reline (0.6.3) + io-console (~> 0.5) + require_all (3.0.0) + responders (3.2.0) + actionpack (>= 7.0) + railties (>= 7.0) + ruby2_keywords (0.0.5) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + securerandom (0.4.1) + spring (4.6.0) + spring-watcher-listen (2.1.0) + listen (>= 2.7, < 4.0) + spring (>= 4) + sprockets (4.2.2) + concurrent-ruby (~> 1.0) + logger + rack (>= 2.2.4, < 4) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) + sprockets (>= 3.0.0) + sqlite3 (2.9.5-aarch64-linux-gnu) + sqlite3 (2.9.5-aarch64-linux-musl) + sqlite3 (2.9.5-arm-linux-gnu) + sqlite3 (2.9.5-arm-linux-musl) + sqlite3 (2.9.5-arm64-darwin) + sqlite3 (2.9.5-x86_64-darwin) + sqlite3 (2.9.5-x86_64-linux-gnu) + sqlite3 (2.9.5-x86_64-linux-musl) + stringio (3.2.0) + temple (0.10.4) + thor (1.5.0) + tilt (2.7.0) + timeout (0.6.1) + trix-rails (2.4.0) + rails (> 4.1) + tsort (0.2.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + uri (1.1.1) + useragent (0.16.11) + warden (1.2.9) + rack (>= 2.0.9) + web-console (4.3.0) + actionview (>= 8.0.0) + bindex (>= 0.4.0) + railties (>= 8.0.0) + websocket-driver (0.8.1) + base64 + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + will_paginate (4.0.1) + xdan-datetimepicker-rails (2.5.4) + jquery-rails + rails (>= 3.2.16) + zeitwerk (2.8.2) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + activeadmin + activeadmin_addons + awesome_print + bootsnap (>= 1.1.0) + byebug + devise + haml-rails + listen (>= 3.0.5) + puma (~> 6.0) + rails (~> 8.0) + redcarpet + sassc-rails + spring + spring-watcher-listen + sprockets-rails + sqlite3 (>= 2.0) + trix-rails + web-console (>= 3.3.0) + will_paginate + +BUNDLED WITH + 2.5.23 diff --git a/current/README.md b/current/README.md new file mode 100644 index 0000000..5fe32c5 --- /dev/null +++ b/current/README.md @@ -0,0 +1,105 @@ +# Ambiente JA + +Portal de notícias ambientais que operou de 2001 a 2015, reunindo **170.273 artigos** em português brasileiro sobre meio ambiente, sustentabilidade e políticas públicas. + +--- + +## O que é + +O Ambiente JA foi um agregador de notícias ambientais com curadoria editorial. O acervo cobre 14,8 anos de cobertura jornalística nacional, estadual e internacional — da Rio+10 às vésperas do Acordo de Paris, passando por toda a era de ouro da blogosfera ambiental brasileira dos anos 2000. + +Cada artigo possui: +- **Título e corpo completo** (HTML e Markdown) +- **Classificação por tema** (30 temas como Legislação, Mudanças Climáticas, Fauna e Flora, Energia, Poluição, etc.) +- **Abrangência** — Nacional (46%), Estadual (30%), Internacional (24%) +- **Data de publicação** +- **Tags semânticas** para navegação e busca + +Os artigos foram coletados de fontes como agências de notícias, jornais, sites especializados, ONGs, universidades e órgãos públicos. + +--- + +## O acervo em números + +| Métrica | Valor | +|---|---| +| Total de artigos | 170.273 | +| Período | jan/2001 — out/2015 | +| Pico de cobertura | 2007–2008 (~25 mil artigos/ano) | +| Temas principais | 30 | +| Artigos com tema atribuído | 143.411 (84,2%) | + +### Temas com mais artigos + +| # | Tema | Artigos | +|---|---|---| +| 1 | Legislação e Governo | 27.835 | +| 2 | Fauna e Flora | 14.086 | +| 3 | Mudanças Climáticas | 8.645 | +| 4 | Energia Renovável | 8.544 | +| 5 | Água | 6.435 | +| 6 | Ciência e Tecnologia | 6.277 | +| 7 | Resíduos/Lixo | 6.141 | +| 8 | Saúde e Meio Ambiente | 6.088 | +| 9 | Agropecuária | 4.973 | +| 10 | Crimes Ambientais | 4.823 | + +Resumos detalhados de cada tema estão disponíveis em [`resumo/`](../resumo/). + +--- + +## Stack + +- **Ruby 3.2 / Rails 8.1** — aplicação web com ActiveAdmin +- **SQLite3** — banco de dados principal (migrado do MySQL original) +- **MySQL** (original) — dump disponível como `dump.sql` (775 MB) +- **DuckDB** — conversão parcial para análise local ([`ambienteja.duckdb`](../ambienteja.duckdb)) +- **HAML + SASS + jQuery** — frontend minimalista +- **Puma** — servidor web + +## Desenvolvimento + +```bash +bundle install +rails db:schema:load +rails server +``` + +### Testes + +```bash +rails test +``` + +Cobertura: models (`Informativo`, `Tema`, `Tag`) e rotas públicas (`home`, `busca`, `tag`, `tema`, `informativo`). + +--- + +## Estrutura do projeto + +``` +ambienteja/ +├── current/ # Aplicação Rails +│ ├── app/ # Models, controllers, views, assets +│ ├── db/ # Schema e migrations +│ └── config/ # Rotas, deploy, Puma +├── dump.sql # Dump MySQL completo (774,5 MB) +├── ambienteja.duckdb # Banco DuckDB com tabelas auxiliares +├── mysql_to_duckdb.py # Script de conversão MySQL → DuckDB +└── resumo/ # Resumos textuais por tema (Markdown) +``` + +--- + +## Contexto histórico + +O site foi ao ar em 2001, no início da internet comercial brasileira, quando a cobertura ambiental ainda era fragmentada. Durante seus 15 anos de operação, testemunhou e registrou: + +- A ascensão do tema mudanças climáticas (Protocolo de Kyoto, COPs, IPCC) +- O debate sobre transgênicos e a expansão do agronegócio +- A criação e implementação da Política Nacional de Resíduos Sólidos +- O boom dos biocombustíveis e a controvérsia food vs fuel +- Grandes desastres (tsunami de 2004, Katrina, Fukushima, Mariana) +- A política ambiental durante os governos FHC, Lula e Dilma + +O acervo é um registro histórico da consciência ambiental brasileira nas primeiras décadas do século XXI. diff --git a/Rakefile b/current/Rakefile similarity index 100% rename from Rakefile rename to current/Rakefile diff --git a/app/admin/admin_users.rb b/current/app/admin/admin_users.rb similarity index 100% rename from app/admin/admin_users.rb rename to current/app/admin/admin_users.rb diff --git a/app/admin/dashboard.rb b/current/app/admin/dashboard.rb similarity index 90% rename from app/admin/dashboard.rb rename to current/app/admin/dashboard.rb index c61d14d..058b0c5 100644 --- a/app/admin/dashboard.rb +++ b/current/app/admin/dashboard.rb @@ -1,5 +1,6 @@ ActiveAdmin.register_page "Dashboard" do - menu priority: 1, label: proc { I18n.t("active_admin.dashboard") } + menu false + # menu priority: 1, label: proc { I18n.t("active_admin.dashboard") } content title: proc { I18n.t("active_admin.dashboard") } do div class: "blank_slate_container", id: "dashboard_default_message" do diff --git a/current/app/admin/informativos.rb b/current/app/admin/informativos.rb new file mode 100644 index 0000000..b5e4a62 --- /dev/null +++ b/current/app/admin/informativos.rb @@ -0,0 +1,37 @@ +ActiveAdmin.register Informativo do + permit_params :Idinformativo, :titulo, :Descricao, :Idtipo, :Abrangencia, :Datainc, :tema1, :subtema1, :tema2, :subtema2, :tema3, :subtema3, :tema4, :subtema4, :operador_inc, :operador_alt, :markdown, tag_ids: [] + + index do + selectable_column + column :Idinformativo + column :titulo + column :Abrangencia + column :Datainc + column :operador_inc + actions + end + + filter :titulo + filter :operador_inc + + form do |f| + f.inputs 'Informativo' do + f.input :Datainc, as: :date_time_picker + f.input :titulo + f.input :operador_inc + f.input :tag_ids, as: :tags, collection: Tag.all, display_name: :nome + f.trix_editor :Descricao + end + actions + end + + show do + attributes_table do + row :titulo + # row :image do |ad| + # image_tag ad.image.url + # end + end + end + +end diff --git a/current/app/admin/tags.rb b/current/app/admin/tags.rb new file mode 100644 index 0000000..9dd1369 --- /dev/null +++ b/current/app/admin/tags.rb @@ -0,0 +1,18 @@ +ActiveAdmin.register Tag do + + # See permitted parameters documentation: + # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters + # + # Uncomment all parameters which should be permitted for assignment + # + # permit_params :nome, :param, :count + # + # or + # + # permit_params do + # permitted = [:nome, :param, :count] + # permitted << :other if params[:action] == 'create' && current_user.admin? + # permitted + # end + +end diff --git a/current/app/admin/temas.rb b/current/app/admin/temas.rb new file mode 100644 index 0000000..72fb26e --- /dev/null +++ b/current/app/admin/temas.rb @@ -0,0 +1,18 @@ +ActiveAdmin.register Tema do + + # See permitted parameters documentation: + # https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#setting-up-strong-parameters + # + # Uncomment all parameters which should be permitted for assignment + # + # permit_params :reg, :cod_tema, :cod_tema_sub, :tema, :ativo, :padrao, :count, :param + # + # or + # + # permit_params do + # permitted = [:reg, :cod_tema, :cod_tema_sub, :tema, :ativo, :padrao, :count, :param] + # permitted << :other if params[:action] == 'create' && current_user.admin? + # permitted + # end + +end diff --git a/app/assets/config/manifest.js b/current/app/assets/config/manifest.js similarity index 100% rename from app/assets/config/manifest.js rename to current/app/assets/config/manifest.js diff --git a/current/app/assets/fonts/WildGrowth.ttf b/current/app/assets/fonts/WildGrowth.ttf new file mode 100644 index 0000000..65867b8 Binary files /dev/null and b/current/app/assets/fonts/WildGrowth.ttf differ diff --git a/current/app/assets/fonts/wildgrowth-webfont.woff b/current/app/assets/fonts/wildgrowth-webfont.woff new file mode 100644 index 0000000..45883d2 Binary files /dev/null and b/current/app/assets/fonts/wildgrowth-webfont.woff differ diff --git a/current/app/assets/fonts/wildgrowth-webfont.woff2 b/current/app/assets/fonts/wildgrowth-webfont.woff2 new file mode 100644 index 0000000..af2d239 Binary files /dev/null and b/current/app/assets/fonts/wildgrowth-webfont.woff2 differ diff --git a/app/assets/images/.keep b/current/app/assets/images/.keep similarity index 100% rename from app/assets/images/.keep rename to current/app/assets/images/.keep diff --git a/current/app/assets/images/bg.png b/current/app/assets/images/bg.png new file mode 100644 index 0000000..28fe9be Binary files /dev/null and b/current/app/assets/images/bg.png differ diff --git a/current/app/assets/images/favicon.ico b/current/app/assets/images/favicon.ico new file mode 100644 index 0000000..50c4b32 Binary files /dev/null and b/current/app/assets/images/favicon.ico differ diff --git a/current/app/assets/images/logo.png b/current/app/assets/images/logo.png new file mode 100644 index 0000000..c63164d Binary files /dev/null and b/current/app/assets/images/logo.png differ diff --git a/current/app/assets/javascripts/active_admin.js b/current/app/assets/javascripts/active_admin.js new file mode 100644 index 0000000..79c71b1 --- /dev/null +++ b/current/app/assets/javascripts/active_admin.js @@ -0,0 +1,3 @@ +//= require trix +//= require active_admin/base +//= require activeadmin_addons/all diff --git a/app/assets/javascripts/admin/active_admin.js b/current/app/assets/javascripts/admin/active_admin.js similarity index 100% rename from app/assets/javascripts/admin/active_admin.js rename to current/app/assets/javascripts/admin/active_admin.js diff --git a/app/assets/javascripts/application.js b/current/app/assets/javascripts/application.js similarity index 84% rename from app/assets/javascripts/application.js rename to current/app/assets/javascripts/application.js index bec4452..638372b 100644 --- a/app/assets/javascripts/application.js +++ b/current/app/assets/javascripts/application.js @@ -10,12 +10,8 @@ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // -//= require_tree . - +//= require jquery-3.4.0.min $(document).ready(function(){ - // var msnry = new Masonry( '#infos', { - // columnWidth: 180, - // itemSelector: '.card' - // }); + console.log("- by http://extrapolo.com -") }); diff --git a/app/assets/javascripts/jquery-3.4.0.min.js b/current/app/assets/javascripts/jquery-3.4.0.min.js similarity index 100% rename from app/assets/javascripts/jquery-3.4.0.min.js rename to current/app/assets/javascripts/jquery-3.4.0.min.js diff --git a/app/assets/stylesheets/active_admin.scss b/current/app/assets/stylesheets/active_admin.scss similarity index 85% rename from app/assets/stylesheets/active_admin.scss rename to current/app/assets/stylesheets/active_admin.scss index d3c61f3..99d94d5 100644 --- a/app/assets/stylesheets/active_admin.scss +++ b/current/app/assets/stylesheets/active_admin.scss @@ -1,3 +1,4 @@ +@import 'activeadmin_addons/all'; // SASS variable overrides must be declared before loading up Active Admin's styles. // // To view the variables that Active Admin provides, take a look at @@ -11,6 +12,11 @@ @import "active_admin/mixins"; @import "active_admin/base"; +//*= require trix +.trix-button--icon-attach{ + display: none +} + // Overriding any non-variable SASS must be done after the fact. // For example, to change the default status-tag color: // diff --git a/current/app/assets/stylesheets/application.css b/current/app/assets/stylesheets/application.css new file mode 100644 index 0000000..9f7c1c9 --- /dev/null +++ b/current/app/assets/stylesheets/application.css @@ -0,0 +1,205 @@ +p{ + margin: 0px; + padding: 0px; +} + +@font-face { + font-family: 'wild'; + src: url('wildgrowth-webfont.woff2') format('woff2'), + url('wildgrowth-webfont.woff') format('woff'); + font-weight: normal; + font-style: normal; +} + +body { + padding: 20px; + font-family: 'Fira Sans', monospace; + background-color: #fff; + color: #4c4e4d; + background-image: url(bg.png); + background-repeat: repeat; + background-attachment: fixed; +} + +a{ + text-decoration: none; + color: #4c4e4d; +} +a:hover { + color:black; +} + +#temas{ + display: inline-block; + padding-right: 40px; + float: left; + width: 300px +} + +.tema{ + display: block; + background-color: #12d612d1; + margin: 5px; + padding: 2px; + padding-left: 10px; + padding-right: 10px; + color: black; + font-size: 14px; + padding-top: 4px; + text-decoration: none; +} +.tema:hover{ + color: white; + background-color: green; + cursor: pointer; +} +.content{ + display: contents; + color: black; +} +.content:hover{ + color: white +} +.right{ + float: right; + padding-left: 20px; +} +.logo{ + font-family: "wild"; + font-size: 30px; + padding-left: 50px; + letter-spacing: 3px; + text-shadow: 9px 5px 5px #0061226e; + user-select: none; + font-weight: bold; +} +.logo_img{ + width: 215px; + padding: 3px 0px 0px 15px; +} +.texto{ + font-size: 14px; + padding: 10px 10px 10px 0px; + background-color: white; + margin-top: 15px; + /* padding: 10px; */ + border: 1px solid #80808036; + padding: 15px; + margin-bottom: 15px; + box-shadow: 5px 4px 14px 0px #80808038; +} +.texto>p{ + margin-bottom: 10px; + line-height: 18px +} +#busca{ + display: inline-block; + float: right; + padding-right: 25px; + padding-top: 12px; +} +.busca-btn{ + padding: 3px; + border: 1px; + font-weight: 900; + width: 25px; + color: white; + background-color: #006122; +} +.busca-input{ + font-family: 'Fira Sans'; + padding: 3px; + border: 1px; + background-color: #33f739b0; + width: 190px; +} +#all{ + width: 900px; + margin: 0px auto; + margin-top: 50px; +} +.link{ + background-color: #ffdb00; + padding: 4px; + line-height: 33px; + display: inline; + font-weight: bold; +} +.tag{ + display: inline-block; + padding: 4px; + margin: 3px; + background-color: #d8d4d4; + font-size: 12px; +} +#tags{ + text-align: center; + padding: 10px 0px 25px 0px; +} +#informativos{ + display: flow-root; +} +.tags{ + margin: 2px; + display: inline-flex; + background-color: #d8d4d4b8; + font-size: 12px; + padding: 2px; + font-weight: normal; +} +h2{ + margin: 0px +} +h3{ + text-align: right; + font-size:15px; +} + +#topo{ + background-image: linear-gradient(to right, #47a91c, #066f09); + width: 100%; + display: inline-block; + top: 0px; + left: 0px; + position: absolute; + height: 45px; + border-bottom: 1px solid lightgray +} + +.card{ + /* color: black; */ + width: 100%; + border-top: 1px solid lightgray; + padding-top: 10px; + display: inline-block; + background-color: white; + margin-bottom: 8px +} +.date{ + font-size: 12px; + color: gray; + padding-top: 10px; + background-color: white; + display: table; +} + +#nav{ + display: inline-block; + width: 100%; + text-align: center; + padding: 10px; + font-size: 19px; + background-image: linear-gradient(to right, #33f739 , #329c04); +} + +#baixo{ + background-color: #d3d3d3bf; + font-size: 11px; + width: 100%; + /* bottom: 0px; */ + position: fixed; + bottom: 0px; + left: 0px; + padding: 4px; + text-align: center; +} diff --git a/app/controllers/application_controller.rb b/current/app/controllers/application_controller.rb similarity index 100% rename from app/controllers/application_controller.rb rename to current/app/controllers/application_controller.rb diff --git a/app/controllers/concerns/.keep b/current/app/controllers/concerns/.keep similarity index 100% rename from app/controllers/concerns/.keep rename to current/app/controllers/concerns/.keep diff --git a/current/app/controllers/page_controller.rb b/current/app/controllers/page_controller.rb new file mode 100644 index 0000000..438c7f3 --- /dev/null +++ b/current/app/controllers/page_controller.rb @@ -0,0 +1,41 @@ +class PageController < ApplicationController +# caches_page :home, :informativo + + def home + @informativos = Informativo.order("Datainc desc").page(params[:page] || 1) + end + + def informativo + @informativo = Informativo.find(params[:id]) + @title = @informativo.titulo + end + + def tag + @tag = Tag.find_by(param: params[:param]) + @informativos = @tag.informativos.page(params[:page] || 1) + @title = @tag.nome + render "list" + end + + def tema + @tema = Tema.find_by(param: params[:param]) + @informativos = @tema.informativos.page(params[:page] || 1) + @title = @tema.padrao + render "list" + end + + def busca + @search = params[:q] + terms = @search.to_s.split(/\s+/) + scope = Informativo.all + terms.each do |term| + clean = term.gsub(/[+\-*"()~<>]/, "") + next if clean.blank? + scope = scope.where("titulo LIKE ?", "%#{clean}%") + end + @informativos = scope.order("Datainc desc").page(params[:page] || 1) + @title = "Busca: #{@search}" + render "list" + end + +end diff --git a/app/helpers/application_helper.rb b/current/app/helpers/application_helper.rb similarity index 100% rename from app/helpers/application_helper.rb rename to current/app/helpers/application_helper.rb diff --git a/app/models/admin_user.rb b/current/app/models/admin_user.rb similarity index 54% rename from app/models/admin_user.rb rename to current/app/models/admin_user.rb index 3c851a1..de29488 100644 --- a/app/models/admin_user.rb +++ b/current/app/models/admin_user.rb @@ -3,4 +3,8 @@ class AdminUser < ApplicationRecord # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :recoverable, :rememberable, :validatable + # Include default devise modules. Others available are: + # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable + devise :database_authenticatable, + :recoverable, :rememberable, :validatable end diff --git a/app/models/application_record.rb b/current/app/models/application_record.rb similarity index 100% rename from app/models/application_record.rb rename to current/app/models/application_record.rb diff --git a/app/models/concerns/.keep b/current/app/models/concerns/.keep similarity index 100% rename from app/models/concerns/.keep rename to current/app/models/concerns/.keep diff --git a/current/app/models/informativo.rb b/current/app/models/informativo.rb new file mode 100644 index 0000000..3f1276a --- /dev/null +++ b/current/app/models/informativo.rb @@ -0,0 +1,27 @@ +class Informativo < ApplicationRecord + self.table_name = "informativo" + self.primary_key = "Idinformativo" + has_and_belongs_to_many :tags + + before_save :meta + + def temas + Tema.where("cod_tema = #{self.tema1} or cod_tema = #{self.tema2} or cod_tema = #{self.tema3}").map(&:tema) + end + + def as_markdown + html = HTMLPage.new :contents => self.Descricao + html.markdown + end + + def to_html + Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render(self.markdown) + end + + private + def meta + #expire_page action: "show", id: params[:list][:id] + self.Datainc = DateTime.now unless self.Datainc + end + +end diff --git a/current/app/models/tag.rb b/current/app/models/tag.rb new file mode 100644 index 0000000..a3cac59 --- /dev/null +++ b/current/app/models/tag.rb @@ -0,0 +1,16 @@ +class Tag < ApplicationRecord + has_and_belongs_to_many :informativos + before_save :parameterize + validates :nome, uniqueness: true + + def self.top + Tag.limit(80).order("count DESC") + end + + private + def parameterize + self.nome.strip! + self.param = self.nome.parameterize + puts "Tag: #{self.nome}" + end +end diff --git a/current/app/models/tema.rb b/current/app/models/tema.rb new file mode 100644 index 0000000..3572ed8 --- /dev/null +++ b/current/app/models/tema.rb @@ -0,0 +1,11 @@ +class Tema < ApplicationRecord + self.table_name = "temas" + + def self.infos + Tema.where(cod_tema_sub: 0).where.not(padrao: "").map { |t| [t.padrao, t.count] }.sort_by { |_, c| -c } + end + + def informativos + Informativo.where("tema1 = ? OR tema2 = ? OR tema3 = ?", cod_tema, cod_tema, cod_tema) + end +end diff --git a/current/app/views/layouts/application.haml b/current/app/views/layouts/application.haml new file mode 100644 index 0000000..6f2807b --- /dev/null +++ b/current/app/views/layouts/application.haml @@ -0,0 +1,35 @@ +!!! +%html + %head + %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/ + - title = "Ambiente Já!" + - title = "#{@title} - #{title}" if @title + %title= title + = csrf_meta_tags + = csp_meta_tag + = favicon_link_tag asset_path('favicon.ico') + = stylesheet_link_tag "https://fonts.googleapis.com/css?family=Fira+Sans&display=swap" + = stylesheet_link_tag 'application', media: 'all' + = javascript_include_tag 'application' + + %body + + #all + #topo + = link_to image_tag("logo.png", class: "logo_img"), "/" + #busca + = form_tag("/search", method: :get) do + = text_field_tag :q, "", class: 'busca-input', placeholder: "+agrofloresta +vida -lixo" + = submit_tag '⌕', class: 'busca-btn' + + #temas + - Tema.infos.each do |t| + = link_to "/tema/#{t[0].parameterize}", class: "tema" do + %span.content= t[0] + %span.right= "(#{t[1]})" + = yield :tags + #informativos + = yield + + #baixo + %span - AmbienteJá desde 2001 - diff --git a/current/app/views/page/home.haml b/current/app/views/page/home.haml new file mode 100644 index 0000000..b8b74b6 --- /dev/null +++ b/current/app/views/page/home.haml @@ -0,0 +1,16 @@ +- content_for :tags do + #tags + - Tag.top.each do |t| + %span= link_to "#{t.nome} (#{t.count})", "/tag/#{t.param}", class: "tags", target: "blank" + +#informativos + - @informativos.each do |i| + .card + %p= link_to i.titulo.html_safe, CGI.unescapeHTML("/informativo/#{i.id}"), class: "link" + - i.tags.each do |t| + %span= link_to t.nome, "/tag/#{t.param}", class: "tags", target: "blank" + - from = i.operador_inc ? " | #{i.operador_inc.downcase.capitalize}" : "" + .date= "#{i.Datainc} #{from}" + +#nav + = will_paginate @informativos \ No newline at end of file diff --git a/current/app/views/page/informativo.haml b/current/app/views/page/informativo.haml new file mode 100644 index 0000000..4101ecf --- /dev/null +++ b/current/app/views/page/informativo.haml @@ -0,0 +1,25 @@ +:javascript + $(document).ready(function(){ + $(".texto a").each(function(a){ + $(this).attr("target", "_blank"); + }) + }); + +#todo + %h2.link= @informativo.titulo.html_safe + #br{style: "padding-top: 4px"} + + - @informativo.tags.each do |t| + %span= link_to t.nome, "/tag/#{t.param}", class: "tags", target: "blank" + + - from = @informativo.operador_inc ? " | #{@informativo.operador_inc.downcase.capitalize}" : "" + .date= "#{@informativo.Datainc} #{from}" + + .texto!= @informativo.Descricao #to_html + -# %hr + -# != ap @informativo + + %hr + #tags + - Tag.top.each do |t| + %span= link_to "#{t.nome} (#{t.count})", "/tag/#{t.param}", class: "tags", target: "blank" diff --git a/current/app/views/page/list.haml b/current/app/views/page/list.haml new file mode 100644 index 0000000..2bdbcba --- /dev/null +++ b/current/app/views/page/list.haml @@ -0,0 +1,14 @@ +%h2.link= "[ #{@title} ]" +-# .date= "#{@informativos.count} informativos" +#br{style: "padding: 5px 0px 5px"} + +- @informativos.each do |i| + .card + %p= link_to i.titulo.html_safe, CGI.unescapeHTML("/informativo/#{i.id}"), class: "link" + - i.tags.each do |t| + %span= link_to t.nome, "/tag/#{t.param}", class: "tags", target: "blank" + - from = i.operador_inc ? " | #{i.operador_inc.downcase.capitalize}" : "" + .date= "#{i.Datainc} #{from}" + +#nav + = will_paginate @informativos diff --git a/bin/bundle b/current/bin/bundle similarity index 100% rename from bin/bundle rename to current/bin/bundle diff --git a/bin/rails b/current/bin/rails similarity index 53% rename from bin/rails rename to current/bin/rails index 0739660..5badb2f 100755 --- a/bin/rails +++ b/current/bin/rails @@ -1,4 +1,9 @@ #!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end APP_PATH = File.expand_path('../config/application', __dir__) require_relative '../config/boot' require 'rails/commands' diff --git a/current/bin/rake b/current/bin/rake new file mode 100755 index 0000000..d87d5f5 --- /dev/null +++ b/current/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/current/bin/setup similarity index 67% rename from bin/setup rename to current/bin/setup index 94fd4d7..5853b5e 100755 --- a/bin/setup +++ b/current/bin/setup @@ -1,6 +1,5 @@ #!/usr/bin/env ruby require 'fileutils' -include FileUtils # path to your application root. APP_ROOT = File.expand_path('..', __dir__) @@ -9,24 +8,25 @@ def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") end -chdir APP_ROOT do - # This script is a starting point to setup your application. +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. # Add necessary setup steps to this file. puts '== Installing dependencies ==' system! 'gem install bundler --conservative' system('bundle check') || system!('bundle install') - # Install JavaScript dependencies if using Yarn + # Install JavaScript dependencies # system('bin/yarn') # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') - # cp 'config/database.yml.sample', 'config/database.yml' + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' # end puts "\n== Preparing database ==" - system! 'bin/rails db:setup' + system! 'bin/rails db:prepare' puts "\n== Removing old logs and tempfiles ==" system! 'bin/rails log:clear tmp:clear' diff --git a/current/bin/spring b/current/bin/spring new file mode 100755 index 0000000..d89ee49 --- /dev/null +++ b/current/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads Spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == 'spring' } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/current/bin/update similarity index 100% rename from bin/update rename to current/bin/update diff --git a/config.ru b/current/config.ru similarity index 100% rename from config.ru rename to current/config.ru diff --git a/config/application.rb b/current/config/application.rb similarity index 84% rename from config/application.rb rename to current/config/application.rb index 8aa0487..19a3440 100644 --- a/config/application.rb +++ b/current/config/application.rb @@ -1,7 +1,6 @@ require_relative 'boot' require 'rails/all' -require "awesome_print" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -10,11 +9,7 @@ Bundler.require(*Rails.groups) module Ambienteja class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 5.2 - - config.generators do |g| - g.template_engine :haml - end + config.load_defaults 8.0 # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers diff --git a/config/boot.rb b/current/config/boot.rb similarity index 61% rename from config/boot.rb rename to current/config/boot.rb index b9e460c..ec779bb 100644 --- a/config/boot.rb +++ b/current/config/boot.rb @@ -1,4 +1,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +#require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/current/config/deploy.rb b/current/config/deploy.rb new file mode 100644 index 0000000..06a7d04 --- /dev/null +++ b/current/config/deploy.rb @@ -0,0 +1,32 @@ +require 'mina/rails' +require 'mina/git' +require 'mina/bundler' +require 'mina/rbenv' + +set :user, 'polo' +set :domain, '51.15.63.128' +set :deploy_to, '/home/polo/apps/abrigo/ambienteja' +set :repository, 'http://git.mostre.me:3500/rafapolo/ambienteja.git' +set :shared_dirs, fetch(:shared_dirs, ['log', 'public/upload', 'tmp', 'tmp/pids']) +set :shared_files, fetch(:shared_files, ['config/database.yml']) +set :rbenv_map_bins, %w{rake gem bundle ruby rails puma pumactl} + +desc "Deploys the current version to the server." +task :deploy do + deploy do + invoke :'git:clone' + invoke :'deploy:link_shared_paths' + invoke :'rbenv:load' + invoke :'bundle:install' + invoke :'rails:assets_precompile' + # invoke :'restart' + end +end + +task :start do + command "cd #{fetch(:deploy_to)}/current; bundle exec puma -C config/puma.rb &" +end + +task :restart do + command "kill -SIGUSR2 `ps aux | grep tcp://0.0.0.0:3333 | grep puma | awk '{ print $2 }'`", quiet: true +end diff --git a/config/environment.rb b/current/config/environment.rb similarity index 100% rename from config/environment.rb rename to current/config/environment.rb diff --git a/config/environments/development.rb b/current/config/environments/development.rb similarity index 92% rename from config/environments/development.rb rename to current/config/environments/development.rb index 371d87c..62c10ba 100644 --- a/config/environments/development.rb +++ b/current/config/environments/development.rb @@ -16,6 +16,7 @@ Rails.application.configure do # Run rails dev:cache to toggle caching. if Rails.root.join('tmp', 'caching-dev.txt').exist? config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { @@ -26,10 +27,8 @@ Rails.application.configure do config.cache_store = :null_store end - - config.serve_static_assets = true - # Store uploaded files on the local file system (see config/storage.yml for options) + # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local # Don't care if the mailer can't send. @@ -49,12 +48,12 @@ Rails.application.configure do # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. - config.assets.debug = true + config.assets.debug = false # Suppress logger output for asset requests. config.assets.quiet = true - # Raises error for missing translations + # Raises error for missing translations. # config.action_view.raise_on_missing_translations = true # Use an evented file watcher to asynchronously detect changes in source code, diff --git a/config/environments/production.rb b/current/config/environments/production.rb similarity index 67% rename from config/environments/production.rb rename to current/config/environments/production.rb index 8326a60..c9ce561 100644 --- a/config/environments/production.rb +++ b/current/config/environments/production.rb @@ -2,13 +2,18 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. + config.cache_classes = true config.public_file_server.enabled = true + # config.action_controller.perform_caching = true # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true - + config.hosts << "ambienteja.org" + config.action_controller.perform_caching = true + config.cache_store = :file_store, "#{root}/tmp/cache/" + config.action_controller.page_cache_directory = Rails.root.join("tmp", "cached_pages") # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true @@ -19,17 +24,13 @@ Rails.application.configure do # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. - config.public_file_server.enabled = true #ENV['RAILS_SERVE_STATIC_FILES'].present? - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier + # Compress CSS using a preprocessor. # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile =true - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' @@ -37,10 +38,10 @@ Rails.application.configure do # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - # Store uploaded files on the local file system (see config/storage.yml for options) + # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local - # Mount Action Cable outside main process or domain + # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil # config.action_cable.url = 'wss://example.com/cable' # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] @@ -58,9 +59,9 @@ Rails.application.configure do # Use a different cache store in production. # config.cache_store = :mem_cache_store - # Use a real queuing backend for Active Job (and separate queues per environment) + # Use a real queuing backend for Active Job (and separate queues per environment). # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "ambienteja_#{Rails.env}" + # config.active_job.queue_name_prefix = "ambienteja_production" config.action_mailer.perform_caching = false @@ -90,4 +91,25 @@ Rails.application.configure do # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false + + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session end diff --git a/config/environments/test.rb b/current/config/environments/test.rb similarity index 79% rename from config/environments/test.rb rename to current/config/environments/test.rb index 0a38fd3..de83a77 100644 --- a/config/environments/test.rb +++ b/current/config/environments/test.rb @@ -1,11 +1,12 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true + + config.cache_classes = false # Do not eager load code on boot. This avoids loading your whole application # just for the purpose of running a single test. If you are using a tool that @@ -21,6 +22,7 @@ Rails.application.configure do # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false + config.cache_store = :null_store # Raise exceptions instead of rendering exception templates. config.action_dispatch.show_exceptions = false @@ -28,7 +30,7 @@ Rails.application.configure do # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false - # Store uploaded files on the local file system in a temporary directory + # Store uploaded files on the local file system in a temporary directory. config.active_storage.service = :test config.action_mailer.perform_caching = false @@ -41,6 +43,6 @@ Rails.application.configure do # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - # Raises error for missing translations + # Raises error for missing translations. # config.action_view.raise_on_missing_translations = true end diff --git a/config/initializers/active_admin.rb b/current/config/initializers/active_admin.rb similarity index 91% rename from config/initializers/active_admin.rb rename to current/config/initializers/active_admin.rb index fa99a5c..fb2ce41 100644 --- a/config/initializers/active_admin.rb +++ b/current/config/initializers/active_admin.rb @@ -1,10 +1,12 @@ ActiveAdmin.setup do |config| + + # == Site Title # # Set the title that is displayed on the main layout # for each of the active admin pages. # - config.site_title = "Ambienteja" + config.site_title = "Ambiente Já" # Set the link url for the title. For example, to take # users to your main site. Defaults to no link. @@ -110,7 +112,8 @@ ActiveAdmin.setup do |config| # # Default: # config.logout_link_method = :get - + config.register_stylesheet 'https://cdn.bootcss.com/trix/1.0.0/trix.css' + config.register_javascript 'https://cdn.bootcss.com/trix/1.0.0/trix.js' # == Root # # Set the action to call for the root path. You can set different @@ -118,13 +121,13 @@ ActiveAdmin.setup do |config| # # Default: # config.root_to = 'dashboard#index' - + config.root_to = 'informativos#index' # == Admin Comments # # This allows your users to comment on any resource registered with Active Admin. # # You can completely disable comments: - # config.comments = false + config.comments = false # # You can change the name under which comments are registered: # config.comments_registration_name = 'AdminComment' @@ -163,7 +166,10 @@ ActiveAdmin.setup do |config| # # Set the localize format to display dates and times. # To understand how to localize your app with I18n, read more at - # https://github.com/svenfuchs/i18n/blob/master/lib%2Fi18n%2Fbackend%2Fbase.rb#L52 + # https://guides.rubyonrails.org/i18n.html + # + # You can run `bin/rails runner 'puts I18n.t("date.formats")'` to see the + # available formats in your application. # config.localize_format = :long @@ -283,12 +289,25 @@ ActiveAdmin.setup do |config| # config.filters = true # # By default the filters include associations in a select, which means - # that every record will be loaded for each association. + # that every record will be loaded for each association (up + # to the value of config.maximum_association_filter_arity). # You can enabled or disable the inclusion # of those filters by default here. # # config.include_default_association_filters = true + # config.maximum_association_filter_arity = 256 # default value of :unlimited will change to 256 in a future version + # config.filter_columns_for_large_association, [ + # :display_name, + # :full_name, + # :name, + # :username, + # :login, + # :title, + # :email, + # ] + # config.filter_method_for_large_association, '_starts_with' + # == Head # # You can add your own content to the site head like analytics. Make sure diff --git a/current/config/initializers/activeadmin_addons.rb b/current/config/initializers/activeadmin_addons.rb new file mode 100644 index 0000000..ac9ea44 --- /dev/null +++ b/current/config/initializers/activeadmin_addons.rb @@ -0,0 +1,12 @@ +ActiveadminAddons.setup do |config| + # Change to "default" if you want to use ActiveAdmin's default select control. + # config.default_select = "select2" + + # Set default options for DateTimePickerInput. The options you can provide are the same as in + # xdan's datetimepicker library (https://github.com/xdan/datetimepicker/tree/2.5.4). Yo need to + # pass a ruby hash, avoid camelCase keys. For example: use min_date instead of minDate key. + # config.datetime_picker_default_options = {} + + # Set DateTimePickerInput input format. This if for backend (Ruby) + # config.datetime_picker_input_format = "%Y-%m-%d %H:%M" +end diff --git a/config/initializers/assets.rb b/current/config/initializers/assets.rb similarity index 88% rename from config/initializers/assets.rb rename to current/config/initializers/assets.rb index 377fdb3..6f24c49 100644 --- a/config/initializers/assets.rb +++ b/current/config/initializers/assets.rb @@ -13,4 +13,4 @@ Rails.application.config.public_file_server.enabled = true # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. -# Rails.application.config.assets.precompile += %w( admin.js admin.css ) +Rails.application.config.assets.precompile += %w( application.js application.css admin.js admin.css ) diff --git a/config/initializers/cookies_serializer.rb b/current/config/initializers/cookies_serializer.rb similarity index 100% rename from config/initializers/cookies_serializer.rb rename to current/config/initializers/cookies_serializer.rb diff --git a/config/initializers/devise.rb b/current/config/initializers/devise.rb similarity index 97% rename from config/initializers/devise.rb rename to current/config/initializers/devise.rb index 51e0442..79a4407 100644 --- a/config/initializers/devise.rb +++ b/current/config/initializers/devise.rb @@ -8,7 +8,7 @@ Devise.setup do |config| # confirmation, reset password and unlock tokens in the database. # Devise will use the `secret_key_base` as its `secret_key` # by default. You can change it below and use your own secret key. - # config.secret_key = '8827c6d808b872254a07d83e789fb5d042e98ac355847e64d682affb32e9c8ebd5d3edbbfd48f88894e8efaba71021e9a5cd32ac9acdcd06a62bb1bed110abcc' + # config.secret_key = '864f9f1c691528e65ef9e70895d1f68638f5f70479a5a9e0b5da0af35fca408cba42e50bf111536afde21416c09e201cc1268d2bdfb877a5b32657740a02264c' # ==> Controller configuration # Configure the parent class to the devise controllers. @@ -114,7 +114,7 @@ Devise.setup do |config| config.stretches = Rails.env.test? ? 1 : 11 # Set up a pepper to generate the hashed password. - # config.pepper = '1c20c1ec9311917f0bac92310a31e36499ab83ef7a2d148dba06e7b6f607c4bfdbeebdb6ecd4c60d878338fda1227af8b47db0a51d79f9aec23b162897f59dfe' + # config.pepper = '1991c71bc9a57b1ab03a829a16557f3f90e9491604f5b4daee96027234916b099e48dbddb922e0dff830b4e9ef319d17379459030ca795ab3f05712f59628171' # Send a notification to the original email when the user's email is changed. # config.send_email_changed_notification = false diff --git a/config/initializers/filter_parameter_logging.rb b/current/config/initializers/filter_parameter_logging.rb similarity index 100% rename from config/initializers/filter_parameter_logging.rb rename to current/config/initializers/filter_parameter_logging.rb diff --git a/config/initializers/inflections.rb b/current/config/initializers/inflections.rb similarity index 100% rename from config/initializers/inflections.rb rename to current/config/initializers/inflections.rb diff --git a/current/config/initializers/kaminari.rb b/current/config/initializers/kaminari.rb new file mode 100644 index 0000000..3e2a64a --- /dev/null +++ b/current/config/initializers/kaminari.rb @@ -0,0 +1,4 @@ +# config/initializers/kaminari.rb +Kaminari.configure do |config| + config.page_method_name = :per_page_kaminari +end diff --git a/config/initializers/mime_types.rb b/current/config/initializers/mime_types.rb similarity index 100% rename from config/initializers/mime_types.rb rename to current/config/initializers/mime_types.rb diff --git a/config/initializers/wrap_parameters.rb b/current/config/initializers/wrap_parameters.rb similarity index 100% rename from config/initializers/wrap_parameters.rb rename to current/config/initializers/wrap_parameters.rb diff --git a/config/locales/devise.en.yml b/current/config/locales/devise.en.yml similarity index 98% rename from config/locales/devise.en.yml rename to current/config/locales/devise.en.yml index 55617bd..ca3d619 100644 --- a/config/locales/devise.en.yml +++ b/current/config/locales/devise.en.yml @@ -42,7 +42,7 @@ en: signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." - update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address." updated: "Your account has been updated successfully." updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" sessions: diff --git a/config/locales/en.yml b/current/config/locales/en.yml similarity index 93% rename from config/locales/en.yml rename to current/config/locales/en.yml index decc5a8..cf9b342 100644 --- a/config/locales/en.yml +++ b/current/config/locales/en.yml @@ -27,7 +27,7 @@ # 'true': 'foo' # # To learn more, please read the Rails Internationalization guide -# available at http://guides.rubyonrails.org/i18n.html. +# available at https://guides.rubyonrails.org/i18n.html. en: hello: "Hello world" diff --git a/current/config/puma.rb b/current/config/puma.rb new file mode 100644 index 0000000..b0e69ab --- /dev/null +++ b/current/config/puma.rb @@ -0,0 +1,16 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count + +#daemonize true if ENV.fetch("RAILS_ENV") == "production" + +port ENV.fetch("PORT") { 3333 } +environment ENV.fetch("RAILS_ENV") { "production" } +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + diff --git a/current/config/routes.rb b/current/config/routes.rb new file mode 100644 index 0000000..b422bcd --- /dev/null +++ b/current/config/routes.rb @@ -0,0 +1,11 @@ +Rails.application.routes.draw do + devise_for :admin_users, ActiveAdmin::Devise.config + ActiveAdmin.routes(self) + + root to: "page#home" + + get '/search', to: 'page#busca' + get '/tema/:param', to: 'page#tema' + get '/tag/:param', to: 'page#tag' + get '/informativo/:id', to: 'page#informativo' +end diff --git a/db/migrate/20190529154251_devise_create_admin_users.rb b/current/db/migrate/20190529154251_devise_create_admin_users.rb similarity index 100% rename from db/migrate/20190529154251_devise_create_admin_users.rb rename to current/db/migrate/20190529154251_devise_create_admin_users.rb diff --git a/current/db/migrate/20191218191626_create_informativo_tags.rb b/current/db/migrate/20191218191626_create_informativo_tags.rb new file mode 100644 index 0000000..43d2893 --- /dev/null +++ b/current/db/migrate/20191218191626_create_informativo_tags.rb @@ -0,0 +1,17 @@ +class CreateInformativoTags < ActiveRecord::Migration[6.0] + def change + + # create_table :tags do |t| + # t.string :nome + # t.string :param + # t.integer :count + # end + # add_index(:tags, :param) + + create_join_table :informativo, :tags do |t| + t.index :informativo_idinformativo + t.index :tag_id + end + + end +end diff --git a/current/db/schema.rb b/current/db/schema.rb new file mode 100644 index 0000000..7ad5515 --- /dev/null +++ b/current/db/schema.rb @@ -0,0 +1,73 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema[8.0].define(version: 2019_12_18_191626) do + create_table "admin_users", force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at", precision: nil + t.datetime "remember_created_at", precision: nil + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.index ["email"], name: "index_admin_users_on_email", unique: true + t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true + end + + create_table "informativo", primary_key: "Idinformativo", force: :cascade do |t| + t.string "titulo" + t.text "Descricao" + t.integer "Idtipo" + t.string "Abrangencia" + t.date "Datainc" + t.integer "tema1", default: 0 + t.integer "subtema1", default: 0 + t.integer "tema2", default: 0 + t.integer "subtema2", default: 0 + t.integer "tema3", default: 0 + t.integer "subtema3", default: 0 + t.integer "tema4", default: 0 + t.integer "subtema4", default: 0 + t.string "operador_inc" + t.string "operador_alt" + t.text "markdown" + t.index ["Datainc"], name: "idx_info_datainc" + t.index ["Idtipo"], name: "idx_info_idtipo" + t.index ["tema1"], name: "idx_info_tema1" + end + + create_table "informativo_tags", id: false, force: :cascade do |t| + t.integer "informativo_id", null: false + t.integer "tag_id", null: false + t.index ["informativo_id"], name: "index_informativo_tags_on_informativo_id" + t.index ["tag_id"], name: "index_informativo_tags_on_tag_id" + end + + create_table "tags", force: :cascade do |t| + t.string "nome" + t.string "param" + t.integer "count" + t.index ["param"], name: "index_tags_on_param" + end + + create_table "temas", force: :cascade do |t| + t.integer "cod_tema", default: 0 + t.integer "cod_tema_sub", default: 0 + t.string "tema", limit: 50 + t.integer "ativo", default: 0 + t.string "padrao", limit: 50 + t.integer "count" + t.string "param", limit: 100 + t.index ["cod_tema", "cod_tema_sub"], name: "index_temas_cod" + t.index ["param"], name: "index_temas_param" + end +end diff --git a/lib/assets/.keep b/current/lib/assets/.keep similarity index 100% rename from lib/assets/.keep rename to current/lib/assets/.keep diff --git a/lib/tasks/.keep b/current/lib/tasks/.keep similarity index 100% rename from lib/tasks/.keep rename to current/lib/tasks/.keep diff --git a/current/lib/tasks/import.rake b/current/lib/tasks/import.rake new file mode 100644 index 0000000..79cd9ea --- /dev/null +++ b/current/lib/tasks/import.rake @@ -0,0 +1,28 @@ +namespace :import do + + desc "generate markdown from html" + task :as_markdown => :environment do + Informativo.all.each do |i| + i.update(markdown: i.as_markdown) + end + end + + desc "fix tags" + task :tags => :environment do + Informativo.all.each do |i| + tags = [] + tags << i.tag1.split(", ") if i.tag1 + tags << i.tag2.split(", ") if i.tag2 + tags << i.tag3.split(", ") if i.tag3 + tags.flatten.compact.each do |t| + i.tags << Tag.find_or_create_by(nome: t.gsub(",", "")) unless t.empty? + end + i.tags = i.tags.uniq + i.save + end + Tag.all.each do |t| + t.update(count: t.informativos.count) + end + end + +end diff --git a/current/node_modules/.yarn-integrity b/current/node_modules/.yarn-integrity new file mode 100644 index 0000000..3d097ea --- /dev/null +++ b/current/node_modules/.yarn-integrity @@ -0,0 +1,12 @@ +{ + "systemParams": "linux-x64-64", + "modulesFolders": [], + "flags": [ + "production" + ], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/public/robots.txt b/current/public/robots.txt similarity index 100% rename from public/robots.txt rename to current/public/robots.txt diff --git a/current/test/controllers/page_controller_test.rb b/current/test/controllers/page_controller_test.rb new file mode 100644 index 0000000..8bbb139 --- /dev/null +++ b/current/test/controllers/page_controller_test.rb @@ -0,0 +1,37 @@ +require "test_helper" + +class PageControllerTest < ActionDispatch::IntegrationTest + test "home returns 200" do + get root_path + assert_response :success + end + + test "busca returns 200 with empty query" do + get "/search", params: { q: "" } + assert_response :success + end + + test "busca returns 200 with search term" do + Informativo.create!(titulo: "Desmatamento na Amazônia") + get "/search", params: { q: "Amazônia" } + assert_response :success + end + + test "informativo page returns 200 for valid id" do + info = Informativo.create!(titulo: "Artigo de teste", markdown: "Conteúdo") + get "/informativo/#{info.Idinformativo}" + assert_response :success + end + + test "tag page returns 200 for existing tag" do + Tag.create!(nome: "biodiversidade") + get "/tag/biodiversidade" + assert_response :success + end + + test "tema page returns 200 for existing tema" do + Tema.create!(cod_tema: 5, tema: "Água", padrao: "Água", param: "agua", count: 0) + get "/tema/agua" + assert_response :success + end +end diff --git a/current/test/models/informativo_test.rb b/current/test/models/informativo_test.rb new file mode 100644 index 0000000..998a0aa --- /dev/null +++ b/current/test/models/informativo_test.rb @@ -0,0 +1,28 @@ +require "test_helper" + +class InformativoTest < ActiveSupport::TestCase + test "creates with titulo and sets Datainc automatically" do + info = Informativo.create!(titulo: "Novo artigo ambiental") + assert_not_nil info.Datainc + assert_not_nil info.Idinformativo + end + + test "does not overwrite an existing Datainc" do + date = Date.new(2010, 6, 1) + info = Informativo.create!(titulo: "Artigo antigo", Datainc: date) + assert_equal date, info.Datainc + end + + test "to_html renders markdown column as HTML" do + info = Informativo.create!(titulo: "Test", markdown: "## Título\nConteúdo") + html = info.to_html + assert_includes html, "

" + assert_includes html, "Título" + end + + test "temas returns matching tema names" do + tema = Tema.create!(cod_tema: 7, tema: "Energia", padrao: "Energia Renovável", count: 0) + info = Informativo.create!(titulo: "Solar", tema1: 7) + assert_includes info.temas, tema.tema + end +end diff --git a/current/test/models/tag_test.rb b/current/test/models/tag_test.rb new file mode 100644 index 0000000..60c455e --- /dev/null +++ b/current/test/models/tag_test.rb @@ -0,0 +1,27 @@ +require "test_helper" + +class TagTest < ActiveSupport::TestCase + test "parameterize sets param on save" do + tag = Tag.create!(nome: "Energia Solar") + assert_equal "energia-solar", tag.param + end + + test "strips whitespace from nome before save" do + tag = Tag.create!(nome: " mata ciliar ") + assert_equal "mata ciliar", tag.nome + end + + test "nome uniqueness is enforced" do + Tag.create!(nome: "floresta") + dup = Tag.new(nome: "floresta") + assert_not dup.valid? + end + + test "top returns at most 80 tags ordered by count desc" do + Tag.create!(nome: "tag-a", param: "tag-a", count: 100) + Tag.create!(nome: "tag-b", param: "tag-b", count: 5) + result = Tag.top + assert result.first.count >= result.last.count + assert result.size <= 80 + end +end diff --git a/current/test/models/tema_test.rb b/current/test/models/tema_test.rb new file mode 100644 index 0000000..cdad8fb --- /dev/null +++ b/current/test/models/tema_test.rb @@ -0,0 +1,22 @@ +require "test_helper" + +class TemaTest < ActiveSupport::TestCase + test "informativos returns articles linked to this tema" do + tema = Tema.create!(cod_tema: 3, tema: "Clima", padrao: "Mudanças Climáticas", count: 0) + info = Informativo.create!(titulo: "IPCC 2010", tema1: 3) + assert_includes tema.informativos, info + end + + test "infos returns only root temas with padrao, sorted by count desc" do + Tema.create!(cod_tema: 1, cod_tema_sub: 0, padrao: "Legislação", count: 500) + Tema.create!(cod_tema: 2, cod_tema_sub: 0, padrao: "Fauna e Flora", count: 200) + Tema.create!(cod_tema: 3, cod_tema_sub: 1, padrao: "Subtema", count: 999) + + result = Tema.infos + names = result.map(&:first) + assert_includes names, "Legislação" + assert_includes names, "Fauna e Flora" + assert_not_includes names, "Subtema" + assert result.first[1] >= result.last[1] + end +end diff --git a/current/test/test_helper.rb b/current/test/test_helper.rb new file mode 100644 index 0000000..950d9d2 --- /dev/null +++ b/current/test/test_helper.rb @@ -0,0 +1,7 @@ +ENV["RAILS_ENV"] ||= "test" +require_relative "../config/environment" +require "rails/test_help" + +class ActiveSupport::TestCase + self.use_transactional_tests = true +end diff --git a/db/migrate/20190529154253_create_active_admin_comments.rb b/db/migrate/20190529154253_create_active_admin_comments.rb deleted file mode 100644 index 5c0a954..0000000 --- a/db/migrate/20190529154253_create_active_admin_comments.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreateActiveAdminComments < ActiveRecord::Migration[5.2] - def self.up - create_table :active_admin_comments do |t| - t.string :namespace - t.text :body - t.references :resource, polymorphic: true - t.references :author, polymorphic: true - t.timestamps - end - add_index :active_admin_comments, [:namespace] - end - - def self.down - drop_table :active_admin_comments - end -end diff --git a/db/schema.rb b/db/schema.rb deleted file mode 100644 index 7710a98..0000000 --- a/db/schema.rb +++ /dev/null @@ -1,364 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2019_05_29_154253) do - - create_table "active_admin_comments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| - t.string "namespace" - t.text "body" - t.string "resource_type" - t.bigint "resource_id" - t.string "author_type" - t.bigint "author_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id" - t.index ["namespace"], name: "index_active_admin_comments_on_namespace" - t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id" - end - - create_table "admin_users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" - t.datetime "reset_password_sent_at" - t.datetime "remember_created_at" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["email"], name: "index_admin_users_on_email", unique: true - t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true - end - - create_table "agenda", primary_key: "Reg", options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "Titulo", limit: 100, null: false - t.text "Descricao", limit: 16777215, null: false - t.date "Data_evento", null: false - t.date "Data_inclusao", null: false - t.string "operador", limit: 20 - t.index ["Data_evento"], name: "Data_evento" - t.index ["Data_inclusao"], name: "Data_inclusao" - end - - create_table "atividade", primary_key: "reg", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "cod_atividade", null: false - t.integer "cod_subatividade", null: false - t.string "atividade", limit: 50, null: false - t.integer "ativo", default: 0, null: false - t.string "padrao", limit: 50, null: false - end - - create_table "bancoimagens", primary_key: "reg", options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "imagem_pq", limit: 40, default: "", null: false - t.string "imagem_gd", limit: 40, default: "", null: false - t.integer "tipo", default: 0, null: false - t.string "link", limit: 100, default: "", null: false - t.text "label", limit: 4294967295, null: false - t.string "pr", limit: 1, default: "", null: false - t.integer "altura_pq", default: 0, null: false - t.integer "largura_pq", default: 0, null: false - t.integer "altura_gd", default: 0, null: false - t.integer "largura_gd", default: 0, null: false - t.string "Titulo", limit: 100 - t.integer "Disp_cliente", default: 0 - t.integer "Tema", default: 0 - t.integer "Subtema", default: 0, null: false - t.string "tag1", limit: 50 - t.date "Data", null: false - end - - create_table "cliente", primary_key: "Codcli", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "Nome", limit: 40, default: "", null: false - t.string "empresa", limit: 40 - t.string "endereco", limit: 40, default: "", null: false - t.string "cidade", limit: 20, default: "", null: false - t.integer "cep", default: 0, null: false - t.string "estado", limit: 2, default: "", null: false - t.string "telefone", limit: 15, default: "", null: false - t.string "email", limit: 50, default: "", null: false - t.string "cgccpf", limit: 20 - t.string "profissao", limit: 40 - t.string "escolaridade", limit: 20 - t.integer "interesse1", default: 0 - t.integer "interesse2", default: 0 - t.integer "interesse3", default: 0 - t.integer "interesse4", default: 0 - t.datetime "data" - t.string "livre", limit: 10 - t.string "login", limit: 10 - t.string "senha", limit: 10 - t.integer "exibirperfil", default: 0, null: false - t.integer "acesso" - t.integer "assinatura" - t.integer "tipoemail" - t.index ["Codcli"], name: "Codcli" - t.index ["Nome"], name: "Nome" - t.index ["login"], name: "login" - end - - create_table "comentarios", primary_key: "cod_coment", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "id_original", null: false - t.integer "tipo_original", null: false - t.text "comentario", limit: 4294967295, null: false - t.string "login", limit: 10, null: false - t.date "data", null: false - t.string "nome_criador", limit: 50, null: false - t.integer "id_criador", null: false - t.time "hora", null: false - t.index ["id_original", "tipo_original"], name: "id_original" - end - - create_table "controles", id: false, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "reg", null: false, auto_increment: true - t.date "data", null: false - t.integer "num_inf", default: 0, null: false - t.integer "ano", default: 0, null: false - t.integer "ano1", default: 0, null: false - t.integer "visitas", default: 0, null: false - t.index ["reg"], name: "reg" - end - - create_table "experiencia", primary_key: "Reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "Nome", limit: 40, default: "", null: false - t.string "Endereco", limit: 40 - t.string "Email", limit: 50, default: "", null: false - t.string "Cidade", limit: 20, default: "", null: false - t.string "Estado", limit: 2, default: "", null: false - t.string "Pais", limit: 20, default: "", null: false - t.string "Telefone", limit: 15, default: "0", null: false - t.string "senha", limit: 15, default: "", null: false - t.date "data_cadastro", null: false - t.date "data_validade", null: false - t.integer "interesse1", default: 0 - t.integer "interesse2", default: 0 - t.integer "interesse3", default: 0 - t.integer "interesse4", default: 0 - t.date "ultimo_acesso" - t.integer "prefixo", default: 0 - t.string "Empresa", limit: 40 - t.string "funcao", limit: 40 - t.integer "conheceu", default: 0 - t.string "outros", limit: 30 - t.index ["Email"], name: "Email" - t.index ["Nome", "Email"], name: "Nome" - end - - create_table "extensoes", id: false, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.bigint "reg", null: false, auto_increment: true - t.string "extensao", limit: 5, default: "", null: false - t.index ["extensao"], name: "extensao" - t.index ["reg"], name: "reg" - end - - create_table "home", primary_key: "Reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.date "Data" - t.integer "Noticia1", default: 0, null: false - t.integer "Noticia2", default: 0, null: false - t.integer "Noticia3", default: 0, null: false - t.integer "Noticia4", default: 0, null: false - t.integer "reg_livro", default: 0, null: false - t.integer "reg_Imagem", default: 0, null: false - t.integer "Tipo_imagem", default: 0, null: false - t.integer "libera1", default: 2, null: false - t.integer "libera2", default: 2, null: false - t.integer "libera3", default: 2, null: false - t.integer "libera4", default: 2, null: false - t.string "metatag", limit: 250 - end - - create_table "informativo", primary_key: "Idinformativo", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "titulo", limit: 250 - t.text "Descricao", limit: 4294967295 - t.integer "Idtipo" - t.string "Abrangencia", limit: 100 - t.date "Datainc" - t.integer "tema1", default: 0 - t.integer "subtema1", default: 0, null: false - t.integer "tema2", default: 0 - t.integer "subtema2", default: 0, null: false - t.integer "tema3", default: 0 - t.integer "subtema3", default: 0, null: false - t.integer "tema4", default: 0 - t.integer "subtema4", default: 0, null: false - t.string "tag1", limit: 50 - t.string "tag2", limit: 50 - t.string "tag3", limit: 50 - t.string "operador_inc", limit: 20 - t.string "operador_alt", limit: 20 - t.date "data_inc" - t.date "data_alt" - t.index ["Datainc"], name: "Datainc" - t.index ["Idinformativo"], name: "Idinformativo" - t.index ["Idtipo"], name: "Idtipo" - t.index ["tag1", "tag2", "tag3"], name: "fulltag", type: :fulltext - t.index ["tag1"], name: "tag1" - t.index ["tag2"], name: "tag2" - t.index ["tag3"], name: "tag3" - t.index ["tema1"], name: "tema1" - t.index ["tema2"], name: "tema2" - t.index ["tema3"], name: "tema3" - t.index ["tema4"], name: "tema4" - end - - create_table "links", primary_key: "idlink", options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "endereco", limit: 80, default: "", null: false - t.text "descricao", limit: 16777215, null: false - t.string "link", limit: 100, null: false - t.integer "tipo", default: 0, null: false - t.integer "subtipo", default: 0, null: false - t.string "contato", limit: 50 - t.string "escolaridade", limit: 20 - t.string "cargo", limit: 40 - t.string "funcao", limit: 40 - t.string "telefone", limit: 30 - t.string "email", limit: 50 - t.string "abrangencia", limit: 15 - t.integer "atividade", default: 0, null: false - t.integer "subatividade", default: 0, null: false - t.string "end_rua", limit: 70 - t.string "end_bairro", limit: 20 - t.string "end_cep", limit: 10 - t.string "end_cidade", limit: 30 - t.string "estado_sede", limit: 2 - t.string "tag1", limit: 50 - t.string "tag2", limit: 50 - t.string "tag3", limit: 50 - t.string "Outros_contatos", limit: 50 - end - - create_table "livros", primary_key: "reg", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "titulo", limit: 80, null: false - t.string "autor", limit: 40, null: false - t.text "descricao", limit: 4294967295 - t.string "url", limit: 250, null: false - t.string "imagem", limit: 40, null: false - t.integer "Tema", default: 0 - t.integer "Subtema", default: 0, null: false - t.string "tag1", limit: 50 - t.string "nome_site", limit: 50 - end - - create_table "logomarcas", primary_key: "Reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "Nome", limit: 50, default: "", null: false - t.string "Site", limit: 50, default: "", null: false - t.text "Descricao", limit: 16777215 - t.date "Data_cadastro", null: false - t.integer "Capa", default: 0, null: false - t.string "Arquivo", limit: 50, default: "", null: false - end - - create_table "multimidia", primary_key: "reg", options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "titulo", limit: 100, default: "", null: false - t.text "descricao", limit: 4294967295, null: false - t.integer "tema", default: 0, null: false - t.integer "subtema", default: 0, null: false - t.integer "audio_video", default: 0, null: false - t.string "extensao", limit: 5, default: "", null: false - t.integer "disp_cliente", default: 0, null: false - t.string "arq_modem", limit: 50 - t.string "arq_banda", limit: 50 - t.integer "wmp", default: 0, null: false - t.date "data_cadastro", null: false - t.string "link", limit: 800 - t.string "tag1", limit: 50 - t.index ["arq_banda"], name: "arq_banda" - t.index ["arq_modem"], name: "arq_modem" - end - - create_table "news_customa", primary_key: "reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.date "datarel", null: false - t.date "dataatu", null: false - t.string "titulo", limit: 200, null: false - t.integer "tema_num", default: 0, null: false - t.integer "subtema_num", default: 0, null: false - t.integer "indic", default: 0, null: false - t.index ["datarel", "tema_num", "subtema_num"], name: "datarel" - end - - create_table "news_customb", primary_key: "reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "rega", null: false - t.integer "idinformativo", null: false - t.integer "tema1", default: 0, null: false - t.integer "subtema1", default: 0, null: false - t.integer "idtipo", default: 0, null: false - t.string "abrangencia", limit: 20 - t.string "titulo", limit: 250, null: false - t.index ["rega", "idinformativo"], name: "reg1" - end - - create_table "news_temp", primary_key: "reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "idinformativo", null: false - t.date "datainc", null: false - t.string "titulo", limit: 250, null: false - t.integer "tema1", default: 0, null: false - t.integer "subtema1", default: 0, null: false - t.integer "idtipo", default: 0, null: false - t.string "abrangencia", limit: 20 - t.index ["idinformativo"], name: "regid" - end - - create_table "perfil", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "Codcli", null: false - t.text "descricao", limit: 4294967295 - t.string "lib_descricao", limit: 1, default: "0", null: false - t.string "funcao", limit: 80 - t.string "lib_funcao", limit: 1, default: "0", null: false - t.string "site", limit: 250 - t.string "lib_site", limit: 1, default: "0", null: false - t.string "foto", limit: 40 - t.string "lib_foto", limit: 1, default: "0", null: false - t.string "email_p", limit: 50 - t.string "lib_email", limit: 1, default: "0", null: false - t.string "fone", limit: 30 - t.string "lib_fone", limit: 1, default: "0", null: false - t.text "textos_publi", limit: 4294967295 - t.string "lib_textos", limit: 1, default: "0", null: false - t.text "textos_indic", limit: 4294967295 - t.string "lib_indic", limit: 1, default: "0", null: false - end - - create_table "relata", primary_key: "Reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.date "Datarel", null: false - t.date "Dataatu", null: false - t.string "Titulo", limit: 200, default: "", null: false - t.string "Tema", limit: 200, default: "", null: false - t.string "Nomearq", limit: 50 - t.integer "indic", default: 0, null: false - t.integer "tema_num", default: 0, null: false - t.integer "subtema_num", default: 0, null: false - t.string "tag1", limit: 50 - end - - create_table "relatb", primary_key: "Reg", id: :integer, options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "Rega", default: 0, null: false - t.integer "Seq", default: 0, null: false - t.string "Subtitulo", limit: 200, default: "", null: false - t.text "Texto", limit: 4294967295, null: false - end - - create_table "temas", primary_key: "reg", options: "ENGINE=MyISAM DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "cod_tema", null: false - t.integer "cod_tema_sub", null: false - t.string "tema", limit: 50, null: false - t.integer "ativo", default: 0, null: false - t.string "padrao", limit: 50, null: false - t.index ["cod_tema", "cod_tema_sub"], name: "cod_tema" - end - - create_table "tipos", primary_key: "reg", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "cod_tipo", null: false - t.integer "cod_tipo_sub", null: false - t.string "tipo", limit: 50, null: false - t.integer "ativo", default: 0, null: false - t.string "padrao", limit: 50, null: false - end - -end diff --git a/informativo.md b/informativo.md new file mode 100644 index 0000000..8d09c37 --- /dev/null +++ b/informativo.md @@ -0,0 +1,178 @@ +# Informativo — Acervo de Notícias Ambientais (2001–2015) + +Base de dados com **170.273 notícias** sobre meio ambiente coletadas entre janeiro de 2001 e outubro de 2015 (~14,8 anos). O conteúdo é integralmente em português brasileiro, com cobertura **nacional** (46,7%), **estadual** (29,7%) e **internacional** (23,6%). + +--- + +## Visão Geral + +| Métrica | Valor | +|---|---| +| Total de artigos | 170.273 | +| Período | 01/01/2001 — 14/10/2015 | +| Pico de cobertura | 2007–2008 (~25 mil/ano) | +| Formatos | HTML (`Descricao`) + Markdown (`markdown`) | +| Encoding | Latin1 / UTF-8 | + +### Distribuição por ano + +| Ano | Artigos | +|---|---| +| 2001 | 9.173 | +| 2002 | 16.511 | +| 2003 | 16.745 | +| 2004 | 12.769 | +| 2005 | 12.349 | +| 2006 | 16.616 | +| 2007 | 24.136 | +| 2008 | 26.234 | +| 2009 | 18.052 | +| 2010 | 10.705 | +| 2011 | 5.108 | +| 2012 | 1.754 | +| 2013–2015 | ~120 | + +--- + +## Temas + +Os artigos estão classificados em **30 temas principais**. Abaixo, um resumo de cada um. + +### 1. Legislação e Governo — 27.835 artigos (16,3%) + +Cobre políticas públicas ambientais, decisões judiciais, licitações, audiências públicas, ações do Ibama, Ministério Público, Congresso Nacional e assembleias estaduais. Inclui debates sobre o Código Florestal, Zoneamento Ecológico-Econômico, criação de unidades de conservação, greves de servidores do Ibama, e decisões sobre transgênicos. Também registra embates entre ambientalistas e governos nas três esferas. + +*Exemplos:* "Conselho de Política Energética discute conclusão de Angra III", "Ibama concede licença de operação a rodovias federais no Sudeste e no Sul", "Dom Cappio cobra encontro e ameaça nova greve". + +### 2. Fauna e Flora — 14.086 artigos (8,3%) + +Notícias sobre biodiversidade, espécies ameaçadas, fauna silvestre, flora nativa, unidades de conservação, desmatamento, biopirataria e tráfico de animais. Grande foco em Amazônia, Mata Atlântica e Pantanal. Também cobre projetos de reintrodução de espécies, incêndios florestais, e conflitos entre expansão agropecuária e preservação. + +*Exemplos:* "Abelhas nativas da Bahia estão ameaçadas de extinção", "Ambientalistas no norte da Alemanha comemoram baby-boom de focas", "Sai edital para leilão da Floresta do Jamari". + +### 3. Mudanças Climáticas — 8.645 artigos (5,1%) + +Cobertura de conferências da ONU (COPs), Protocolo de Kyoto, mercado de créditos de carbono, relatórios do IPCC, metas de redução de emissões e negociações internacionais. Inclui posicionamentos de países (EUA, China, Brasil, União Europeia), críticas à falta de ação política e dados sobre aquecimento global, degelo e elevação do nível do mar. + +*Exemplos:* "Cientistas esperam que Bush mude sua posição sobre a mudança climática", "Brasil deve anunciar metas internas de redução das emissões", "ONU pede para governos 'salvarem o planeta' em conferência climática". + +### 4. Energia Renovável — 8.544 artigos (5,0%) + +Energia eólica, solar, biomassa, biocombustíveis (etanol, biodiesel), PCHs, biogás e hidrogênio. Debate sobre o Proálcool, o Programa Nacional do Biodiesel, a viabilidade dos biocombustíveis e seus impactos sociais (competição com alimentos, monoculturas). Cobre também hidrelétricas controversas como Belo Monte, Jirau e Santo Antônio. + +*Exemplos:* "Biocombustível foi principal causa da crise alimentar, diz ONU", "Mamona é o carro-chefe do Programa Nacional do Biodiesel", "Ecologistas da Bolívia questionam represas brasileiras no Rio Madeira". + +### 5. Água — 6.435 artigos (3,8%) + +Gestão de recursos hídricos, transposição do São Francisco, escassez, desertificação, qualidade da água, saneamento, gestão de bacias hidrográficas e conflitos pelo uso da água. Também aborda aquíferos (Guarani), poluição de rios e oceanos, e impactos de hidrelétricas nos regimes hídricos. + +*Exemplos:* "Na Paraíba, Ciro Gomes recebe apoio para transposição do São Francisco", "Água de canal pode ser solução para Pelotas", "Polícia bloqueia acesso a acampamento em Pernambuco". + +### 6. Ciência e Tecnologia — 6.277 artigos (3,7%) + +Pesquisas científicas, inovações tecnológicas ambientais, novos materiais, biotecnologia, transgênicos, biocombustíveis avançados, monitoramento por satélite (SIVAM), e estudos acadêmicos sobre ecologia. Inclui cobertura de congressos científicos, publicações de artigos e desenvolvimento de tecnologias limpas. + +*Exemplos:* "Brasil pode ser um dos grandes produtores de bioplástico, acredita IPT", "Livro infantil aborda Antártica", "Turismo sem planejamento traz impactos ambientais no sul da Bahia, aponta pesquisa". + +### 7. Resíduos / Lixo — 6.141 artigos (3,6%) + +Lixões a céu aberto, aterros sanitários, coleta seletiva, reciclagem, logística reversa e destinação de resíduos sólidos urbanos e industriais. Inclui denúncias de irregularidades, interdições de aterros, e iniciativas de reaproveitamento (tijolos ecológicos, biogás de suinocultura). + +*Exemplos:* "Caxias inicia remoção do lixo gerado por indústrias", "Tecnologia brasileira reduz e desidrata lixo em Niterói", "Pesquisador constrói tijolo ecológico com lodo de ETA". + +### 8. Saúde e Meio Ambiente — 6.088 artigos (3,6%) + +Impactos ambientais na saúde humana: poluição do ar e doenças respiratórias, agrotóxicos e câncer, amianto, gripe aviária, dengue, contaminação por metais pesados. Inclui também educação ambiental e programas de saúde pública vinculados ao saneamento. + +*Exemplos:* "ABREA promove Tribunal do Amianto em São Paulo", "Confirmada mais uma morte por gripe aviária no Iraque", "Dengue mais letal sobe 500% no Rio". + +### 9. Agropecuária — 4.973 artigos (2,9%) + +Agronegócio, agricultura familiar, agroecologia, transgênicos na agricultura, agrotóxicos, febre aftosa, certificação orgânica e impactos da soja e da pecuária sobre biomas. Debate o modelo de produção, destacando tanto a expansão do agronegócio quanto as alternativas sustentáveis. + +*Exemplos:* "Santa Catarina sediará Congresso de Agroecologia em 2005", "Paraná registrou 29.250 intoxicações de agricultores em 1996/7", "MPF acusa funcionários do Ibama de serem pagos por madeireiros no Pará". + +### 10. Crimes Ambientais — 4.823 artigos (2,8%) + +Desmatamento ilegal, tráfico de animais silvestres, pesca predatória, biopirataria, grilagem de terras, incêndios criminosos, corrupção em órgãos ambientais e conflitos fundiários. Inclui operações do Ibama e da Polícia Federal, multas, apreensões e processos contra madeireiras. + +*Exemplos:* "Madeira roubada em Rondônia e Amazonas é exportada com nota do Acre", "Desfolhante químico usado em desmate no Nortão (MT)", "Decretada prisão de seis pelo confronto na fazenda da Syngenta". + +### 11. Combustíveis Fósseis — 4.761 artigos (2,8%) + +Petróleo, gás natural, carvão mineral, termelétricas, exploração do pré-sal, gasodutos (Brasil-Bolívia) e novas fronteiras de prospecção. Inclui debates sobre preço dos combustíveis, produção da Petrobras, impactos da exploração em áreas sensíveis (Amazônia, costa brasileira) e transição energética. + +*Exemplos:* "Petrobrás negocia compra de postos da Esso no Brasil e no Chile", "Marrocos sinaliza com outro acordo de prospecção de petróleo", "Petrobras anuncia aumento da oferta de diesel menos poluente no país". + +### 12. Poluição — 4.142 artigos (2,4%) + +Poluição hídrica, atmosférica, do solo, sonora e visual. Casos emblemáticos como o Rio dos Sinos (RS), a Baía de Guanabara, Cubatão, acidentes com produtos químicos, vazamentos de óleo e emissões veiculares. Inclui programas de despoluição como o Projeto Tietê. + +*Exemplos:* "Camada branca cobre o arroio Pampa em Novo Hamburgo", "Detran controlará emissão de gases poluentes nos veículos do Rio", "Barulho excessivo pode causar 'ressaca', ansiedade e estresse". + +### 13. Desastres Naturais — 4.167 artigos (2,4%) + +Terremotos, tsunamis, furacões, enchentes, secas, deslizamentos, erupções vulcânicas e incêndios florestais. Cobertura global com ênfase em eventos na Ásia (tsunami de 2004, terremotos no Paquistão, China e Indonésia) e nos desastres brasileiros (enchentes em Santa Catarina, seca no Nordeste). + +*Exemplos:* "Mortos em terremoto na Caxemira podem chegar a 86 mil, diz Banco Mundial", "Número de mortos na China ultrapassa 28,8 mil, diz agência estatal", "Temporal deixa desabrigados no Interior". + +### 14. Desenvolvimento Sustentável — 3.628 artigos (2,1%) + +Conceitos e práticas de sustentabilidade, economia verde, responsabilidade socioambiental empresarial, certificações (ISO 14001, FSC), consumo consciente e agendas como a Rio+20 e os Objetivos do Milênio. Inclui cases de empresas, projetos de ONGs e políticas de desenvolvimento sustentável. + +*Exemplos:* títulos representativos incluem "Empresa faz contato entre empreendedores e negócios ecologicamente sustentáveis", "Projeto cria prêmio para quem cuida do meio ambiente". + +### 15. Energia Atômica — 3.816 artigos (2,2%) + +Energia nuclear civil e militar, usinas de Angra 1/2/3, acidentes nucleares (Chernobyl, Fukushima), resíduos radioativos, enriquecimento de urânio, programa nuclear brasileiro e debates sobre a viabilidade e segurança da energia atômica frente às renováveis. + +*Exemplos:* "Dilma Rousseff defende energia nuclear para garantir crescimento", "Surgem os primeiros casos de câncer no Brasil decorrentes de Chernobyl", "Resíduos nucleares são incômodo à Suécia". + +### Temas menores (complementam o acervo) + +| Tema | Artigos | +|---|---| +| Processos Industriais | 3.298 | +| Comunidades Tradicionais (indígenas, quilombolas, ribeirinhos) | 3.011 | +| Licenciamento Ambiental | 2.953 | +| Biotecnologia | 2.683 | +| Passivos Socioambientais | 2.660 | +| Urbanização | 2.621 | +| Terceiro Setor | 2.366 | +| Educação Ambiental | 2.089 | +| Saneamento | 1.801 | +| Mineração | 1.477 | +| Acidentes | 1.249 | +| Bons Exemplos | 1.242 | +| Reciclagem | 1.242 | +| Certificação | 357 | +| Transporte | 1 | + +> **Nota:** 26.862 artigos (15,8%) não possuem tema principal atribuído (`tema1 = 0`), mas muitos deles estão classificados nos temas secundários (`tema2`, `tema3`, `tema4`). + +--- + +## Estrutura da Tabela `informativo` + +| Coluna | Tipo | Descrição | +|---|---|---| +| `Idinformativo` | int | Chave primária | +| `titulo` | varchar(250) | Título da notícia | +| `Descricao` | longtext | Corpo completo em HTML | +| `markdown` | longtext | Versão em Markdown | +| `Idtipo` | int | Tipo (1–5) | +| `Abrangencia` | varchar(100) | Nacional / Estadual / Internacional | +| `Datainc` | date | Data de inclusão | +| `tema1..4` | int | IDs dos temas (até 4 por notícia) | +| `subtema1..4` | int | IDs dos subtemas | +| `operador_inc` | varchar(20) | Operador que incluiu | +| `operador_alt` | varchar(20) | Operador que alterou | + +--- + +## Dados Técnicos + +- **Fonte:** Banco MySQL original convertido para DuckDB (`ambienteja.duckdb`, 2,8 MB apenas com tabelas auxiliares — `informativo` não foi incluído na conversão automática por limitações de parsing) +- **Dump original:** `dump.sql` (774,5 MB) +- **Bloco `informativo`:** 770,2 MB (~99,5% do dump) +- **Tabelas auxiliares no DuckDB:** `temas`, `tipos`, `atividade`, `extensoes`, `informativo_tags` (ainda não importadas) diff --git a/log/.keep b/log/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/mysql_to_duckdb.py b/mysql_to_duckdb.py new file mode 100644 index 0000000..73bfc08 --- /dev/null +++ b/mysql_to_duckdb.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +import re +import duckdb + +def convert_mysql_to_duckdb(sql): + # Remove MySQL-specific conditional comments /*!...*/ + sql = re.sub(r'/\*!.*?\*/', '', sql, flags=re.DOTALL) + + # Remove SET statements + sql = re.sub(r'^SET\s+.*?;', '', sql, flags=re.MULTILINE | re.IGNORECASE) + + # Remove LOCK/UNLOCK TABLES + sql = re.sub(r'^LOCK TABLES.*?;', '', sql, flags=re.MULTILINE | re.IGNORECASE) + sql = re.sub(r'^UNLOCK TABLES.*?;', '', sql, flags=re.MULTILINE | re.IGNORECASE) + + # Remove DROP TABLE IF EXISTS (DuckDB will handle via CREATE OR REPLACE) + sql = re.sub(r'^DROP TABLE IF EXISTS\s+`(\w+)`;', r'DROP TABLE IF EXISTS "\1";', sql, flags=re.MULTILINE | re.IGNORECASE) + + # Replace backtick identifiers with double-quoted + sql = re.sub(r'`(\w+)`', r'"\1"', sql) + + # Remove trailing table options (ENGINE=..., AUTO_INCREMENT=..., DEFAULT CHARSET=...) + sql = re.sub( + r'\)\s*ENGINE\s*=\s*\w+[^;]*;', + r');', + sql, + flags=re.IGNORECASE + ) + + # Remove index/key definitions from CREATE TABLE (KEY, UNIQUE KEY, but keep PRIMARY KEY) + # We'll process CREATE TABLE blocks to remove non-primary key definitions + def clean_create_table(match): + block = match.group(0) + lines = block.split('\n') + result = [] + for line in lines: + stripped = line.strip().rstrip(',') + # Skip KEY and UNIQUE KEY lines (not PRIMARY KEY) + if re.match(r'(UNIQUE\s+)?KEY\s+"', stripped, re.IGNORECASE): + continue + result.append(line) + # Fix trailing comma before closing paren + cleaned = '\n'.join(result) + cleaned = re.sub(r',\s*\n(\s*\))', r'\n\1', cleaned) + return cleaned + + sql = re.sub(r'CREATE TABLE.*?;', clean_create_table, sql, flags=re.DOTALL | re.IGNORECASE) + + # Fix column type widths: int(N) -> int, bigint(N) -> bigint, tinyint(N) -> tinyint + sql = re.sub(r'\b(int|bigint|tinyint|smallint|mediumint)\(\d+\)', r'\1', sql, flags=re.IGNORECASE) + + # Convert MySQL types to DuckDB types + sql = re.sub(r'\blongtext\b', 'text', sql, flags=re.IGNORECASE) + sql = re.sub(r'\bmediumtext\b', 'text', sql, flags=re.IGNORECASE) + sql = re.sub(r'\bmediumblob\b', 'blob', sql, flags=re.IGNORECASE) + sql = re.sub(r'\bdatetime\b', 'timestamp', sql, flags=re.IGNORECASE) + sql = re.sub(r'\bdouble\b', 'double', sql, flags=re.IGNORECASE) + + # Remove AUTO_INCREMENT from column definitions + sql = re.sub(r'\s+AUTO_INCREMENT\b', '', sql, flags=re.IGNORECASE) + + # Remove DEFAULT CHARSET and COLLATE from column definitions + sql = re.sub(r'\s+CHARACTER SET\s+\w+', '', sql, flags=re.IGNORECASE) + sql = re.sub(r'\s+COLLATE\s+\w+', '', sql, flags=re.IGNORECASE) + + # Remove 'unsigned' modifier (DuckDB doesn't have unsigned types) + sql = re.sub(r'\s+unsigned\b', '', sql, flags=re.IGNORECASE) + + return sql + + +def main(): + print("Reading dump.sql...") + with open('dump.sql', 'r', encoding='utf-8') as f: + sql = f.read() + + print("Converting MySQL SQL to DuckDB-compatible SQL...") + converted = convert_mysql_to_duckdb(sql) + + # Split into individual statements + statements = [s.strip() for s in converted.split(';') if s.strip() and not s.strip().startswith('--')] + + print(f"Connecting to ambienteja.duckdb...") + con = duckdb.connect('ambienteja.duckdb') + + errors = [] + ok = 0 + for i, stmt in enumerate(statements): + if not stmt: + continue + try: + con.execute(stmt) + ok += 1 + except Exception as e: + errors.append((stmt[:80].replace('\n', ' '), str(e))) + + con.close() + print(f"\nDone: {ok} statements executed successfully.") + if errors: + print(f"{len(errors)} errors:") + for stmt_preview, err in errors[:20]: + print(f" STMT: {stmt_preview}") + print(f" ERR: {err}\n") + + +if __name__ == '__main__': + main() diff --git a/package.json b/package.json deleted file mode 100644 index 9e0dd19..0000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "ambienteja", - "private": true, - "dependencies": {} -} diff --git a/public/404.html b/public/404.html deleted file mode 100644 index 2be3af2..0000000 --- a/public/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - - -
-
-

The page you were looking for doesn't exist.

-

You may have mistyped the address or the page may have moved.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/public/422.html b/public/422.html deleted file mode 100644 index c08eac0..0000000 --- a/public/422.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - - -
-
-

The change you wanted was rejected.

-

Maybe you tried to change something you didn't have access to.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/public/500.html b/public/500.html deleted file mode 100644 index 78a030a..0000000 --- a/public/500.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - - - - -
-
-

We're sorry, but something went wrong.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png deleted file mode 100644 index e69de29..0000000 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png deleted file mode 100644 index e69de29..0000000 diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/resumo/agropecuaria.md b/resumo/agropecuaria.md new file mode 100644 index 0000000..49f5073 --- /dev/null +++ b/resumo/agropecuaria.md @@ -0,0 +1,19 @@ +# Agropecuária + +**4.973 artigos** | período 2001–2014 | abrangência: principalmente Nacional (53,1%), seguida por Estadual (33,8%) e Internacional (13,1%) + +A cobertura agropecuária do Ambiente JA transita entre dois polos: o agronegócio de larga escala e a agricultura familiar agroecológica. O avanço da soja e da pecuária sobre a Amazônia constitui a tensão mais documentada, com o Ministério Público Federal denunciando funcionários do Ibama que teriam sido pagos por madeireiros no Pará — episódio que expôs as conexões entre grilagem, desmatamento e corrupção na fronteira agrícola. O governo federal, por sua vez, buscou conciliar desenvolvimento e conservação com planos específicos para a agricultura na Amazônia. + +Os agrotóxicos ocupam posição central na cobertura. O Paraná registrou 29.250 intoxicações de agricultores em apenas dois anos, número que dimensiona a gravidade do problema. A regulação de ingredientes ativos como o brometo de metila e o debate sobre o banimento de substâncias perigosas correm em paralelo à promoção da agricultura orgânica e da agroecologia. Santa Catarina sediou o Congresso de Agroecologia em 2005, e a Embrapa Clima Temperado implantou 300 quintais orgânicos, sinalizando o interesse institucional por alternativas ao modelo convencional. + +Os transgênicos dividem opiniões. A soja Roundup Ready, o milho BT e o algodão geneticamente modificado avançaram no campo brasileiro, amparados por decisões da CTNBio e pressões do setor produtivo, enquanto organizações ambientalistas e de defesa do consumidor questionavam a liberação comercial sem estudos de impacto de longo prazo. A febre aftosa mobilizou campanhas massivas de vacinação de rebanhos, conectando a sanidade animal às exigências sanitárias dos mercados importadores. + +A silvicultura de eucalipto e pinus para a indústria de celulose gerou a controvérsia do "deserto verde", com críticos apontando a monocultura florestal como vetor de concentração fundiária e degradação ambiental. Um professor propôs a associação dos eucaliptos com a agricultura familiar como alternativa conciliatória. Eventos e debates sobre projetos florestais no Rio Grande do Sul ilustram a busca por modelos produtivos que equilibrem viabilidade econômica e sustentabilidade, em um setor cuja relevância para a balança comercial brasileira torna cada decisão ambiental objeto de intensa disputa política. + +### Títulos representativos + +- "Paraná registrou 29.250 intoxicações de agricultores em 1996/7" +- "Santa Catarina sediará Congresso de Agroecologia em 2005" +- "Embrapa Clima Temperado implanta 300 quintais orgânicos" +- "Professor sugere associação dos eucaliptos com agricultura familiar" +- "Ministério quer plano para a agricultura da Amazônia" diff --git a/resumo/agua.md b/resumo/agua.md new file mode 100644 index 0000000..9690773 --- /dev/null +++ b/resumo/agua.md @@ -0,0 +1,19 @@ +# Água + +**6.435 artigos** | período 2001–2015 | abrangência: principalmente Estadual (44,4%), seguida por Nacional (38,5%) e Internacional (17,1%) + +A gestão dos recursos hídricos constitui o eixo central da cobertura sobre água, com forte presença dos comitês de bacia e dos instrumentos da Política Nacional de Recursos Hídricos. A cobrança pelo uso da água, comemorada pela ministra Marina Silva como avanço institucional, representa um marco na governança hídrica brasileira. A predominância da abrangência estadual reflete a capilaridade dos conflitos locais envolvendo rios, nascentes e bacias hidrográficas compartilhadas. + +O projeto de transposição do Rio São Francisco foi, de longe, o tema mais controverso do período. De um lado, o ministro Ciro Gomes defendia a obra como solução para a escassez no semiárido nordestino; de outro, Dom Cappio e movimentos sociais organizavam protestos, greves de fome e bloqueios que mobilizaram a opinião pública nacional. A pergunta "Por que rio diante de um lago?" captura o estranhamento de ambientalistas diante da lógica desenvolvimentista que orientava grandes intervenções em corpos hídricos. A polícia chegou a bloquear acessos a acampamentos em Pernambuco, evidenciando a escalada do conflito. + +A escassez hídrica e a desertificação receberam atenção contínua, com foco no Nordeste brasileiro e na África. A redução da vazão de vertentes na área rural de Santa Cruz do Sul ilustra como o estresse hídrico também afetava o Sul do país. A poluição de rios e nascentes, associada à ausência de saneamento básico, e a gestão costeira diante do avanço do mar completam o quadro de ameaças aos recursos hídricos. O Aquífero Guarani aparece como patrimônio estratégico transfronteiriço que demanda proteção. + +No plano internacional, a cobertura incluiu a iniciativa da Swiss Re de doar US$ 15 mil para recuperação de recursos hídricos, o fórum internacional sobre gestão da água em regiões em crise, e o polêmico plano chinês de desvio de rios no Tibete. O desenvolvimento de sistemas de suporte de decisão para gerenciamento hídrico indica a incorporação de tecnologia à governança da água. A Bacia do Prata e o Rio Uruguai, compartilhados com países vizinhos, reforçam a dimensão diplomática da gestão hídrica na América do Sul. + +### Títulos representativos + +- "Marina comemora cobrança de taxa" +- "Ciro Gomes defende transposição na reunião da SBPC" +- "Por que rio diante de um lago?" +- "Diminui a vazão das vertentes na área rural de Santa Cruz do Sul" +- "Tibet: o próximo alvo dos planos da China para desvio de rios" diff --git a/resumo/ciencia-e-tecnologia.md b/resumo/ciencia-e-tecnologia.md new file mode 100644 index 0000000..bafb480 --- /dev/null +++ b/resumo/ciencia-e-tecnologia.md @@ -0,0 +1,19 @@ +# Ciência e Tecnologia + +**6.277 artigos** | período 2001–2013 | abrangência: principalmente Nacional (54,8%), seguida por Internacional (31%) e Estadual (14,3%) + +A cobertura de ciência e tecnologia ambiental documenta a produção de conhecimento e inovação voltados à sustentabilidade. As pesquisas científicas brasileiras ocupam posição de destaque, abarcando desde inventários de biodiversidade — como o proposto inventário genético e o estudo do gênero *Lindsaea Smith* no Rio Grande do Sul — até análises de impacto do turismo desordenado no sul da Bahia. O acervo revela uma comunidade científica ativa, produzindo conhecimento aplicado à gestão ambiental. + +Os transgênicos constituem um dos debates científicos mais polarizados do período. A Argentina reclamou da exigência de rótulos para OGMs, enquanto o Brasil construía seu arcabouço regulatório. A biotecnologia aplicada à agricultura e à saúde gerou tanto entusiasmo quanto preocupações sobre biossegurança, com a cobertura refletindo o embate entre evidências científicas e o princípio da precaução. O Instituto de Pesquisas Tecnológicas (IPT) apostou no potencial brasileiro para produção de bioplásticos, sinalizando a convergência entre inovação e economia verde. + +Novos materiais sustentáveis ganharam visibilidade, como o tijolo ecológico feito a partir de lodo de estação de tratamento de água e bioplásticos derivados de fontes renováveis. A eficiência energética em dispositivos — a exemplo de um mecanismo que aumenta a eficiência de combustível em aeroplanos — ilustra a dimensão incremental da inovação tecnológica. Os sistemas de monitoramento, como o SIVAM e os satélites de observação terrestre, fortaleceram a capacidade brasileira de vigilância ambiental. + +O tratamento de efluentes e resíduos com novas tecnologias conecta a pesquisa acadêmica à solução de problemas concretos. A participação de estudantes de engenharia da Ulbra em uma "maratona ecológica" evidencia o engajamento da formação superior com a agenda ambiental. Patentes e inovação verde completam o quadro de uma cobertura que trata a ciência não como abstração, mas como ferramenta prática de transformação — ainda que as barreiras entre a bancada do laboratório e a escala comercial permaneçam como desafio subjacente. + +### Títulos representativos + +- "Dispositivo aumenta eficiência de combustível em aeroplano" +- "Argentina reclama de rótulo para transgênicos" +- "Brasil pode ser um dos grandes produtores de bioplástico, acredita IPT" +- "Turismo sem planejamento traz impactos ambientais no sul da Bahia, aponta pesquisa" +- "Cientistas propõem inventário genético da biodiversidade" diff --git a/resumo/combustiveis-fosseis.md b/resumo/combustiveis-fosseis.md new file mode 100644 index 0000000..fad0c46 --- /dev/null +++ b/resumo/combustiveis-fosseis.md @@ -0,0 +1,19 @@ +# Combustíveis Fósseis + +**4.761 artigos** | período 2001–2013 | abrangência: principalmente Nacional (42%), seguida por Internacional (39,2%) e Estadual (18,8%) + +A cobertura sobre combustíveis fósseis retrata o domínio do petróleo e seus derivados na matriz energética mundial. O petróleo ocupa o centro do noticiário, com amplo acompanhamento da exploração no pré-sal, das novas fronteiras na Amazônia e na costa brasileira, e da política de preços da OPEP. A Petrobras emerge como ator onipresente, seja anunciando o aumento da oferta de diesel menos poluente, seja negociando a compra de postos da Esso no Brasil e no Chile, ou advertindo que o preço do gás natural deve subir — declaração do próprio presidente da estatal. + +O gás natural ocupou posição estratégica, com destaque para o gasoduto Brasil-Bolívia e o gasoduto Coari-Manaus, este último regido pelo Princípio da Precaução em virtude dos impactos sobre ecossistemas amazônicos. O GNV veicular ganhou impulso em capitais brasileiras como alternativa mais limpa e econômica aos combustíveis líquidos. As termelétricas — a óleo, gás e carvão mineral — geraram intenso debate, especialmente no Sul do país, onde o carvão mineral tem peso histórico na economia regional, mas responde por emissões elevadas e críticas de ambientalistas. + +O debate internacional sobre o "peak oil" — a escassez inevitável de petróleo — permeou a cobertura do período, com analistas alertando para a finitude das reservas e a necessidade de transição energética. As decisões do governo George W. Bush, que suspendeu regras ambientais para gasolina em nome da segurança energética, ilustram como a política do petróleo se sobrepunha frequentemente às preocupações ambientais. Na África, a metáfora de que "gângsteres venceram a corrida do petróleo" denunciava a governança predatória dos recursos em países produtores. + +Acidentes com petróleo e derivados — vazamentos, explosões e contaminações — pontuam a cobertura como lembrete dos riscos inerentes à cadeia fóssil. A transição energética aparece como horizonte desejável, mas distante: o fim da era do petróleo é considerado inevitável por especialistas, porém os investimentos e a infraestrutura continuam ancorados nos combustíveis fósseis. A prospecção em áreas sensíveis, como o Acre e a costa brasileira, expõe a tensão permanente entre a demanda energética e a proteção de ecossistemas vulneráveis. + +### Títulos representativos + +- "Sai licença para gás natural veicular na Capital" +- "Bush suspende regras ambientais para gasolina" +- "Petrobras anuncia aumento da oferta de diesel menos poluente no país" +- "Escassez de petróleo já é considerada inevitável" +- "Princípio da Precaução rege a obra do gasoduto Coari-Manaus" diff --git a/resumo/crimes-ambientais.md b/resumo/crimes-ambientais.md new file mode 100644 index 0000000..b42cbbc --- /dev/null +++ b/resumo/crimes-ambientais.md @@ -0,0 +1,19 @@ +# Crimes Ambientais + +**4.823 artigos** | período 2003–2015 | abrangência: principalmente Nacional (65%), seguida por Estadual (24,7%) e Internacional (10,3%) + +A cobertura de crimes ambientais documenta a face mais sombria da relação entre sociedade e natureza no Brasil. O desmatamento ilegal na Amazônia é o crime mais reportado, com operações de grande escala como Curupira e Arco de Fogo mobilizando a Polícia Federal e o Ibama. O SIVAM detectava 85 aviões com voo irregular a cada mês, muitos deles envolvidos em garimpo e extração madeireira clandestina. A sofisticação das quadrilhas impressiona: madeira roubada em Rondônia e Amazonas era exportada com "notas frias" emitidas no Acre, e desfolhantes químicos foram empregados para acelerar o desmate no norte do Mato Grosso. + +A corrupção de servidores ambientais constitui um achado significativo da cobertura. Funcionários do Ibama foram acusados de conivência com madeireiras, e a Polícia investigou servidores de Ilhabela por crimes contra a administração ambiental. Esses casos revelam a vulnerabilidade institucional dos órgãos de fiscalização diante de esquemas que envolvem desde propinas até a falsificação de documentos fundiários para grilagem de terras públicas. A operação Curupira, no Mato Grosso, tornou-se um marco, e a cobertura acompanhou a política ambiental no estado um ano depois, avaliando seus legados e limitações. + +O tráfico de animais silvestres e a pesca predatória completam o tripé dos crimes contra a fauna. A pesca no rio Uruguai, que utilizava tecnologia de ponta — como sonares e redes de alta precisão —, ilustra como a atividade predatória se modernizou. A biopirataria de recursos genéticos, embora menos documentada, aparece como crime de difícil fiscalização e alto valor estratégico. Incêndios florestais criminosos, frequentemente associados à limpeza de pastagens e à especulação fundiária, agravam o quadro de degradação. + +Crimes contra comunidades tradicionais e indígenas, conflitos fundiários violentos e o confronto na fazenda da Syngenta — que resultou na decretação de prisão de seis pessoas — demonstram que os crimes ambientais frequentemente se entrelaçam com violações de direitos humanos. A cobertura revela um padrão: onde há crime ambiental, há também grilagem, corrupção e violência contra populações vulneráveis, em um ciclo que os aparatos de fiscalização e justiça enfrentam com resultados desiguais. A tartaruga rara que resistiu a uma "sessão de tortura" na Califórnia serve como lembrete de que a crueldade contra a fauna não conhece fronteiras. + +### Títulos representativos + +- "SIVAM detecta 85 aviões com voo irregular a cada mês" +- "Madeira roubada em Rondônia e Amazonas é exportada com nota do Acre" +- "Desfolhante químico usado em desmate no Nortão (MT)" +- "Polícia investiga servidores de Ilhabela por crime ambiental" +- "A política ambiental no Mato Grosso um ano depois da operação Curupira" diff --git a/resumo/desastres-naturais.md b/resumo/desastres-naturais.md new file mode 100644 index 0000000..34f7ce7 --- /dev/null +++ b/resumo/desastres-naturais.md @@ -0,0 +1,19 @@ +# Desastres Naturais + +**4.167 artigos** | período 2002–2013 | abrangência: principalmente Internacional (55,3%), seguida por Estadual (26,6%) e Nacional (18,1%) + +A cobertura de desastres naturais é dominada pelos grandes eventos sísmicos que marcaram o período. O terremoto seguido de tsunami no Oceano Índico, em 2004, com epicentro em Sumatra, desencadeou uma cobertura massiva sobre a dimensão da tragédia humana e ambiental. Outros terremotos devastadores — Caxemira em 2005, com até 86 mil mortos; China em 2008, ultrapassando 28,8 mil vítimas; Haiti em 2010; e Japão em 2011, com o acidente nuclear de Fukushima como desdobramento — consolidaram o tema na agenda do veículo. + +As erupções vulcânicas geraram reportagens de grande impacto visual e narrativo. O Etna, na Sicília, com sua erupção mais forte do período, e o vulcão Santa Helena, nos Estados Unidos, figuram entre os mais noticiados, ao lado de erupções na Indonésia e na Islândia — esta última paralisando o tráfego aéreo europeu. Furacões, especialmente o Katrina, que devastou Nova Orleans em 2005, revelaram a vulnerabilidade de países ricos a eventos extremos e expuseram desigualdades sociais na resposta a desastres. + +O Brasil comparece principalmente por meio de enchentes e deslizamentos. As tragédias de Santa Catarina em 2008 e do Rio de Janeiro em 2010 e 2011, com centenas de mortos em deslizamentos de encostas, expuseram a precariedade da ocupação urbana e a fragilidade dos sistemas de defesa civil. Temporais com granizo e tempestades severas no Sul do país, bem como secas prolongadas no Nordeste, completam o quadro dos desastres que mais afetam o território nacional. + +A Ásia foi declarada campeã de mortes por desastres naturais em 2006, e a ONU instou a América Latina a aumentar seus esforços de prevenção. Incêndios florestais catastróficos na Grécia, Califórnia e Austrália, assim como ondas de frio extremo — que fizeram 11 vítimas fatais na Bulgária — demonstram que os desastres naturais não obedecem a fronteiras climáticas ou econômicas. A cobertura documenta a transição gradual de uma abordagem reativa para uma ênfase crescente em prevenção e resiliência, ainda que os resultados concretos permaneçam aquém das necessidades. + +### Títulos representativos + +- "Terremoto na Sicília provoca erupção mais forte do Etna" +- "Mortos em terremoto na Caxemira podem chegar a 86 mil" +- "Número de mortos na China ultrapassa 28,8 mil" +- "ONU pede à América Latina que aumente esforços contra desastres" +- "Turcos rezam por chuva em meio a grande seca em Ancara" diff --git a/resumo/desenvolvimento-sustentavel.md b/resumo/desenvolvimento-sustentavel.md new file mode 100644 index 0000000..816f75d --- /dev/null +++ b/resumo/desenvolvimento-sustentavel.md @@ -0,0 +1,19 @@ +# Desenvolvimento Sustentável + +**3.628 artigos** | período 2002–2015 | abrangência: principalmente Nacional (49,2%), seguida por Internacional (25,5%) e Estadual (25,3%) + +A cobertura sobre desenvolvimento sustentável constitui o menor tema entre os 15 principais, mas sua relevância qualitativa transcende o volume. O acervo documenta a emergência de conceitos e práticas de sustentabilidade empresarial no Brasil, com empresas adotando relatórios GRI, índices Dow Jones de sustentabilidade e o tripple bottom line como métrica de desempenho. A Riocell obteve 98% de índice de reciclagem de resíduos sólidos, e a Philips foi apontada como líder em desenvolvimento autossustentável, casos que ilustram a entrada do setor privado na agenda ambiental. + +A responsabilidade socioambiental corporativa ganhou espaço em seminários como o de Joinville e em fóruns promovidos por órgãos como a Fepam. Certificações ambientais — ISO 14001, FSC e selos verdes — tornaram-se instrumentos de diferenciação competitiva e acesso a mercados exigentes. O terceiro setor e as ONGs ambientais emergem como atores que pressionam, mas também colaboram com empresas e governos na construção de modelos produtivos mais limpos. + +A Rio+20 e os Objetivos de Desenvolvimento do Milênio contextualizam o Brasil como anfitrião e protagonista de conferências multilaterais sobre sustentabilidade. O Plano Amazônia Sustentável (PAS), que incluiu o Maranhão, representou a tentativa de traduzir o conceito em política pública regional. Projetos de desenvolvimento local sustentável ganharam visibilidade por meio de iniciativas como a produção artesanal com palha de carnaúba, que mudou a realidade de mulheres no Rio Grande do Norte, e os quintais orgânicos apoiados pela Embrapa, conectando sustentabilidade a inclusão social e geração de renda. + +O consumo consciente e as mudanças de comportamento são abordados como dimensão individual da sustentabilidade, enquanto o ecoturismo e o turismo sustentável surgem como setores econômicos capazes de conciliar conservação e desenvolvimento. O Relatório Anual do Worldwatch, que alertava para padrões de consumo insustentáveis, forneceu o contraponto crítico ao otimismo empresarial. A cobertura revela, em seu conjunto, a transição do conceito de desenvolvimento sustentável de uma ideia abstrata para um campo de práticas, métricas e disputas — entre o greenwashing corporativo e as transformações efetivas nos modos de produzir e consumir. + +### Títulos representativos + +- "Seminário de Responsabilidade Social começa amanhã em Joinville" +- "Riocell obtém 98% de índice de reciclagem de resíduos sólidos" +- "Philips lidera desenvolvimento auto-sustentável" +- "Relatório Anual do Worldwatch alerta para consumo insustentável" +- "Produção artesanal com palha de carnaúba muda realidade de mulheres no RN" diff --git a/resumo/energia-atomica.md b/resumo/energia-atomica.md new file mode 100644 index 0000000..5923737 --- /dev/null +++ b/resumo/energia-atomica.md @@ -0,0 +1,19 @@ +# Energia Atômica + +**3.816 artigos** | período 2001–2013 | abrangência: principalmente Internacional (58,6%), seguida por Nacional (33,8%) e Estadual (7,6%) + +A cobertura sobre energia atômica é majoritariamente internacional, refletindo a concentração das usinas nucleares no exterior e a natureza geopolítica do tema. O programa nuclear brasileiro ocupa, ainda assim, um terço do noticiário, com as usinas de Angra 1, 2 e 3 no centro do debate. A conclusão de Angra III — que ainda precisaria de R$ 7,2 bilhões — dividiu opiniões entre os que viam a energia nuclear como necessária à segurança energética e os que apontavam seus custos, riscos e a existência de alternativas renováveis mais baratas e seguras. A ministra Dilma Rousseff defendeu publicamente a energia nuclear para garantir o crescimento econômico, posicionamento que ganhou peso quando ela ascendeu à Presidência. + +Os acidentes nucleares constituem o fio mais dramático da cobertura. Chernobyl, ocorrido em 1986, continuou gerando notícias décadas depois, com o surgimento dos primeiros casos de câncer no Brasil decorrentes da contaminação transcontinental — um achado que sublinha a escala planetária dos riscos nucleares. O acidente de Fukushima, em 2011, provocado pelo terremoto e tsunami no Japão, reacendeu o debate global sobre segurança nuclear, com falhas que comprometeram a credibilidade da política nuclear japonesa e levaram países como a Alemanha a acelerar o abandono da fonte atômica. + +A proliferação nuclear e as tensões geopolíticas associadas receberam cobertura intensa. Os programas nucleares do Irã e da Coreia do Norte, assim como a rivalidade Índia-Paquistão, foram tratados como ameaças à estabilidade global. O fato de o Brasil ter capacidade técnica para produzir ogivas nucleares — embora constitucionalmente vedado — foi noticiado como elemento de análise do programa nuclear nacional. Os Estados Unidos, que consomem 32% da energia mundial, figuravam como potência nuclear estabelecida, enquanto a Austrália estudava a construção de sua primeira usina. + +Os resíduos radioativos e seu armazenamento de longo prazo emergem como problema sem solução definitiva em nenhum país, sendo descritos como "incômodo à Suécia" e a outras nações que operam usinas. O debate entre energia nuclear e renováveis perpassa a cobertura, com a eficiência energética sendo apresentada como alternativa frequentemente negligenciada. A França, o Japão e os EUA são os países cujas políticas nucleares receberam maior escrutínio, em um noticiário que oscila entre a confiança tecnológica e a consciência dos riscos catastróficos inerentes à fissão nuclear. + +### Títulos representativos + +- "Surgem os primeiros casos de câncer no Brasil decorrentes de Chernobyl" +- "Dilma Rousseff defende energia nuclear para garantir crescimento" +- "Angra 3 ainda precisará de R$ 7,2 bilhões" +- "Resíduos nucleares são incômodo à Suécia" +- "Falhas podem comprometer credibilidade da política nuclear no Japão" diff --git a/resumo/energia-renovavel.md b/resumo/energia-renovavel.md new file mode 100644 index 0000000..87d1c2c --- /dev/null +++ b/resumo/energia-renovavel.md @@ -0,0 +1,19 @@ +# Energia Renovável + +**8.544 artigos** | período 2001–2013 | abrangência: principalmente Nacional (55,2%), seguida por Internacional (25,9%) e Estadual (18,8%) + +A cobertura sobre energia renovável documenta a ascensão das fontes limpas na matriz energética brasileira e global. O parque eólico de Osório, no Rio Grande do Sul, tornou-se o caso emblemático de geração eólica no país, com sua inauguração sendo amplamente noticiada. A energia solar também ganhou espaço, desde aquecedores residenciais até grandes plantas, com destaque para inovações como o sistema criado por um cientista israelense que tornou a fonte mais competitiva. A biomassa e o biogás, especialmente oriundos da suinocultura e de aterros sanitários, despertaram o interesse de produtores rurais e atraíram investimentos de grupos alemães no Rio Grande do Sul. + +Os biocombustíveis ocupam posição central na narrativa. O presidente Lula apostou no biodiesel como sucessor do Proálcool, afirmando que superaria o programa alcooleiro. A mamona foi alçada a carro-chefe do Programa Nacional de Biodiesel (PNPB), enquanto o etanol de cana-de-açúcar consolidou-se como referência mundial. Contudo, o tema não escapou de controvérsias: a ONU apontou os biocombustíveis como principal causa da crise alimentar global, e o presidente da Petrobras classificou a produção norte-americana de biocombustível como insustentável, alimentando o debate "food vs fuel". + +As grandes hidrelétricas na Amazônia — Belo Monte, Jirau e Santo Antônio — geraram intensa controvérsia, com ecologistas da Bolívia questionando os impactos das represas brasileiras no Rio Madeira e suspeitas de corrupção cercando o processo de ampliação de Yacyretá. As pequenas centrais hidrelétricas (PCHs) aparecem como alternativa de menor impacto, embora com menor destaque na cobertura. O hidrogênio como vetor energético e a energia dos oceanos e geotérmica figuram como promessas tecnológicas ainda incipientes no período. + +O investimento estrangeiro em renováveis no Brasil, vindo especialmente da Alemanha e de outros países europeus, sinaliza a atratividade do mercado brasileiro. A cobertura revela, em suma, um país que se percebe como potência das energias limpas, mas que enfrenta desafios de burocracia, conflitos socioambientais e tensões entre a escala industrial das renováveis e seus impactos locais. + +### Títulos representativos + +- "Parque eólico de Osório opera até o fim do mês" +- "Lula reclama da burocracia e diz que biodiesel irá superar Proálcool" +- "Biocombustível foi principal causa da crise alimentar, diz ONU" +- "Cientista israelense cria sistema que torna energia solar mais competitiva" +- "Ecologistas da Bolívia questionam represas brasileiras no Rio Madeira" diff --git a/resumo/fauna-e-flora.md b/resumo/fauna-e-flora.md new file mode 100644 index 0000000..4f870e8 --- /dev/null +++ b/resumo/fauna-e-flora.md @@ -0,0 +1,19 @@ +# Fauna e Flora + +**14.086 artigos** | período 2001–2015 | abrangência: principalmente Nacional (50,7%), seguida por Estadual (26%) e Internacional (23,3%) + +A cobertura sobre fauna e flora constitui o segundo maior tema do acervo e oferece um panorama amplo da biodiversidade brasileira e mundial. As matérias documentam espécies ameaçadas de extinção em diversos biomas, como as abelhas nativas da Bahia, e acompanham projetos de reintrodução e conservação conduzidos por instituições de pesquisa e ONGs. O Ibama incentivou ativamente a criação comercial de animais silvestres como estratégia para reduzir a pressão sobre populações selvagens, uma política que gerou debates entre conservacionistas e setores produtivos. + +O desmatamento na Amazônia e na Mata Atlântica é uma constante na cobertura, retratado tanto por seus impactos sobre ecossistemas quanto pelas políticas públicas de enfrentamento. As queimadas e os incêndios florestais, muitos deles associados à expansão agropecuária, figuram como ameaças recorrentes à flora nativa. Em contraponto, iniciativas de reflorestamento ganham visibilidade, como o plantio de árvores por estudantes no antigo lixão de Passo Fundo, evidenciando a dimensão pedagógica e comunitária da recuperação ambiental. + +As unidades de conservação — florestas nacionais, Áreas de Proteção Ambiental (APAs) e Reservas Particulares do Patrimônio Natural (RPPNs) — são tema frequente, com destaque para o leilão da Floresta do Jamari e a gestão de áreas protegidas nos três níveis de governo. Os recifes de corais receberam atenção tanto por sua riqueza biológica, como o recife de 100 km² descoberto na Austrália, quanto pelos riscos de extinção decorrentes de poluentes e mudanças climáticas. + +A biopirataria e o tráfico de animais silvestres emergem como problemas de escala global, enquanto espécies exóticas invasoras preocupam gestores ambientais. A pesquisa científica com fauna ganha espaço com estudos como o de um gaúcho que traçou a evolução dos felinos. No plano internacional, a cobertura celebra eventos como o baby-boom de focas no norte da Alemanha e a descoberta de comunidades raras de ursos panda na China, reforçando o caráter universal do interesse pela conservação da vida selvagem. + +### Títulos representativos + +- "Abelhas nativas da Bahia estão ameaçadas de extinção" +- "Descoberto recife de coral com 100 km² na Austrália" +- "Ibama incentiva a criação comercial de animais silvestres" +- "Gaúcho traça evolução de felinos" +- "Estudantes plantam árvores no antigo lixão de Passo Fundo" diff --git a/resumo/index.md b/resumo/index.md new file mode 100644 index 0000000..a185246 --- /dev/null +++ b/resumo/index.md @@ -0,0 +1,40 @@ +# Acervo Ambiente JA — Resumo por Tema + +Base de **170.273 notícias ambientais** em português brasileiro, cobrindo o período de **janeiro de 2001 a outubro de 2015**. Abaixo, um resumo detalhado de cada um dos 15 principais temas. + +| # | Tema | Artigos | Link | +|---|------|---------|------| +| 1 | Legislação e Governo | 27.835 | [legislacao-e-governo.md](legislacao-e-governo.md) | +| 2 | Fauna e Flora | 14.086 | [fauna-e-flora.md](fauna-e-flora.md) | +| 3 | Mudanças Climáticas | 8.645 | [mudancas-climaticas.md](mudancas-climaticas.md) | +| 4 | Energia Renovável | 8.544 | [energia-renovavel.md](energia-renovavel.md) | +| 5 | Água | 6.435 | [agua.md](agua.md) | +| 6 | Ciência e Tecnologia | 6.277 | [ciencia-e-tecnologia.md](ciencia-e-tecnologia.md) | +| 7 | Resíduos/Lixo | 6.141 | [residuos-lixo.md](residuos-lixo.md) | +| 8 | Saúde e Meio Ambiente | 6.088 | [saude-e-meio-ambiente.md](saude-e-meio-ambiente.md) | +| 9 | Agropecuária | 4.973 | [agropecuaria.md](agropecuaria.md) | +| 10 | Crimes Ambientais | 4.823 | [crimes-ambientais.md](crimes-ambientais.md) | +| 11 | Combustíveis Fósseis | 4.761 | [combustiveis-fosseis.md](combustiveis-fosseis.md) | +| 12 | Desastres Naturais | 4.167 | [desastres-naturais.md](desastres-naturais.md) | +| 13 | Poluição | 4.142 | [poluicao.md](poluicao.md) | +| 14 | Energia Atômica | 3.816 | [energia-atomica.md](energia-atomica.md) | +| 15 | Desenvolvimento Sustentável | 3.628 | [desenvolvimento-sustentavel.md](desenvolvimento-sustentavel.md) | + +> **Nota:** 26.862 artigos (15,8%) não possuem tema principal atribuído. A tabela completa está disponível em `ambienteja.duckdb`. + +## Distribuição temporal + +| Período | Artigos/ano | +|----------|-------------| +| 2001–2006 | ~14.000 | +| 2007–2008 | ~25.000 (pico) | +| 2009–2010 | ~14.000 | +| 2011–2015 | declínio até ~120/ano | + +## Abrangência + +| Escopo | Artigos | % | +|--------|---------|---| +| Nacional | 79.438 | 46,7% | +| Estadual | 50.640 | 29,7% | +| Internacional | 40.165 | 23,6% | diff --git a/resumo/legislacao-e-governo.md b/resumo/legislacao-e-governo.md new file mode 100644 index 0000000..5aded9c --- /dev/null +++ b/resumo/legislacao-e-governo.md @@ -0,0 +1,19 @@ +# Legislação e Governo + +**27.835 artigos** | período 2001–2014 | abrangência: principalmente Nacional (64,5%), seguida por Estadual (30%) e Internacional (5,4%) + +Este é o maior tema do acervo, refletindo a centralidade das instituições públicas na agenda ambiental brasileira. A cobertura concentra-se fortemente na atuação do Ibama, cujas operações de fiscalização e licenciamento ambiental geraram volumes expressivos de notícias. As frequentes greves de servidores do órgão — rotuladas de "molecagem" em editorial do jornal *O Estado de São Paulo* — evidenciam as tensões internas de uma autarquia-chave para a execução da política ambiental. O Ibama aparece tanto como protagonista de grandes operações quanto como alvo de críticas por morosidade e conflitos com setores produtivos. + +O Ministério do Meio Ambiente (MMA), sob diferentes gestões ao longo do período, ocupa posição de destaque com a formulação de políticas como a Política Nacional de Biodiversidade e a instalação de comitês estratégicos, a exemplo do comitê no Pará. As Conferências Nacionais do Meio Ambiente emergem como espaços de participação social, enquanto audiências públicas e consultas populares pautam decisões sobre empreendimentos controversos. No Congresso Nacional, os debates mais acalorados giraram em torno da reforma do Código Florestal, da Lei de Crimes Ambientais e da regulação dos transgênicos, com embates entre bancadas ruralista e ambientalista. + +O Ministério Público Federal e os MPs estaduais consolidaram-se como atores centrais da governança ambiental, movendo ações civis públicas e firmando termos de ajustamento de conduta com empresas e governos. O Zoneamento Ecológico-Econômico (ZEE), especialmente na Amazônia, foi instrumento recorrente de ordenamento territorial, assim como a criação e gestão de Unidades de Conservação federais e estaduais. Nos estados, as legislações de São Paulo, Rio Grande do Sul, Santa Catarina, Paraná, Minas Gerais e Pará receberam atenção específica, assim como a atuação de câmaras municipais na aprovação de leis ambientais locais. + +O Conselho Nacional de Política Energética (CNPE) integrou a pauta ao deliberar sobre Angra III e o incentivo a termelétricas, evidenciando a intersecção entre política energética e meio ambiente. A repartição de benefícios do patrimônio genético, debatida pelo CGEN, e incentivos fiscais para áreas rurais preservadas completam o quadro de uma cobertura que documenta os embates entre governadores, ministros e ambientalistas na construção da arquitetura legal-ambiental do país. + +### Títulos representativos + +- "Conselho de Política Energética discute conclusão de Angra III" +- "Aprovado incentivo a termelétricas" +- "Dom Cappio cobra encontro e ameaça nova greve" +- "Ibama concede licença de operação a rodovias federais no Sudeste e no Sul" +- "Senadora quer ampliar incentivo fiscal para áreas rurais preservadas" diff --git a/resumo/mudancas-climaticas.md b/resumo/mudancas-climaticas.md new file mode 100644 index 0000000..744e75b --- /dev/null +++ b/resumo/mudancas-climaticas.md @@ -0,0 +1,19 @@ +# Mudanças Climáticas + +**8.645 artigos** | período 2003–2013 | abrangência: principalmente Internacional (74%), seguida por Nacional (21,4%) e Estadual (4,5%) + +A cobertura sobre mudanças climáticas é marcadamente internacional, refletindo a natureza global do problema. As Conferências do Clima da ONU (COPs) constituem o fio condutor da narrativa, com ampla cobertura das negociações multilaterais. O Protocolo de Kyoto e as discussões sobre o regime climático pós-2012 dominam o noticiário, com embates entre países desenvolvidos e em desenvolvimento sobre responsabilidades comuns mas diferenciadas. Os relatórios do IPCC, especialmente o quarto e o quinto, são tratados como marcos científicos que fundamentam a urgência da ação climática. + +As posições dos grandes emissores recebem escrutínio constante. A expectativa de que o presidente George W. Bush mudasse sua posição sobre a mudança climática ilustra a politização do tema nos Estados Unidos, enquanto a transição para a administração Obama trouxe novas perspectivas. China, Índia e União Europeia completam o tabuleiro geopolítico, com cientistas chineses atribuindo ao efeito estufa a redução de rios no país e a Agência Internacional de Energia cobrando revisão de ações para suavizar o aquecimento global. + +No Brasil, a cobertura enfoca o desmatamento como principal fonte de emissões e as metas internas de redução que o país se comprometeu a anunciar. O mercado de créditos de carbono e o Mecanismo de Desenvolvimento Limpo (MDL) geraram intenso debate entre advogados, empresas e ambientalistas sobre a viabilidade de instrumentos econômicos para mitigação. As energias renováveis são apresentadas como resposta estrutural, conectando este tema à pauta de transição energética. + +Os eventos extremos — degelo no Ártico, elevação do nível do mar, ondas de calor — dão concretude às projeções climáticas. O apelo da ONU para que governos "salvem o planeta" sintetiza o tom de urgência predominante. A cobertura também refuta o negacionismo, sustentando-se nos consensos científicos e nos alertas de organismos multilaterais sobre um planeta "cada vez mais habitado e quente". + +### Títulos representativos + +- "Cientistas esperam que Bush mude sua posição sobre a mudança climática" +- "Um planeta cada vez mais habitado e quente" +- "Advogados discutem mercado de créditos de carbono" +- "Brasil deve anunciar metas internas de redução das emissões" +- "ONU pede para governos 'salvarem o planeta' em conferência climática" diff --git a/resumo/poluicao.md b/resumo/poluicao.md new file mode 100644 index 0000000..c77d877 --- /dev/null +++ b/resumo/poluicao.md @@ -0,0 +1,19 @@ +# Poluição + +**4.142 artigos** | período 2002–2013 | abrangência: distribuída entre Nacional (35,3%), Internacional (35,1%) e Estadual (29,6%) + +A cobertura sobre poluição se caracteriza por uma distribuição equilibrada entre as três esferas de abrangência, refletindo um problema que é simultaneamente local, nacional e global. A poluição hídrica domina o noticiário brasileiro, e o Rio dos Sinos, no Rio Grande do Sul, tornou-se o caso-símbolo de degradação e mobilização social. Os protestos que "transformaram a Klabin Riocell" e a missão oficial que visitou a Holanda e a Inglaterra para buscar soluções ilustram como crises ambientais locais catalisaram respostas institucionais e comunitárias. + +Outros corpos hídricos gravemente afetados receberam atenção contínua. O Arroio Pampa, em Novo Hamburgo, apareceu coberto por uma camada branca de poluentes; a Baía de Guanabara e o Rio Tietê, com o Projeto Tietê, simbolizaram a luta contra a poluição em centros metropolitanos. A poluição por metais pesados e organoclorados, frequentemente associada a passivos industriais históricos, e os derramamentos de óleo e produtos químicos em rios e mares completam o quadro de agressões aos ecossistemas aquáticos. + +A poluição atmosférica mereceu cobertura expressiva, especialmente no que diz respeito à qualidade do ar em São Paulo e às emissões veiculares. O Detran do Rio de Janeiro passou a controlar a emissão de gases poluentes nos veículos, sinalizando a entrada do tema na esfera regulatória. Um estudo surpreendente revelou que o cigarro polui mais do que alguns motores a diesel, reposicionando o debate sobre poluentes em ambientes fechados. A poluição sonora e visual nos centros urbanos também foi abordada, com alertas de que o barulho excessivo pode causar desde estresse até quadros de ansiedade. + +Eventos insólitos pontuaram a cobertura internacional: a neve amarela que assustou populações em partes da Sibéria e a barragem nos Estados Unidos rompida lentamente para recuperar uma área extremamente poluída. A poluição industrial, com casos envolvendo empresas como Klabin Riocell, Aracruz e termelétricas, revela a tensão permanente entre atividade produtiva e saúde ambiental. O monitoramento e os padrões de qualidade emergem como instrumentos técnicos indispensáveis, ainda que sua efetividade dependa da vontade política de fiscalizar e punir. + +### Títulos representativos + +- "Protestos transformaram Klabin Riocell" +- "Camada branca cobre o arroio Pampa em Novo Hamburgo" +- "Detran controlará emissão de gases poluentes nos veículos do Rio" +- "Neve amarela assusta população em partes da Sibéria" +- "Cigarro polui mais do que alguns motores" diff --git a/resumo/residuos-lixo.md b/resumo/residuos-lixo.md new file mode 100644 index 0000000..dc6c77e --- /dev/null +++ b/resumo/residuos-lixo.md @@ -0,0 +1,19 @@ +# Resíduos/Lixo + +**6.141 artigos** | período 2001–2014 | abrangência: principalmente Estadual (54,8%), seguida por Nacional (34,8%) e Internacional (10,3%) + +A cobertura sobre resíduos tem forte ancoragem local, com a predominância estadual revelando que o lixo é, antes de tudo, um problema de gestão municipal e regional. A desativação de lixões e sua substituição por aterros sanitários constitui a narrativa mais recorrente, com casos emblemáticos como o início do processo de desativação do lixão de Taquara e a interdição judicial do Aterro Santa Tecla. Esses episódios ilustram a transição — lenta e conflituosa — de um modelo de disposição inadequada para soluções tecnicamente corretas. + +A coleta seletiva e a reciclagem são abordadas em suas múltiplas dimensões: ambiental, social e econômica. Os catadores e suas cooperativas ganham visibilidade como atores centrais da cadeia de reciclagem, enquanto a logística reversa emerge como conceito-chave com a Política Nacional de Resíduos Sólidos. A destinação de resíduos específicos — pneus, pilhas, baterias e lixo eletrônico — revela a complexidade crescente da gestão de materiais pós-consumo. A Univias inovou ao utilizar asfalto produzido a partir de pneus usados, e uma tecnologia brasileira de redução e desidratação de lixo foi implantada em Niterói. + +Os resíduos perigosos ocupam um capítulo à parte. A incineração de PCBs e o caso da Bayer em Belford Roxo trouxeram à tona os riscos do passivo químico-industrial. O biogás gerado pela suinocultura e por aterros sanitários despertou o interesse de produtores, conciliando o tratamento de resíduos com a geração de energia. Resíduos industriais e hospitalares completam o leque de preocupações sanitárias e ambientais associadas ao descarte. + +A compostagem e o aproveitamento de lodo de estações de tratamento de água para a produção de tijolos ecológicos demonstram a busca por soluções integradas que transformam passivos em ativos. Painelistas defenderam prioridade política para o tratamento de resíduos, e a remoção de lixo industrial iniciada em Caxias do Sul simboliza a gradativa responsabilização do setor produtivo. A cobertura evidencia, em suma, um país que começou a enfrentar seu lixo como problema de política pública, mas ainda distante de uma solução abrangente. + +### Títulos representativos + +- "Univias utiliza asfalto produzido a partir de pneus usados" +- "Taquara começa processo de desativação de lixão" +- "Painelistas defendem prioridade política para tratamento de resíduos" +- "Pesquisador constrói tijolo ecológico com lodo de ETA" +- "Aterro Santa Tecla é interditado pela Justiça" diff --git a/resumo/saude-e-meio-ambiente.md b/resumo/saude-e-meio-ambiente.md new file mode 100644 index 0000000..12a0f04 --- /dev/null +++ b/resumo/saude-e-meio-ambiente.md @@ -0,0 +1,19 @@ +# Saúde e Meio Ambiente + +**6.088 artigos** | período 2001–2015 | abrangência: distribuída entre Nacional (33,8%), Internacional (33,6%) e Estadual (32,6%) + +A interseção entre saúde e meio ambiente recebe uma cobertura equilibrada entre as três esferas de abrangência, refletindo tanto a dimensão local dos problemas sanitários quanto seu alcance global. A poluição do ar e seus efeitos na saúde respiratória das populações urbanas constituem uma linha de força do noticiário, com estudos que surpreenderam ao revelar que o cigarro polui mais do que alguns motores a diesel, reposicionando o debate sobre qualidade do ar em ambientes fechados. + +Os agrotóxicos são tratados como grave problema de saúde pública. Intoxicações agudas e crônicas de trabalhadores rurais, especialmente no Paraná e em outros estados agrícolas, são documentadas ao lado de estudos que associam a exposição prolongada a casos de câncer. O amianto mereceu campanhas dedicadas, com a Associação Brasileira dos Expostos ao Amianto (ABREA) promovendo o "Tribunal do Amianto" em São Paulo, em uma estratégia de mobilização social que mesclava denúncia e advocacy pelo banimento do mineral. + +A gripe aviária (H5N1) dominou as manchetes de saúde ambiental global no período, com a confirmação de mortes em países como o Iraque e estudos sobre a concentração do vírus na garganta humana. O tom de alerta sanitário se estendeu à dengue, cuja forma mais letal subiu 500% no Rio de Janeiro, e a outras doenças tropicais associadas a condições precárias de saneamento. A contaminação por metais pesados — chumbo, mercúrio e manganês, este último no controverso caso do MMT — expôs a vulnerabilidade de comunidades próximas a atividades extrativas e industriais. + +A qualidade da água para consumo humano emergiu em escândalos como o dos voos nos Estados Unidos que serviam água contaminada por coliformes, e a Europa lançou alerta para dioxina em goma guar importada da Índia, evidenciando a dimensão transfronteiriça da segurança alimentar. As estações de rádio-base de telefonia celular geraram impasse legislativo e mobilização comunitária sobre os efeitos da radiação não ionizante na saúde, em um debate que opôs a expansão da infraestrutura de telecomunicações ao princípio da precaução. + +### Títulos representativos + +- "Impasse na votação sobre estações de rádio-base" +- "ABREA promove Tribunal do Amianto em São Paulo" +- "Confirmada mais uma morte por gripe aviária no Iraque" +- "Dengue mais letal sobe 500% no Rio" +- "Vôos nos EUA servem água contaminada por coliformes" diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index fb57ccd..0000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - -