datajud 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10c59cd9f52f93532e97686b95b2ce3a5f482c6cd42c7b110a860c21e60c268b
4
- data.tar.gz: 7886282868f709f225b981e62932985630387d120020d0b0ebe962c6251fc695
3
+ metadata.gz: 5df3f8cadbf3eb0e40ba6891207bc56a076e5624e171cd99e1fef1ee66cf1696
4
+ data.tar.gz: bfc125d69fb6a639afbc0891db64d301209cf7901e14a8fee82477623e521153
5
5
  SHA512:
6
- metadata.gz: 80e24e11e26c39faff385fa928f7f8b6125ed307bd40b5826527c75a09e30f51e7265213bcbe7c1ef30c2c15e86a2d0367f580d132f7e4587bd703ef1f4fc0fa
7
- data.tar.gz: 29fb5433cf555e0df1df5f1a3f79f52a50c53a946ea5de7ce2c0a36107c99613fb304d0a0bf99a665bc587857d4cc4e7dc1c5c03389e39d59c6f551a08b181e6
6
+ metadata.gz: 6ad607e3b195cc8055bcad7b5e77854694a91297f86af88391ccd4c13cdeac5a49394315a9a0120dde19f49507526c41849ffe7ad3fc6ed2019ad921d74ad8dd
7
+ data.tar.gz: f9b89ba96631fa69025ae5d6b52a5cc142c4026aaccb5f1397b3459a502a5189eb9e9cc48bcdd1046b7f78cdc461697b8f6e915728e73105d51907f995afcdae
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.4] - 2026-03-12
4
+
5
+ - Todos os atributos e subatributos do processo agora podem ser acessados por ponto (OpenStruct), sem classes manuais.
6
+
7
+ ## [0.1.3] - 2026-03-12
8
+
9
+ - Exposed object-oriented accessors for nested attributes (ex.: `processo.vara.nome`).
10
+ - Standardized on `andamentos` and removed the `movimentacoes` alias.
11
+
12
+ ## [0.1.2] - 2026-03-12
13
+
14
+ - Added `Datajud.find` to return process data via an object-oriented API.
15
+
3
16
  ## [0.1.0] - 2025-11-25
4
17
 
5
18
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- datajud (0.1.2)
4
+ datajud (0.1.3)
5
5
  json (~> 2.0)
6
6
  net-http (~> 0.3)
7
7
  nokogiri (~> 1.14)
data/README.md CHANGED
@@ -19,19 +19,35 @@ If bundler is not being used to manage dependencies, install the gem by executin
19
19
  ```ruby
20
20
  require 'datajud'
21
21
 
22
+ # Busca processo (tribunal pode ser explícito ou inferido)
22
23
  processo = Datajud.find("00008323520184013202")
23
-
24
- # Com tribunal explícito
25
24
  processo = Datajud.find("00008323520184013202", tribunal: "trf1")
26
25
 
27
- processo.numero
28
- processo.classe
29
- processo.partes
30
- processo.movimentacoes
31
-
32
- # Tribunal como objeto
33
- processo.tribunal
34
- # => { nome: "TRF1", sigla: "TRF1", esfera: "Federal" }
26
+ # Acessa atributos principais
27
+ puts processo.tribunal # Tribunal como objeto ou string
28
+ puts processo.numero
29
+ puts processo.vara
30
+ puts processo.situacao
31
+ puts processo.andamentos
32
+ puts processo.documentos
33
+ puts processo.audiencias
34
+ puts processo.sistema
35
+ puts processo.formato
36
+ puts processo.data_ultima_atualizacao
37
+ puts processo.data_ajuizamento
38
+ puts processo.nivel_sigilo
39
+ puts processo.id
40
+ puts processo.timestamp
41
+
42
+ # Tribunal como objeto (se disponível)
43
+ puts processo.tribunal.nome if processo.tribunal.respond_to?(:nome)
44
+ puts processo.tribunal.sigla if processo.tribunal.respond_to?(:sigla)
45
+ puts processo.tribunal.esfera if processo.tribunal.respond_to?(:esfera)
46
+
47
+ # Exemplos de acesso orientado a objeto
48
+ puts processo.vara.nome if processo.vara.respond_to?(:nome)
49
+ puts processo.vara.comarca.nome if processo.vara&.comarca&.respond_to?(:nome)
50
+ puts processo.assunto.map(&:nome) if processo.assunto
35
51
 
36
52
  # Tabela HTML de endpoints (todos os tribunais conhecidos)
37
53
  Datajud.endpoints_table(Datajud::TRIBUNAIS_SIGLAS)
@@ -42,6 +58,8 @@ Datajud.endpoints_table(Datajud::TRIBUNAIS_SIGLAS)
42
58
  ```ruby
