agris 0.19.0 → 1.1.0

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/agents/app-explorer.md +212 -0
  3. data/.claude/agents/cross-review.md +152 -0
  4. data/.claude/agents/developer.md +215 -0
  5. data/.claude/agents/pm.md +401 -0
  6. data/.claude/agents/qa.md +235 -0
  7. data/.claude/agents/reviewer.md +185 -0
  8. data/.claude/agents/spec-preflight.md +167 -0
  9. data/.claude/agents/spec.md +244 -0
  10. data/.claude/ai/agent-rules.md +36 -0
  11. data/.claude/ai/spec-writing-guide.md +43 -0
  12. data/.claude/commands/app-explorer.md +87 -0
  13. data/.claude/commands/cross-review.md +91 -0
  14. data/.claude/commands/developer.md +118 -0
  15. data/.claude/commands/pm.md +166 -0
  16. data/.claude/commands/qa.md +111 -0
  17. data/.claude/commands/reviewer.md +86 -0
  18. data/.claude/commands/spec.md +172 -0
  19. data/.github/workflows/ci.yml +62 -0
  20. data/.gitignore +5 -0
  21. data/.rubocop.yml +10 -103
  22. data/.ruby-version +1 -0
  23. data/CHANGELOG.md +91 -0
  24. data/CLAUDE.md +98 -0
  25. data/README.md +9 -1
  26. data/agris.gemspec +4 -2
  27. data/docs/RELEASING.md +147 -0
  28. data/docs/specs/README.md +24 -0
  29. data/docs/specs/accounts-payables/.gitkeep +0 -0
  30. data/docs/specs/accounts-receivables/.gitkeep +0 -0
  31. data/docs/specs/grain/.gitkeep +0 -0
  32. data/docs/specs/inventory/.gitkeep +0 -0
  33. data/docs/specs/messages/.gitkeep +0 -0
  34. data/docs/specs/ot3-257-freight-ticket-reference.md +48 -0
  35. data/docs/specs/rename-folder.example.md +82 -0
  36. data/docs/specs/spec-template.md +68 -0
  37. data/docs/specs/support/.gitkeep +0 -0
  38. data/lib/agris/api/accounts_payables/disbursements.rb +19 -0
  39. data/lib/agris/api/accounts_payables/new_disbursement.rb +42 -0
  40. data/lib/agris/api/accounts_payables.rb +3 -0
  41. data/lib/agris/api/accounts_receivables/invoices.rb +1 -1
  42. data/lib/agris/api/accounts_receivables/new_payment.rb +96 -0
  43. data/lib/agris/api/accounts_receivables/new_payment_remark.rb +38 -0
  44. data/lib/agris/api/accounts_receivables/payment_post_result.rb +35 -0
  45. data/lib/agris/api/accounts_receivables/payments.rb +33 -0
  46. data/lib/agris/api/accounts_receivables.rb +6 -0
  47. data/lib/agris/api/document_query_response.rb +6 -2
  48. data/lib/agris/api/grain/contract.rb +3 -3
  49. data/lib/agris/api/grain/new_ticket.rb +1 -0
  50. data/lib/agris/api/grain/purchase_contracts.rb +1 -1
  51. data/lib/agris/api/grain/sales_contracts.rb +1 -1
  52. data/lib/agris/api/grain.rb +4 -2
  53. data/lib/agris/api/inventory/delivery_tickets.rb +1 -1
  54. data/lib/agris/api/inventory/orders.rb +1 -1
  55. data/lib/agris/api/messages/changed_query_base.rb +1 -0
  56. data/lib/agris/api/messages/document_query_base.rb +1 -0
  57. data/lib/agris/api/messages/import.rb +1 -0
  58. data/lib/agris/api/new_voucher.rb +21 -3
  59. data/lib/agris/api/post_result.rb +9 -1
  60. data/lib/agris/client.rb +3 -1
  61. data/lib/agris/version.rb +1 -1
  62. data/lib/agris.rb +1 -0
  63. data/lib/hash.rb +1 -0
  64. metadata +62 -12
  65. data/.circleci/config.yml +0 -45
  66. data/.codeclimate.yml +0 -5
