agris 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +21 -0
  6. data/README.md +36 -0
  7. data/Rakefile +6 -0
  8. data/agris.gemspec +30 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/lib/agris.rb +61 -0
  12. data/lib/agris/api.rb +21 -0
  13. data/lib/agris/api/accounts_payables.rb +30 -0
  14. data/lib/agris/api/accounts_receivables.rb +11 -0
  15. data/lib/agris/api/accounts_receivables/invoice.rb +166 -0
  16. data/lib/agris/api/accounts_receivables/invoices.rb +29 -0
  17. data/lib/agris/api/accounts_receivables/specific_invoice_extract.rb +17 -0
  18. data/lib/agris/api/document_query_response.rb +59 -0
  19. data/lib/agris/api/grain.rb +12 -0
  20. data/lib/agris/api/grain/new_ticket.rb +118 -0
  21. data/lib/agris/api/grain/new_ticket_application.rb +34 -0
  22. data/lib/agris/api/grain/new_ticket_remark.rb +23 -0
  23. data/lib/agris/api/grain/tickets.rb +17 -0
  24. data/lib/agris/api/inventory.rb +16 -0
  25. data/lib/agris/api/inventory/delivery_ticket.rb +84 -0
  26. data/lib/agris/api/inventory/delivery_ticket_line_item.rb +59 -0
  27. data/lib/agris/api/inventory/delivery_tickets.rb +30 -0
  28. data/lib/agris/api/inventory/orders.rb +51 -0
  29. data/lib/agris/api/inventory/specific_delivery_ticket_extract.rb +17 -0
  30. data/lib/agris/api/inventory/specific_order_extract.rb +18 -0
  31. data/lib/agris/api/messages.rb +25 -0
  32. data/lib/agris/api/messages/import.rb +40 -0
  33. data/lib/agris/api/messages/message_base.rb +42 -0
  34. data/lib/agris/api/messages/query_base.rb +37 -0
  35. data/lib/agris/api/messages/query_changed_delivery_tickets.rb +41 -0
  36. data/lib/agris/api/messages/query_changed_invoices.rb +48 -0
  37. data/lib/agris/api/messages/query_changed_orders.rb +41 -0
  38. data/lib/agris/api/messages/query_delivery_ticket_documents.rb +35 -0
  39. data/lib/agris/api/messages/query_invoice_documents.rb +40 -0
  40. data/lib/agris/api/messages/query_order_documents.rb +35 -0
  41. data/lib/agris/api/new_order.rb +86 -0
  42. data/lib/agris/api/new_order_remark.rb +22 -0
  43. data/lib/agris/api/new_voucher.rb +113 -0
  44. data/lib/agris/api/order.rb +63 -0
  45. data/lib/agris/api/order_line.rb +32 -0
  46. data/lib/agris/api/post_result.rb +24 -0
  47. data/lib/agris/api/remark.rb +16 -0
  48. data/lib/agris/api/support.rb +77 -0
  49. data/lib/agris/api/tran_code.rb +17 -0
  50. data/lib/agris/client.rb +39 -0
  51. data/lib/agris/context.rb +6 -0
  52. data/lib/agris/credentials.rb +7 -0
  53. data/lib/agris/credentials/anonymous.rb +11 -0
  54. data/lib/agris/credentials/basic_auth.rb +15 -0
  55. data/lib/agris/process_message_response.rb +58 -0
  56. data/lib/agris/resources/post_sales_order.xml +93 -0
  57. data/lib/agris/resources/post_sales_order_response.xml +21 -0
  58. data/lib/agris/savon_request.rb +73 -0
  59. data/lib/agris/user_agent.rb +7 -0
  60. data/lib/agris/version.rb +3 -0
  61. data/lib/agris/xml_model.rb +62 -0
  62. metadata +188 -0
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ module Api
4
+ class TranCode
5
+ include XmlModel
6
+
7
+ ATTRIBUTE_NAMES = %w(
8
+ num
9
+ label
10
+ code
11
+ description
12
+ ).freeze
13
+
14
+ attr_reader(*ATTRIBUTE_NAMES)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ class Client
4
+ include Api::AccountsPayables::Vouchers
5
+ include Api::AccountsReceivables::Invoices
6
+ include Api::Grain::Tickets
7
+ include Api::Inventory::DeliveryTickets
8
+ include Api::Inventory::Orders
9
+ include Api::Support
10
+
11
+ ##
12
+ # Initializes the client
13
+ #
14
+ def initialize(
15
+ context = Agris.context,
16
+ credentials = Agris.credentials,
17
+ options = {}
18
+ )
19
+ @context = context
20
+ @logger = options[:logger] || Agris.logger
21
+ @request_type = options[:request_type] || Agris.request_type
22
+ @proxy_url = options.fetch(:proxy_url, Agris.proxy_url)
23
+ @request = @request_type.new(
24
+ @context.base_url, credentials, @logger, @proxy_url
25
+ )
26
+ end
27
+
28
+ def log(message)
29
+ logger.info(message)
30
+ end
31
+
32
+ protected
33
+
34
+ def logger
35
+ # We may want to replace the Logger with some kind of NullLogger?
36
+ @logger ||= Logger.new(STDOUT)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ Context = Struct.new(
4
+ :base_url, :dataset, :datapath, :database, :userid, :password
5
+ )
6
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ module Credentials
4
+ autoload :Anonymous, 'agris/credentials/anonymous'
5
+ autoload :BasicAuth, 'agris/credentials/basic_auth'
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ module Credentials
4
+ class Anonymous
5
+ def apply(options)
6
+ # noop
7
+ options
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ module Credentials
4
+ class BasicAuth
5
+ def initialize(username, password)
6
+ @username = username
7
+ @password = password
8
+ end
9
+
10
+ def apply(options)
11
+ options.merge(basic_auth: [@username, @password])
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ class ProcessMessageResponse
4
+ attr_accessor :result, :ag_output_obj_p, :ag_error_str_p
5
+
6
+ def initialize(result, ag_output_obj_p, ag_error_str_p)
7
+ @result = result
8
+ @ag_output_obj_p = ag_output_obj_p
9
+ @ag_error_str_p = ag_error_str_p
10
+ end
11
+
12
+ def error?
13
+ !ag_error_str_p.blank?
14
+ end
15
+
16
+ def error_info
17
+ @error ||= error? ? ErrorInfo.new(error_hash) : nil
18
+ end
19
+
20
+ def error_hash
21
+ @error_hash ||= Hash.from_xml(ag_error_str_p)
22
+ end
23
+
24
+ def output_hash
25
+ @output_hash ||= Hash.from_xml(ag_output_obj_p)
26
+ end
27
+
28
+ class ErrorInfo
29
+ def initialize(hash)
30
+ @hash = hash
31
+ end
32
+
33
+ def payload
34
+ if @hash.key?('xml')
35
+ @hash['xml']['errors']['errorinfo']
36
+ elsif @hash['errorinfo'].is_a?(Hash)
37
+ @hash['errorinfo']
38
+ elsif @hash['errorinfo'].is_a?(String)
39
+ @hash['errorinfo'].strip
40
+ else
41
+ @hash
42
+ end
43
+ end
44
+
45
+ def type
46
+ @type ||= if @hash.key?('xml')
47
+ :message
48
+ elsif @hash['errorinfo'].is_a?(Hash)
49
+ :system
50
+ elsif @hash['errorinfo'].is_a?(String)
51
+ :api
52
+ else
53
+ :unknown
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,93 @@
1
+ <xml>
2
+ <input
3
+ importdescription=""
4
+ altoutputfile=""
5
+ endofprocessoption="1"
6
+ altnameidonfile="N"
7
+ usecurdate4outofrange="N"
8
+ reportoption="0"
9
+ password=""
10
+ usefile="false"
11
+ usefilepath="">
12
+ </input>
13
+ <details>
14
+ <detail
15
+ recordtype="INVP0"
16
+ ordertype=""
17
+ orderstatus=""
18
+ orderlocation=""
19
+ ordernumber=""
20
+ lineitemno=""
21
+ orderdate=""
22
+ shipmentdate=""
23
+ billtofromid=""
24
+ itemlocation=""
25
+ itemnumber=""
26
+ itemdescr=""
27
+ pricecode=""
28
+ pricelevel=""
29
+ priceschedule=""
30
+ invoiceterms=""
31
+ contractlocation=""
32
+ contractnumber=""
33
+ contractpriceschedule=""
34
+ weightuom=""
35
+ quantityuom=""
36
+ priceuom=""
37
+ state=""
38
+ county=""
39
+ trancode1=""
40
+ trancode2=""
41
+ trancode3=""
42
+ trancode4=""
43
+ trancode5=""
44
+ userorderfield1=""
45
+ userorderfield2=""
46
+ externalordernumber=""
47
+ userlineitemfield1=""
48
+ execid=""
49
+ shiptofromid=""
50
+ shipperid=""
51
+ agentid=""
52
+ quantityordered=""
53
+ unitprice=""
54
+ prepromoprice=""
55
+ amountordered=""
56
+ changetype=""
57
+ costproration=""
58
+ addupdateoption=""
59
+ updatefieldselection=""
60
+ reserved=""
61
+ lastproductionstage=""
62
+ inblend=""
63
+ expirationdate=""
64
+ itemdescription="" />
65
+ <detail
66
+ recordtype="INVP1"
67
+ itemlocation=""
68
+ itemnumber=""
69
+ pricecode=""
70
+ productionstage=""
71
+ quantitytype=""
72
+ priceuomc=""
73
+ quantityordered=""
74
+ unitprice=""
75
+ quantityuom=""
76
+ inblend=""
77
+ contractlocation=""
78
+ contractnumber=""
79
+ contractpriceschedule="" />
80
+ <detail
81
+ recordtype="INVP2"
82
+ promotype=""
83
+ promolocation=""
84
+ promotable=""
85
+ calculationtype=""
86
+ promorate="" />
87
+ <detail
88
+ recordtype="INVP3"
89
+ orderline=""
90
+ number=""
91
+ value="" />
92
+ </details>
93
+ </xml>
@@ -0,0 +1,21 @@
1
+ <results>
2
+   <system message="82320" package="SYS" messageversion="10.1.1" lastrequestdatetime="" filename="" systemversion="10.1.1" systemid="M7" componentserver="WIN81DEVBERG1" dbservername="WIN81DEVBERG1" dbname="A00305152015202910" datapath="c:\AGRIS_10\DATASETS\003" datasetnumber="003" datasetdescription="Farm Service Grain" datasetid="YRW" datasetguid="BD11BF48-DEBC-4B9F-ABAB-600320F32E2E" licenseguid="" count="1" startdatetime="2015-11-13T16:19:36" enddatetime="2015-11-13T16:19:37" elapsemillisecond="1406" />
3
+   <import importdescription="" altoutputfile="" ippackagelist="INV" ipmiscinfo="" spoolfilename="c:\AGRIS\DATASETS\003\Reports\5KDQ193742.002" />
4
+ <result type="INVP0" document="" status="Rejected">
5
+ <rejects>
6
+ <reject code="C" reason="ORDER LOCATION CODE NOT FOUND" />
7
+ <reject code="F" reason="INVENTORY ITEM LOCATION CODE NOT FOUND" />
8
+ <reject code="E" reason="INVENTORY ITEM NUMBER NOT FOUND OR INACTIVE" />
9
+ <reject code="W" reason="QUANTITY UNIT OF MEASURE NOT FOUND" />
10
+ <reject code="X" reason="PRICE/COST UNIT OF MEASURE NOT FOUND" />
11
+ <reject code="S" reason="SHIPPER NAME ID NOT FOUND OR INACTIVE" />
12
+ <reject code="T" reason="AGENT/BROKER NAME ID NOT FOUND OR INACTIVE" />
13
+ <reject code="=" reason="INVALID ORDER STATUS" />
14
+ <reject code="m" reason="PROMOTION TYPE NOT FOUND" />
15
+ </rejects>
16
+   </result>
17
+ <result type="INVP0" document="S400123456" status="Processed">
18
+ <rejects>
19
+ </rejects>
20
+ </result>
21
+ </results>
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ require 'agris/user_agent'
3
+ require 'savon'
4
+
5
+ module Agris
6
+ class SavonRequest
7
+ def initialize(base_url, credentials, logger, proxy_url = nil)
8
+ @base_url = base_url
9
+ @credentials = credentials
10
+ @logger = logger
11
+ @proxy_url = proxy_url
12
+ end
13
+
14
+ def process_message(context, message_number, input)
15
+ response = client.call(
16
+ :process_message,
17
+ message: {
18
+ AgContext_str_p: context,
19
+ AgMessage_int_p: message_number,
20
+ AgInput_obj_p: input,
21
+ }
22
+ )
23
+ message_response = parse_response(response)
24
+
25
+ fail response_error(message_response.error_info) \
26
+ if message_response.error?
27
+
28
+ message_response
29
+ end
30
+
31
+ protected
32
+
33
+ def parse_response(response)
34
+ ProcessMessageResponse.new(
35
+ response.body[:process_message_result],
36
+ response.body[:process_message_response][:ag_output_obj_p],
37
+ response.body[:process_message_response][:ag_error_str_p]
38
+ )
39
+ end
40
+
41
+ def client
42
+ options = {
43
+ wsdl: wsdl,
44
+ convert_request_keys_to: :none,
45
+ raise_errors: false,
46
+ logger: @logger,
47
+ log: true,
48
+ log_level: :debug
49
+ }
50
+ options = options.merge(proxy: @proxy_url) unless @proxy_url.to_s == ''
51
+ options = @credentials.apply(options)
52
+
53
+ Savon.client(options)
54
+ end
55
+
56
+ def response_error(error_info)
57
+ Object.const_get(
58
+ format(
59
+ 'Agris::%sError',
60
+ error_info.type.to_s.split('_').map(&:capitalize).join
61
+ )
62
+ ).new(error_info.payload)
63
+ end
64
+
65
+ def wsdl
66
+ format(
67
+ '%s/%s',
68
+ @base_url,
69
+ 'agris/AGRIS.Env.MessageRouter/AGRIS.Env.MessageRouter.asmx?WSDL'
70
+ )
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'agris/version'
4
+
5
+ module Agris
6
+ USER_AGENT = Agris.user_agent.to_s + " (Agris.rb #{VERSION})".freeze
7
+ end
@@ -0,0 +1,3 @@
1
+ module Agris
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ module Agris
3
+ module XmlModel
4
+ def self.included(base)
5
+ base.send :include, InstanceMethods
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module InstanceMethods
10
+ attr_reader :hash
11
+
12
+ def attributes
13
+ (instance_variables - [:@hash]).each_with_object({}) do |ivar, new_hash|
14
+ new_hash[ivar.to_s.delete('@')] = instance_variable_get(ivar)
15
+ new_hash
16
+ end
17
+ end
18
+
19
+ def initialize(hash = {})
20
+ @hash = hash
21
+ @hash.each do |key, value|
22
+ instance_variable_set("@#{key}", value)
23
+ end
24
+ end
25
+
26
+ def to_xml_hash
27
+ ignore_attributes = xml_ignore_attributes + [:hash]
28
+ attributes
29
+ .slice(*(attributes.keys - ignore_attributes))
30
+ .each_with_object({}) do |(name, value), new_hash|
31
+ new_hash["@#{name.delete('_')}".to_sym] = value
32
+ new_hash
33
+ end
34
+ end
35
+
36
+ def xml_ignore_attributes
37
+ []
38
+ end
39
+ end
40
+
41
+ module ClassMethods
42
+ def from_xml_hash(hash)
43
+ klass = Object.const_get(name)
44
+
45
+ attribute_map =
46
+ klass::ATTRIBUTE_NAMES
47
+ .each_with_object({}) do |name, new_hash|
48
+ new_hash[name.delete('_').to_s] = name
49
+ end
50
+
51
+ translated_hash = hash.each_with_object({}) do |(key, value), new_hash|
52
+ attribute_name = attribute_map[key]
53
+
54
+ new_hash[attribute_name] = value if attribute_name
55
+ new_hash
56
+ end
57
+
58
+ klass.new(translated_hash)
59
+ end
60
+ end
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: agris
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - John Gray
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-07-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: savon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.11'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.14'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.3'
97
+ description:
98
+ email:
99
+ - wopr42@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - Gemfile
107
+ - LICENSE
108
+ - README.md
109
+ - Rakefile
110
+ - agris.gemspec
111
+ - bin/console
112
+ - bin/setup
113
+ - lib/agris.rb
114
+ - lib/agris/api.rb
115
+ - lib/agris/api/accounts_payables.rb
116
+ - lib/agris/api/accounts_receivables.rb
117
+ - lib/agris/api/accounts_receivables/invoice.rb
118
+ - lib/agris/api/accounts_receivables/invoices.rb
119
+ - lib/agris/api/accounts_receivables/specific_invoice_extract.rb
120
+ - lib/agris/api/document_query_response.rb
121
+ - lib/agris/api/grain.rb
122
+ - lib/agris/api/grain/new_ticket.rb
123
+ - lib/agris/api/grain/new_ticket_application.rb
124
+ - lib/agris/api/grain/new_ticket_remark.rb
125
+ - lib/agris/api/grain/tickets.rb
126
+ - lib/agris/api/inventory.rb
127
+ - lib/agris/api/inventory/delivery_ticket.rb
128
+ - lib/agris/api/inventory/delivery_ticket_line_item.rb
129
+ - lib/agris/api/inventory/delivery_tickets.rb
130
+ - lib/agris/api/inventory/orders.rb
131
+ - lib/agris/api/inventory/specific_delivery_ticket_extract.rb
132
+ - lib/agris/api/inventory/specific_order_extract.rb
133
+ - lib/agris/api/messages.rb
134
+ - lib/agris/api/messages/import.rb
135
+ - lib/agris/api/messages/message_base.rb
136
+ - lib/agris/api/messages/query_base.rb
137
+ - lib/agris/api/messages/query_changed_delivery_tickets.rb
138
+ - lib/agris/api/messages/query_changed_invoices.rb
139
+ - lib/agris/api/messages/query_changed_orders.rb
140
+ - lib/agris/api/messages/query_delivery_ticket_documents.rb
141
+ - lib/agris/api/messages/query_invoice_documents.rb
142
+ - lib/agris/api/messages/query_order_documents.rb
143
+ - lib/agris/api/new_order.rb
144
+ - lib/agris/api/new_order_remark.rb
145
+ - lib/agris/api/new_voucher.rb
146
+ - lib/agris/api/order.rb
147
+ - lib/agris/api/order_line.rb
148
+ - lib/agris/api/post_result.rb
149
+ - lib/agris/api/remark.rb
150
+ - lib/agris/api/support.rb
151
+ - lib/agris/api/tran_code.rb
152
+ - lib/agris/client.rb
153
+ - lib/agris/context.rb
154
+ - lib/agris/credentials.rb
155
+ - lib/agris/credentials/anonymous.rb
156
+ - lib/agris/credentials/basic_auth.rb
157
+ - lib/agris/process_message_response.rb
158
+ - lib/agris/resources/post_sales_order.xml
159
+ - lib/agris/resources/post_sales_order_response.xml
160
+ - lib/agris/savon_request.rb
161
+ - lib/agris/user_agent.rb
162
+ - lib/agris/version.rb
163
+ - lib/agris/xml_model.rb
164
+ homepage: https://github.com/westernmilling/agris.rb
165
+ licenses:
166
+ - MIT
167
+ metadata: {}
168
+ post_install_message:
169
+ rdoc_options: []
170
+ require_paths:
171
+ - lib
172
+ required_ruby_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ requirements: []
183
+ rubyforge_project:
184
+ rubygems_version: 2.6.9
185
+ signing_key:
186
+ specification_version: 4
187
+ summary: Ruby client library for Agris API
188
+ test_files: []