43
59
  # API orientada a objeto
44
60
  processo = Datajud.find("00008323520184013202", tribunal: "trf1")
61
+ # ou
62
+ processo = Datajud.find("00008323520184013202", "trf1")
45
63
 
46
64
  # Retorno bruto (hash)
47
65
  resultado = Datajud.processo("00008323520184013202", tribunal: "trf1")
@@ -73,7 +91,7 @@ para evitar varrer todas as bases.
73
91
 
74
92
  ```ruby
75
93
  processo = Datajud.find("0000832-35.2018.8.26.0202")
76
- puts processo.tribunal
94
+ puts processo.tribunal.nome
77
95
  ```
78
96
 
79
97
  > A UF da comarca é derivada localmente pelo código IBGE do município quando disponível.
data/examples/find.rb CHANGED
@@ -11,11 +11,11 @@ begin
11
11
  processo = Datajud.find("0000832-35.2018.8.26.0202")
12
12
 
13
13
  if processo
14
- puts "Tribunal: #{processo.tribunal}"
14
+ puts "Tribunal: #{processo.tribunal.nome}"
15
15
  puts "Número: #{processo.numero}"
16
- puts "Classe: #{processo.classe}"
16
+ puts "Classe: #{processo.classe.nome}"
17
17
  puts "Partes: #{processo.partes.map(&:nome).join(', ')}"
18
- puts "Movimentações: #{processo.movimentacoes.size}"
18
+ puts "Andamentos: #{processo.andamentos.size}"
19
19
  else
20
20
  puts "Processo não encontrado."
21
21
  end
@@ -10,20 +10,19 @@ module Datajud
10
10
  # Consulta genérica: tribunal e filtros customizados
11
11
  def self.buscar(tribunal, filtros = {})
12
12
  endpoint = "/api_publica_#{tribunal.downcase}/_search"
13
- url = URI("#{Datajud.configuration.base_endpoint}#{endpoint}")
14
-
13
+ url = URI("#{Datajud.configuration.base_endpoint}#{endpoint}")
15
14
  http = Net::HTTP.new(url.host, url.port)
16
15
  http.use_ssl = (url.scheme == "https")
17
- http.open_timeout = Datajud.configuration.open_timeout
18
- http.read_timeout = Datajud.configuration.read_timeout
16
+ http.open_timeout = Datajud.configuration.open_timeout
17
+ http.read_timeout = Datajud.configuration.read_timeout
19
18
 
20
19
  request = Net::HTTP::Post.new(url)
21
- request['Authorization'] = "APIKey #{Datajud.api_key}"
20
+ request['Authorization'] = "APIKey #{Datajud.api_key}"
22
21
  request['Content-Type'] = 'application/json'
23
22
  request.body = { query: filtros }.to_json
24
23
 
25
24
  begin
26
- response = Datajud.request_with_retry(http, request)
25
+ response = Datajud.request_with_retry(http, request)
27
26
  if response.is_a?(Net::HTTPSuccess)
28
27
  JSON.parse(response.body)
29
28
  else
@@ -3,7 +3,8 @@
3
3
  module Datajud
4
4
  class Client
5
5
  # Retorna uma instância de Datajud::Processo ou nil
6
- def self.find(numero, tribunal: nil)
6
+ def self.find(numero, tribunal = nil, **kwargs)
7
+ tribunal = kwargs[:tribunal] if tribunal.nil? && kwargs.key?(:tribunal)
7
8
  raw = Datajud.processo(numero, tribunal: tribunal)
8
9
  return nil unless raw && raw[:processo] || raw && raw['processo']
9
10
 
@@ -6,46 +6,63 @@ module Datajud
6
6
  # Representa um processo retornado pela API DataJud.
7
7
  # Fornece acesso simples a campos comuns via métodos.
8
8
  class Processo
