Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como fazer API melhor que o governo?

Duke
April 24, 2013

Como fazer API melhor que o governo?

Duke

April 24, 2013
Tweet

More Decks by Duke

Other Decks in Programming

Transcript

  1. Como fazer API melhor que o governo*? 1 Não que

    seja algo difícil...
  2. 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
  3. 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.
  4. ProjdeLei Utopia api-camara api-metrosp Adote Um Pedido 4 na THacker

    fiz alguns projetos, todos open source e estão no meu github
  5. /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)
  6. 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)
  7. * 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. 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.
  9. # 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
  10. # 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
  11. # 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
  12. # 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
  13. [ { "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
  14. # 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)
  15. # 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)
  16. # 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)
  17. # 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)
  18. { "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
  19. 13 Com um texto fantástico, que termina com isso.

  20. 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.
  21. 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?
  22. 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
  23. 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
  24. # 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
  25. 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
  26. meuportaldatransparencia.com/laws meuportaldatransparencia.com/laws/:id 19 Ele já vai criar as rotas para

    vocês e expor em xml e json
  27. 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
  28. Duke github.com/dukex github.com/vertigem [email protected] 21 Meu tempo acabou...