Share
Embed
Transcript
28 slides
-
Como fazer API melhor que o governo*? 1 Não que
seja algo difícil... -
Duke github.com/dukex github.com/vertigem [email protected] 2 Links para meu github. Projetos
open sources que contribuou e alguns projetos sobre open data, bibliotecas ruby, etc. Meu email -
groups.google.com/group/thackday Transparência Hacker 3 Transparecia Hacker, comunidade de jornalistas, hacker,
advogados, curiosos, etc. Estão trabalhando por mais transparência publica. -
ProjdeLei Utopia api-camara api-metrosp Adote Um Pedido 4 na THacker
fiz alguns projetos, todos open source e estão no meu github -
/abrindo-dados-na-unha /raspagem-de-dados-com-ruby speakerdeck.com/dukex 5 apresentação sobre minha experiência com open
data (TDC-SP) apresentação sobre raspagem de dados(como faço) (WeWebConf - Itajubá-MG) -
Como fazer API melhor que o governo*? 6 O governo,
por padrão, não sabe criar aplicações/api interessantes (meu ponto de vista) -
* wiki.gtinda.ibge.gov.br/ ProdutoGT3_ArquiteturaTecnicaReferencialDeAbe rturaDeDados.ashx 7 Mas existe exceções, um documento
da INDA de referencia, infelizmente coisas boas são exceções -
8 Hoje acordei querendo fazer uma API para o ProjDeLei,
(projdelei é um projeto...) se eu fosse o governo, geraria, por mês, um PDF com esses dados, e nos melhores casos CSV ou Excel e ficaria feliz por ser transparente. OpenData não é sobre apenas ser transparente tem a ver com a forma que faz isso também. -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 9 usando uma gem chamada grape, criou o recurso /laws e no get dele (click) pego todos os projeto de lei.(click) ordeno do mais novo para o mais velho(click) removo alguns atributos. id por questão de segurança, was_shared por que é valido apenas para os posts do twitter -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 9 usando uma gem chamada grape, criou o recurso /laws e no get dele (click) pego todos os projeto de lei.(click) ordeno do mais novo para o mais velho(click) removo alguns atributos. id por questão de segurança, was_shared por que é valido apenas para os posts do twitter -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 9 usando uma gem chamada grape, criou o recurso /laws e no get dele (click) pego todos os projeto de lei.(click) ordeno do mais novo para o mais velho(click) removo alguns atributos. id por questão de segurança, was_shared por que é valido apenas para os posts do twitter -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 9 usando uma gem chamada grape, criou o recurso /laws e no get dele (click) pego todos os projeto de lei.(click) ordeno do mais novo para o mais velho(click) removo alguns atributos. id por questão de segurança, was_shared por que é valido apenas para os posts do twitter -
[ { "explication": "Altera os arts. 5\u00ba e 6\u00ba da
Lei...", "link": "http://www.camara.gov.br/sileg/Prop_Detalhe.asp? id=573701", "pl_id": 573701, "proposition": "PL 5434/2013" }, { "explication": "Institui o Dia Nacional da Mandioca.", "link": "http://www.camara.gov.br/sileg/Prop_Detalhe.asp? id=573677", "pl_id": 573677, "proposition": "PL 5433/2013" }, ... ] 10 e tenho algo assim -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 11 para pegar um recurso unico, (click)busco o recurso pelo id, vai retornar uma collection então pego o primeiro, esse pl_id é unico e vem da camara(click) excluou os campos desnecessários (da para otimizar isso, mas não é o caso) -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 11 para pegar um recurso unico, (click)busco o recurso pelo id, vai retornar uma collection então pego o primeiro, esse pl_id é unico e vem da camara(click) excluou os campos desnecessários (da para otimizar isso, mas não é o caso) -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 11 para pegar um recurso unico, (click)busco o recurso pelo id, vai retornar uma collection então pego o primeiro, esse pl_id é unico e vem da camara(click) excluou os campos desnecessários (da para otimizar isso, mas não é o caso) -
# api.rb module ProjDeLei class API < Grape::API format :json
resource :laws do get do # /laws @laws = LawProject.all(order: [ :id.desc ]) @laws.to_json(exclude: [:id, :was_shared]) end get ':id' do # /laws/:id @law = LawProject.all(pl_id: params[:id]) .first @law.to_json(exclude: [:id, :was_shared]) end end end end 11 para pegar um recurso unico, (click)busco o recurso pelo id, vai retornar uma collection então pego o primeiro, esse pl_id é unico e vem da camara(click) excluou os campos desnecessários (da para otimizar isso, mas não é o caso) -
{ "explication": "Institui o Dia Nacional da Mandioca.", "link": "http://www.camara.gov.br/sileg/
Prop_Detalhe.asp?id=573677", "pl_id": 573677, "proposition": "PL 5433/2013" } 12 e tenho algo assim. É interessante essa coisa do OpenData, vc descobre coisas no mínimo estranhas, como um projeto de lei que cria o dia nacional da mandioca -
github.com/dukex/projdelei api.projetodelei.vertigem.xxx/laws api.projetodelei.vertigem.xxx/laws/573677 14 Para quem quiser ver o codigo
real, esta lá no meu github. em produção o endpoint é api.projetodelei.vertigem.xxx. O projdelei é BEM pequeno, banco de dados do governo são bem mais complexos. -
E se meu projeto fosse maior? Tipo um do governo!
15 Tem como fazer algo fácil ou perto disso? Será esse o motivo dos portais de transparência serem tão ruins? -
Utopia 16 Não é minha utopia, é um projeto que
comecei a um tempo tocar. A idéia é facilitar a abertura de dados. Projeto criado com base no documento referencia da INDA -
Utopia github.com/vertigem/utopia 16 Não é minha utopia, é um projeto
que comecei a um tempo tocar. A idéia é facilitar a abertura de dados. Projeto criado com base no documento referencia da INDA -
# install rails $ gem install rails # create a
rails app $ rails new portaldetransparencia-xpto # enter in created project $ cd portaldetransparencia-xpto # install the dependencies $ bundle istall # edit with Gemfile gem 'utopia_data' gem "inherited_resources" gem "roar-rails" # install utopia $ bundle istall 17 Basicamente, e temporariamente, ele roda por cima do Rails, então basta criar um aplicação rails, e depois setar o utopia-data como dependência -
UtopiaData.register :law do end UtopiaData.register :law do model do default_scoped
order('created_at') end end UtopiaData.register :law do table_name "S1A24" end UtopiaData.register :law do attributes do set :number set :author end end 18 Depois Basta dizer qual recurso quer expor e configura-lo. Um banco read-only é interessante -
meuportaldatransparencia.com/laws meuportaldatransparencia.com/laws/:id 19 Ele já vai criar as rotas para
vocês e expor em xml e json -
ckan.org open-source data portal platform dados.gov.br 20 o Ckan é
um cara que faz bem mais que isso é um plataforma inteira, vale a pena dar um olhada, o dados.gov.br usa ele