9
- attr_reader :tribunal, :data
9
+ def self.deep_struct(obj)
10
+ case obj
11
+ when Hash
12
+ OpenStruct.new(obj.transform_values { |v| deep_struct(v) })
13
+ when Array
14
+ obj.map { |v| deep_struct(v) }
15
+ else
16
+ obj
17
+ end
18
+ end
19
+ def municipio_ibge
20
+ orgao = instance_variable_get(:@orgao_julgador) || instance_variable_get(:@orgao_julgador) || self.respond_to?(:orgao_julgador) ? self.orgao_julgador : nil
21
+ return nil unless orgao && orgao.is_a?(Hash)
22
+ orgao['codigoMunicipioIBGE'] || orgao[:codigoMunicipioIBGE]
23
+ end
24
+ def comarca_ibge_codigo
25
+ v = instance_variable_get(:@vara)
26
+ return nil unless v && v.is_a?(Hash)
27
+ comarca = v['comarca'] || v[:comarca]
28
+ return nil unless comarca && comarca.is_a?(Hash)
29
+ comarca['codigoIbge'] || comarca[:codigoIbge] || comarca['ibge'] || comarca[:ibge]
30
+ end
31
+ attr_reader :tribunal
10
32
 
11
33
  def initialize(raw)
12
- # raw expected: { tribunal: 'TJSP', processo: { ... } } or string-keyed
13
- @tribunal = raw[:tribunal] || raw['tribunal']
14
- @data = raw[:processo] || raw['processo'] || {}
15
- end
16
-
17
- def numero
18
- @data['numero'] || @data[:numero]
19
- end
20
-
21
- def classe
22
- @data['classe'] || @data[:classe]
23
- end
24
-
25
- def partes
26
- partes = @data['partes'] || @data[:partes] || []
27
- partes.map do |p|
28
- OpenStruct.new(
29
- nome: p['nome'] || p[:nome],
30
- tipo: p['tipo'] || p['tipoParte'] || p[:tipo],
31
- documento: p['documento'] || p[:documento]
32
- )
34
+ processo_hash = raw[:processo] || raw['processo'] || raw
35
+ @tribunal = self.class.deep_struct(raw[:tribunal] || raw['tribunal'])
36
+ processo_hash.each do |k, v|
37
+ ivar = "@#{k.to_s.gsub(/([A-Z])/, '_\\1').downcase}"
38
+ instance_variable_set(ivar, self.class.deep_struct(v))
39
+ self.class.send(:attr_reader, k.to_s.gsub(/([A-Z])/, '_\\1').downcase)
33
40
  end
34
- end
35
-
36
- def movimentacoes
37
- mov = @data['andamentos'] || @data[:andamentos] || @data['movimentacoes'] || @data[:movimentacoes]
38
- (mov || []).map do |m|
39
- OpenStruct.new(
40
- descricao: m['descricao'] || m[:descricao],
41
- data: m['data'] || m['dataHora'] || m[:data],
42
- tipo: m['tipo'] || m['codigoTipoMovimento'] || m[:tipo]
43
- )
41
+ if processo_hash['orgaoJulgador'] || processo_hash[:orgaoJulgador]
42
+ orgao = processo_hash['orgaoJulgador'] || processo_hash[:orgaoJulgador]
43
+ instance_variable_set(:@orgao_julgador, self.class.deep_struct(orgao))
44
+ self.class.send(:attr_reader, :orgao_julgador)
45
+ if orgao['codigoMunicipioIBGE'] || orgao[:codigoMunicipioIBGE]
46
+ vara = instance_variable_get(:@vara)
47
+ if vara && vara.respond_to?(:comarca)
48
+ comarca = vara.comarca
49
+ if comarca && comarca.is_a?(OpenStruct)
50
+ ibge = orgao['codigoMunicipioIBGE'] || orgao[:codigoMunicipioIBGE]
51
+ comarca.codigoIbge = ibge if comarca.respond_to?(:codigoIbge=)
52
+ end
53
+ end
54
+ end
44
55
  end
56
+
45
57
  end
46
58
 