@@ -9,7 +9,8 @@ module Agris
9
9
  end
10
10
 
11
11
  def last_request_date_time
12
- Time.parse(@output_hash[pluralized_resource_name]['system']['lastrequestdatetime'])
12
+ system_hash = @output_hash[pluralized_resource_name]['system']
13
+ Time.parse(system_hash['lastrequestdatetime'])
13
14
  end
14
15
 
15
16
  def documents
@@ -37,7 +38,10 @@ module Agris
37
38
  end
38
39
 
39
40
  def resource_type
40
- @resource_type ||= Object.const_get(self.class.name.split('::').last.chomp('ExtractResponse'))
41
+ @resource_type ||= begin
42
+ name = self.class.name.split('::').last.chomp('ExtractResponse')
43
+ Object.const_get(name)
44
+ end
41
45
  end
42
46
 
43
47
  def resources
@@ -104,11 +104,11 @@ module Agris
104
104
  def self.add_transcodes_to_schedule(schedule)
105
105
  if schedule['trancodes']
106
106
  trancodes = schedule['trancodes']['trancode']
107
- trancodes = [trancodes] unless trancodes.class == Array
107
+ trancodes = [trancodes] unless trancodes.instance_of?(Array)
108
108
  trancodes.each do |trancode|
109
- label_code = trancode['label'].downcase + 'code'
109
+ label_code = "#{trancode['label'].downcase}code"
110
110
  schedule[label_code] = trancode['code']
111
- label_description = trancode['label'].downcase + 'description'
111
+ label_description = "#{trancode['label'].downcase}description"
112
112
  schedule[label_description] = trancode['description']
113
113
  end
114
114
  end
@@ -31,6 +31,7 @@ module Agris
31
31
  tare_weight
32
32
  freight_weight
33
33
  freight_rate
34
+ freight_uom
34
35
  additional_freight
35
36
  cash_price
36
37
  cash_basis
@@ -17,7 +17,7 @@ module Agris
17
17
  )
18
18
  end
19
19
 
20
- def purchase_contracts_changed_since(datetime, detail = false)
20
+ def purchase_contracts_changed_since(datetime, detail: false)
21
21
  extract_documents(
22
22
  Messages::QueryChangedPurchaseContracts.new(datetime, detail),
23
23
  Agris::Api::Grain::Contract
@@ -17,7 +17,7 @@ module Agris
17
17
  )
18
18
  end
19
19
 
20
- def sales_contracts_changed_since(datetime, detail = false)
20
+ def sales_contracts_changed_since(datetime, detail: false)
21
21
  extract_documents(
22
22
  Messages::QueryChangedSalesContracts.new(datetime, detail),
23
23
  Agris::Api::Grain::Contract
@@ -16,8 +16,10 @@ module Agris
16
16
  autoload :NewTicketRemark, 'agris/api/grain/new_ticket_remark'
17
17
  autoload :Rates, 'agris/api/grain/rates'
18
18
  autoload :SalesContracts, 'agris/api/grain/sales_contracts'
19
- autoload :SpecificCommodityCodeExtract, 'agris/api/grain/specific_commodity_code_extract'
20
- autoload :SpecificContractExtract, 'agris/api/grain/specific_contract_extract'
19
+ autoload :SpecificCommodityCodeExtract,
20
+ 'agris/api/grain/specific_commodity_code_extract'
21
+ autoload :SpecificContractExtract,
22
+ 'agris/api/grain/specific_contract_extract'
21
23
  autoload :Tickets, 'agris/api/grain/tickets'
22
24
  end
23
25
  end
@@ -18,7 +18,7 @@ module Agris
18
18
  )
19
19
  end
20
20
 
21
- def delivery_tickets_changed_since(datetime, detail = false)
21
+ def delivery_tickets_changed_since(datetime, detail: false)
22
22
  extract_documents(
23
23
  Messages::QueryChangedDeliveryTickets.new(datetime, detail),
24
24
  DeliveryTicket
@@ -28,7 +28,7 @@ module Agris
28
28
  )
29
29
  end
30
30
 
31
- def orders_changed_since(datetime, detail = false)
31
+ def orders_changed_since(datetime, detail: false)
32
32
  extract_documents(
33
33
  Messages::QueryChangedOrders.new(datetime, detail),
34
34
  Agris::Api::Order
@@ -4,6 +4,7 @@ module Agris
4
4
  module Messages
5
5
  class ChangedQueryBase < QueryBase
6
6
  def initialize(time, detail)
7
+ super()
7
8
  @time = time
8
9
  @detail = detail
9
10
  end
@@ -4,6 +4,7 @@ module Agris
4
4
  module Messages
5
5
  class DocumentQueryBase < QueryBase
6
6
  def initialize(document_references)
7
+ super()
7
8
  @document_references = document_references
8
9
  end
9
10
 
@@ -4,6 +4,7 @@ module Agris
4
4
  module Messages
5
5
  class Import < MessageBase
6
6
  def initialize(model)
7
+ super()
7
8
  @model = model
8
9
  end
9
10
 
@@ -5,8 +5,6 @@ module Agris
5
5
  class NewVoucher
6
6
  include XmlModel
7
7
 
8
- attr_reader :details
9
-
10
8
  ATTRIBUTE_NAMES = %w(
11
9
  agent_id
12
10
  currency_code
@@ -44,7 +42,7 @@ module Agris
44
42
  voucher_type
45
43
  ).freeze
46
44
 
47
- attr_reader(*ATTRIBUTE_NAMES)
45
+ attr_reader :details, *ATTRIBUTE_NAMES
48
46
 
49
47
  def initialize(hash = {})
50
48
  super
@@ -108,6 +106,26 @@ module Agris
108
106
  @record_type = 'ACPV1'
109
107
  end
110
108
  end
109
+
110
+ class FreightTicketReferenceDetail
111
+ include XmlModel
112
+
113
+ ATTRIBUTE_NAMES = %w(
114
+ in_out_code
115
+ ticket_location
116
+ ticket_number
117
+ freight_amount
118
+ record_type
119
+ ).freeze
120
+
121
+ attr_reader(*ATTRIBUTE_NAMES)
122
+
123
+ def initialize(hash = {})
124
+ super
125
+
126
+ @record_type = 'ACPV3'
127
+ end
128
+ end
111
129
  end
112
130
  end
113
131
  end
@@ -6,10 +6,18 @@ module Agris
6
6
  results['result']['document']
7
7
  end
8
8
 
9
+ # A processed post reports an empty `<reject />`, so there may be no
10
+ # rejections to read.
9
11
  def reject_reasons
10
- results['result']['rejects']['reject']
12
+ rejects = results.fetch('result', {})['rejects']
13
+
14
+ return [] if rejects.nil?
15
+
16
+ [rejects['reject']]
17
+ .flatten
11
18
  .compact
12
19
  .map { |rejection| rejection['reason'] }
20
+ .compact
13
21
  end
14
22
 
15
23
  def results
data/lib/agris/client.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  module Agris
3
3
  class Client
4
+ include Api::AccountsPayables::Disbursements
4
5
  include Api::AccountsPayables::Vouchers
5
6
  include Api::AccountsReceivables::Invoices
7
+ include Api::AccountsReceivables::Payments
6
8
  include Api::Grain::CommodityCodes
7
9
  include Api::Grain::GrainModule
8
10
  include Api::Grain::PurchaseContracts
@@ -41,7 +43,7 @@ module Agris
41
43
 
42
44
  def logger
43
45
  # We may want to replace the Logger with some kind of NullLogger?
44
- @logger ||= Logger.new(STDOUT)
46
+ @logger ||= Logger.new($stdout)
45
47
  end
46
48
  end
47
49
  end
data/lib/agris/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Agris
4
- VERSION = '0.19.0'
4
+ VERSION = '1.1.0'
5
5
  end
data/lib/agris.rb CHANGED
@@ -18,6 +18,7 @@ module Agris
18
18
  :proxy_url,
19
19
  :request_type,
20
20
  :user_agent
21
+
21
22
  # ```ruby
22
23
  # Agris.configure do |config|
23
24
  # config.credentials = Agris::Credentials::Anonymous.new
data/lib/hash.rb CHANGED
@@ -34,6 +34,7 @@ class Hash
34
34
  if child.name == 'text'
35
35
  unless child.next_sibling || child.previous_sibling
36
36
  return result unless attributes
37
+
37
38
  result_hash[key_value(child)] = result
38
39
  end
39
40
  elsif result_hash[key_value(child)]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agris
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Gray
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2024-12-23 00:00:00.000000000 Z
12
+ date: 2026-09-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
@@ -27,18 +27,32 @@ dependencies:
27
27
  version: '2.11'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '2.3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '2.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: factory_bot
30
44
  requirement: !ruby/object:Gem::Requirement
31
45
  requirements:
32
46
  - - "~>"
33
47
  - !ruby/object:Gem::Version
34
- version: 2.3.7
48
+ version: '6.4'
35
49
  type: :development
36
50
  prerelease: false
37
51
  version_requirements: !ruby/object:Gem::Requirement
38
52
  requirements:
39
53
  - - "~>"
40
54
  - !ruby/object:Gem::Version
41
- version: 2.3.7
55
+ version: '6.4'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: pry-byebug
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -99,16 +113,16 @@ dependencies:
99
113
  name: rubocop
100
114
  requirement: !ruby/object:Gem::Requirement
101
115
  requirements:
102
- - - '='
116
+ - - "~>"
103
117
  - !ruby/object:Gem::Version
104
- version: 0.54.0
118
+ version: '1.80'
105
119
  type: :development
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
108
122
  requirements:
109
- - - '='
123
+ - - "~>"
110
124
  - !ruby/object:Gem::Version
111
- version: 0.54.0
125
+ version: '1.80'
112
126
  - !ruby/object:Gem::Dependency
113
127
  name: simplecov
114
128
  requirement: !ruby/object:Gem::Requirement
@@ -145,12 +159,31 @@ executables: []
145
159
  extensions: []
146
160
  extra_rdoc_files: []
147
161
  files:
148
- - ".circleci/config.yml"
149
- - ".codeclimate.yml"
162
+ - ".claude/agents/app-explorer.md"
163
+ - ".claude/agents/cross-review.md"
164
+ - ".claude/agents/developer.md"
165
+ - ".claude/agents/pm.md"
166
+ - ".claude/agents/qa.md"
167
+ - ".claude/agents/reviewer.md"
168
+ - ".claude/agents/spec-preflight.md"
169
+ - ".claude/agents/spec.md"
170
+ - ".claude/ai/agent-rules.md"
171
+ - ".claude/ai/spec-writing-guide.md"
172
+ - ".claude/commands/app-explorer.md"
173
+ - ".claude/commands/cross-review.md"
174
+ - ".claude/commands/developer.md"
175
+ - ".claude/commands/pm.md"
176
+ - ".claude/commands/qa.md"
177
+ - ".claude/commands/reviewer.md"
178
+ - ".claude/commands/spec.md"
179
+ - ".github/workflows/ci.yml"
150
180
  - ".gitignore"
151
181
  - ".rspec"
152
182
  - ".rubocop.yml"
153
183
  - ".rubocop_todo.yml"
184
+ - ".ruby-version"
185
+ - CHANGELOG.md
186
+ - CLAUDE.md
154
187
  - Gemfile
155
188
  - LICENSE
156
189
  - README.md
@@ -158,12 +191,29 @@ files:
158
191
  - agris.gemspec
159
192
  - bin/console
160
193
  - bin/setup
194
+ - docs/RELEASING.md
195
+ - docs/specs/README.md
196
+ - docs/specs/accounts-payables/.gitkeep
197
+ - docs/specs/accounts-receivables/.gitkeep
198
+ - docs/specs/grain/.gitkeep
199
+ - docs/specs/inventory/.gitkeep
200
+ - docs/specs/messages/.gitkeep
201
+ - docs/specs/ot3-257-freight-ticket-reference.md
202
+ - docs/specs/rename-folder.example.md
203
+ - docs/specs/spec-template.md
204
+ - docs/specs/support/.gitkeep
161
205
  - lib/agris.rb
162
206
  - lib/agris/api.rb
163
207
  - lib/agris/api/accounts_payables.rb
208
+ - lib/agris/api/accounts_payables/disbursements.rb
209
+ - lib/agris/api/accounts_payables/new_disbursement.rb
164
210
  - lib/agris/api/accounts_receivables.rb
165
211
  - lib/agris/api/accounts_receivables/invoice.rb
166
212
  - lib/agris/api/accounts_receivables/invoices.rb
213
+ - lib/agris/api/accounts_receivables/new_payment.rb
214
+ - lib/agris/api/accounts_receivables/new_payment_remark.rb
215
+ - lib/agris/api/accounts_receivables/payment_post_result.rb
216
+ - lib/agris/api/accounts_receivables/payments.rb
167
217
  - lib/agris/api/accounts_receivables/specific_invoice_extract.rb
168
218
  - lib/agris/api/document_query_response.rb
169
219
  - lib/agris/api/grain.rb
@@ -243,14 +293,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
243
293
  requirements:
244
294
  - - ">="
245
295
  - !ruby/object:Gem::Version
246
- version: '0'
296
+ version: '3.1'
247
297
  required_rubygems_version: !ruby/object:Gem::Requirement
248
298
  requirements:
249
299
  - - ">="
250
300
  - !ruby/object:Gem::Version
251
301
  version: '0'
252
302
  requirements: []
253
- rubygems_version: 3.3.7
303
+ rubygems_version: 3.3.27
254
304
  signing_key:
255
305
  specification_version: 4
256
306
  summary: Ruby client library for Agris API
data/.circleci/config.yml DELETED
@@ -1,45 +0,0 @@
1
- version: 2
2
-
3
- jobs:
4
- build:
5
- docker:
6
- # specify the version you desire here
7
- - image: circleci/ruby:2.4.1
8
-
9
- working_directory: ~/agris
10
-
11
- steps:
12
- - checkout
13
- - run:
14
- name: install dependencies
15
- command: |
16
- bundle install --jobs=4 --retry=3 --path vendor/bundle
17
-
18
- - run:
19
- name: Setup Code Climate test-reporter
20
- command: |
21
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
22
- chmod +x ./cc-test-reporter
23
-
24
- # run tests!
25
- - run:
26
- name: run tests
27
- command: |
28
- ./cc-test-reporter before-build
29
- mkdir /tmp/test-results
30
- TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
31
-
32
- bundle exec rspec --format progress \
33
- --format RspecJunitFormatter \
34
- --out /tmp/test-results/rspec.xml \
35
- --format progress \
36
- -- \
37
- $TEST_FILES
38
- ./cc-test-reporter after-build --coverage-input-type simplecov --exit-code $?
39
-
40
- # collect reports
41
- - store_test_results:
42
- path: /tmp/test-results
43
- - store_artifacts:
44
- path: /tmp/test-results
45
- destination: test-results
data/.codeclimate.yml DELETED
@@ -1,5 +0,0 @@
1
- version: "2"
2
- plugins:
3
- rubocop:
4
- enabled: true
5
- channel: rubocop-0-54