47
- def to_h
48
- { tribunal: tribunal, processo: data }
59
+ def codigo_municipio_ibge
60
+ if respond_to?(:orgao_julgador) && orgao_julgador.is_a?(Hash)
61
+ orgao_julgador['codigoMunicipioIBGE'] || orgao_julgador[:codigoMunicipioIBGE]
62
+ else
63
+ nil
64
+ end
49
65
  end
66
+ # Only tribunal is explicit; all other fields are dynamic.
50
67
  end
51
68
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datajud
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.4"
5
5
  end
data/lib/datajud.rb CHANGED
@@ -320,12 +320,14 @@ module Datajud
320
320
  # A implementação mais rica (retornando objetos) está em Datajud::Client
321
321
 
322
322
  # Retorna um objeto Datajud::Processo ou nil
323
- def self.find(numero, tribunal: nil)
323
+ def self.find(numero, tribunal = nil, **kwargs)
324
+ tribunal = kwargs[:tribunal] if tribunal.nil? && kwargs.key?(:tribunal)
324
325
  Datajud::Client.find(numero, tribunal: tribunal)
325
326
  end
326
327
 
327
328
  # Mantém método antigo para compatibilidade (retorna hash com dados brutos)
328
- def self.processo(numero, tribunal: nil)
329
+ def self.processo(numero, tribunal = nil, **kwargs)
330
+ tribunal = kwargs[:tribunal] if tribunal.nil? && kwargs.key?(:tribunal)
329
331
  # A lógica original permanecida aqui para backward-compat
330
332
  siglas_consulta = if tribunal
331
333
  Array(tribunal).flatten.map { |t| t.to_s.downcase }
@@ -355,11 +357,11 @@ module Datajud
355
357
  tribunal: tribunal_from(sigla, proc),
356
358
  processo: {
357
359
  numero: proc['numeroProcesso'],
358
- vara: proc['orgaoJulgador'] ? {
359
- nome: proc['orgaoJulgador']['nome'],
360
- codigo: proc['orgaoJulgador']['codigo'],
361
- comarca: comarca_from(proc['orgaoJulgador'], sigla)
362
- } : nil,
360
+ vara: proc['orgaoJulgador'] ? {
361
+ nome: proc['orgaoJulgador']['nome'],
362
+ codigo: proc['orgaoJulgador']['codigo'],
363
+ comarca: comarca_from(proc['orgaoJulgador'], sigla)
364
+ } : nil,
363
365
  situacao: proc['situacao'],
364
366
  origem: proc['origem'],
365
367
  instancia: proc['grau'],
@@ -388,7 +390,14 @@ module Datajud
388
390
  status: aud['statusAudiencia'],
389
391
  observacao: aud['observacao']
390
392
  }
391
- end
393
+ end,
394
+ sistema: proc['sistema'],
395
+ formato: proc['formato'],
396
+ dataHoraUltimaAtualizacao: proc['dataHoraUltimaAtualizacao'],
397
+ dataAjuizamento: proc['dataAjuizamento'],
398
+ nivelSigilo: proc['nivelSigilo'],
399
+ id: proc['id'],
400
+ timestamp: proc['@timestamp']
392
401
  }
393
402
  }
394
403
  break
@@ -469,7 +478,8 @@ module Datajud
469
478
  if comarca.is_a?(Hash)
470
479
  nome = comarca['nome'] || comarca['descricao'] || comarca['nomeComarca']
471
480
  uf = comarca['uf'] || comarca['siglaUf'] || comarca['estado']
472
- return { nome: nome, uf: uf, tribunal: sigla.upcase }
481
+ hash = { nome: nome, uf: uf, tribunal: sigla.upcase }
482
+ return hash
473
483
  end
474
484
 
475
485
  nome = comarca || orgao_julgador['nome']
@@ -483,7 +493,11 @@ module Datajud
483
493
 
484
494
  return nil unless nome
485
495
 
486
- { nome: nome, uf: uf, tribunal: sigla.upcase }
496
+ hash = { nome: nome, uf: uf, tribunal: sigla.upcase }
497
+ if orgao_julgador['codigoMunicipioIBGE']
498
+ hash[:codigoIbge] = orgao_julgador['codigoMunicipioIBGE']
499
+ end
500
+ hash
487
501
  end
488
502
 
489
503
  def self.ibge_uf_from(codigo_municipio)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datajud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - PablUoo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-11 00:00:00.000000000 Z
11
+ date: 2026-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri