agms 0.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 (58) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +51 -0
  5. data/Rakefile +40 -0
  6. data/agms.gemspec +29 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +7 -0
  9. data/example/hpp.rb +18 -0
  10. data/example/invoicing.rb +23 -0
  11. data/example/recurring.rb +23 -0
  12. data/example/report.rb +16 -0
  13. data/example/safe.rb +17 -0
  14. data/example/transaction.rb +17 -0
  15. data/init.yml +9 -0
  16. data/lib/agms.rb +59 -0
  17. data/lib/agms/agms.rb +109 -0
  18. data/lib/agms/configuration.rb +71 -0
  19. data/lib/agms/connect.rb +176 -0
  20. data/lib/agms/error/agms_error.rb +9 -0
  21. data/lib/agms/error/authentication_error.rb +7 -0
  22. data/lib/agms/error/authorization_error.rb +7 -0
  23. data/lib/agms/error/client_error_error.rb +7 -0
  24. data/lib/agms/error/configuation_error.rb +7 -0
  25. data/lib/agms/error/down_for_maintenance_error.rb +7 -0
  26. data/lib/agms/error/forged_query_String_error.rb +7 -0
  27. data/lib/agms/error/invalid_parameter_error.rb +7 -0
  28. data/lib/agms/error/invalid_request_error.rb +7 -0
  29. data/lib/agms/error/invalid_signature_error.rb +7 -0
  30. data/lib/agms/error/not_found_error.rb +7 -0
  31. data/lib/agms/error/request_validation_error.rb +7 -0
  32. data/lib/agms/error/response_error.rb +7 -0
  33. data/lib/agms/error/server_error_error.rb +7 -0
  34. data/lib/agms/error/ssl_certificate_error.rb +7 -0
  35. data/lib/agms/error/unexpected_error.rb +7 -0
  36. data/lib/agms/error/upgrade_required_error.rb +7 -0
  37. data/lib/agms/hpp.rb +65 -0
  38. data/lib/agms/invoicing.rb +63 -0
  39. data/lib/agms/recurring.rb +76 -0
  40. data/lib/agms/report.rb +53 -0
  41. data/lib/agms/request/hpp_request.rb +181 -0
  42. data/lib/agms/request/invoicing_request.rb +8 -0
  43. data/lib/agms/request/recurring_request.rb +115 -0
  44. data/lib/agms/request/report_request.rb +106 -0
  45. data/lib/agms/request/request.rb +455 -0
  46. data/lib/agms/request/safe_request.rb +211 -0
  47. data/lib/agms/request/transaction_request.rb +217 -0
  48. data/lib/agms/response/hpp_response.rb +39 -0
  49. data/lib/agms/response/invoicing_response.rb +10 -0
  50. data/lib/agms/response/recurring_response.rb +28 -0
  51. data/lib/agms/response/report_response.rb +141 -0
  52. data/lib/agms/response/response.rb +48 -0
  53. data/lib/agms/response/safe_response.rb +51 -0
  54. data/lib/agms/response/transaction_response.rb +50 -0
  55. data/lib/agms/safe.rb +66 -0
  56. data/lib/agms/transaction.rb +37 -0
  57. data/lib/agms/version.rb +3 -0
  58. metadata +156 -0
@@ -0,0 +1,10 @@
1
+ module Agms
2
+ class InvoicingResponse < Response
3
+ # A class representing AGMS Invoicing Response objects.
4
+
5
+ def initialize
6
+ @response = nil
7
+ @mapping = Array.new
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module Agms
2
+ class RecurringResponse < Response
3
+ # A class representing AGMS Recurring Response objects.
4
+
5
+ def initialize(response, op)
6
+ @response = nil
7
+ @op = op
8
+
9
+ response = response['soap:Envelope']['soap:Body'][op + 'Response'][op + 'Result']
10
+
11
+ if @op == 'RecurringAdd' or @op == 'RecurringDelete' or @op == 'RecurringUpdate'
12
+ @mapping = {
13
+ :RESULT => 'result',
14
+ :MSG => 'message',
15
+ :RecurringID => 'recurring_id',
16
+ }
17
+ elsif @op == 'RetrieveRecurringID'
18
+ @mapping = {
19
+ :RecurringID => 'recurring_id'
20
+ }
21
+ else
22
+ raise InvalidRequestError, 'Invalid op in Response.'
23
+ end
24
+ @response = response
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,141 @@
1
+ module Agms
2
+ class ReportResponse < Response
3
+ # A class representing AGMS Report Response objects.
4
+
5
+ def initialize(response, op)
6
+ super(response, op)
7
+ @response = nil
8
+ @op = op
9
+ arr = _parseReportResponse(response)
10
+
11
+ if @op == 'TransactionAPI'
12
+ @mapping = {
13
+ :id => 'id',
14
+ :transactionid => 'transaction_id',
15
+ :transactiontype => 'transaction_type',
16
+ :paymenttype => 'payment_type',
17
+ :amount => 'amount',
18
+ :orderdescription => 'order_description',
19
+ :orderid => 'order_id',
20
+ :ponumber => 'po_number',
21
+ :tax => 'tax_amount',
22
+ :shipping => 'shipping_amount',
23
+ :tipamount => 'tip_amount',
24
+ :ccnumber => 'cc_number',
25
+ :ccexpdate => 'cc_exp_date',
26
+ :checkname => 'ach_name',
27
+ :checkaba => 'ach_routing_number',
28
+ :checkaccount => 'ach_account_number',
29
+ :accountholdertype => 'ach_business_or_personal',
30
+ :accounttype => 'ach_checking_or_savings',
31
+ :seccode => 'ach_sec_code',
32
+ :safeaction => 'safe_action',
33
+ :responsesafeid => 'safe_id',
34
+ :clerkid => 'clerk_id',
35
+ :firstname => 'first_name',
36
+ :lastname => 'last_name',
37
+ :company => 'company_name',
38
+ :address1 => 'address',
39
+ :address2 => 'address_2',
40
+ :city => 'city',
41
+ :state => 'state',
42
+ :zip => 'zip',
43
+ :country => 'country',
44
+ :phone => 'phone',
45
+ :fax => 'fax',
46
+ :email => 'email',
47
+ :website => 'website',
48
+ :shippingfirstname => 'shipping_first_name',
49
+ :shippinglastname => 'shipping_last_name',
50
+ :shippingcompany => 'shipping_company_name',
51
+ :shippingaddress1 => 'shipping_address',
52
+ :shippingaddress2 => 'shipping_address_2',
53
+ :shippingcity => 'shipping_city',
54
+ :shippingstate => 'shipping_state',
55
+ :shippingzip => 'shipping_zip',
56
+ :shippingcountry => 'shipping_country',
57
+ :shippingemail => 'shipping_email',
58
+ :shippingphone => 'shipping_phone',
59
+ :shippingfax => 'shipping_fax',
60
+ :shippingcarrier => 'shipping_carrier',
61
+ :trackingnumber => 'shipping_tracking',
62
+ :ipaddress => 'ip_address',
63
+ :customfield1 => 'custom_field_1',
64
+ :customfield2 => 'custom_field_2',
65
+ :customfield3 => 'custom_field_3',
66
+ :customfield4 => 'custom_field_4',
67
+ :customfield5 => 'custom_field_5',
68
+ :customfield6 => 'custom_field_6',
69
+ :customfield7 => 'custom_field_7',
70
+ :customfield8 => 'custom_field_8',
71
+ :customfield9 => 'custom_field_9',
72
+ :customfield10 => 'custom_field_10',
73
+ :customfield11 => 'custom_field_11',
74
+ :customfield12 => 'custom_field_12',
75
+ :customfield13 => 'custom_field_13',
76
+ :customfield14 => 'custom_field_14',
77
+ :customfield15 => 'custom_field_15',
78
+ :customfield16 => 'custom_field_16',
79
+ :customfield17 => 'custom_field_17',
80
+ :customfield18 => 'custom_field_18',
81
+ :customfield19 => 'custom_field_19',
82
+ :customfield20 => 'custom_field_20',
83
+ :receipttype => 'receipt_type',
84
+ :responsestatuscode => 'response_code',
85
+ :responsestatusmsg => 'response_message',
86
+ :responsetransid => 'response_transaction_id',
87
+ :responseauthcode => 'authorization_code',
88
+ :transactiondate => 'transaction_date',
89
+ :createdate => 'date_created',
90
+ :moddate => 'date_last_modified',
91
+ :createuser => 'created_by',
92
+ :moduser => 'modified_by',
93
+ :useragent => 'user_agent'
94
+ }
95
+ if arr
96
+ @response = arr
97
+ else
98
+ @response = Array.new
99
+ end
100
+ elsif @op == 'QuerySAFE'
101
+ if arr
102
+ @response = arr
103
+ else
104
+ @response = Array.new
105
+ end
106
+ else
107
+ raise InvalidRequestError, 'Invalid op in Response.'
108
+ end
109
+ end
110
+
111
+ def toArray
112
+ # Override toArray method to handle array response
113
+ response = Array.new
114
+ if @response
115
+ @response.each do |result|
116
+ response << mapResponse(result)
117
+ end
118
+ end
119
+ return response
120
+ end
121
+
122
+ def getSafeId
123
+ response_array = toArray()
124
+ return response_array['safe_id']
125
+ end
126
+
127
+ # Parse transaction report response received from gateway
128
+ def _parseReportResponse(xml)
129
+ # Parse the response body
130
+ doc = Nokogiri::XML(xml)
131
+ # Remove the namespaces
132
+ doc.remove_namespaces!
133
+ response = {}
134
+ # Extract the response data from the ProcessTransactionResult node
135
+ doc.xpath("//transactions//transaction//*").each do |node|
136
+ response[node.name] = node.children.text
137
+ end
138
+ return response
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,48 @@
1
+ module Agms
2
+ class Response
3
+ # A class representing AGMS Response objects.
4
+
5
+ def initialize(response, op)
6
+ @response = response
7
+ @op = op
8
+ @mapping = nil
9
+ end
10
+
11
+ def toArray
12
+ return mapResponse(@response)
13
+ end
14
+
15
+ def mapResponse(arr)
16
+ if @mapping
17
+ response = doMap(arr)
18
+ return response
19
+ else
20
+ raise UnexpectedError, 'Response mapping not defined for this API.'
21
+ end
22
+ end
23
+
24
+ def doMap(arr)
25
+ response = Hash.new
26
+ mapping = @mapping
27
+ if mapping
28
+ # We only map the end of the array containing data
29
+ # If this element is an array, then we map its individual sub-arrays
30
+ # Otherwise, we map
31
+ arr.each do |key, value|
32
+
33
+ if value.class == Hash
34
+ response << doMap(value)
35
+ else
36
+
37
+ if not mapping.has_key?(key)
38
+ raise UnexpectedError, "Unmapped field #{key} in response."
39
+ else
40
+ response[mapping[key]] = value
41
+ end
42
+ end
43
+ end
44
+ end
45
+ return response
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,51 @@
1
+ module Agms
2
+ class SAFEResponse < Response
3
+ # A class representing AGMS SAFE Response objects.
4
+
5
+ def initialize(response, op)
6
+ super(response, op)
7
+ @mapping = {
8
+ 'STATUS_CODE' => 'response_code',
9
+ 'STATUS_MSG' => 'response_message',
10
+ 'TRANS_ID' => 'transaction_id',
11
+ 'AUTH_CODE' => 'authorization_code',
12
+ 'AVS_CODE' => 'avs_result',
13
+ 'AVS_MSG' => 'avs_message',
14
+ 'CVV2_CODE' => 'cvv_result',
15
+ 'CVV2_MSG' => 'cvv_message',
16
+ 'ORDERID' => 'order_id',
17
+ 'SAFE_ID' => 'safe_id',
18
+ 'FULLRESPONSE' => 'full_response',
19
+ 'POSTSTRING' => 'post_string',
20
+ 'BALANCE' => 'gift_balance',
21
+ 'GIFTRESPONSE' => 'gift_response',
22
+ 'MERCHANT_ID' => 'merchant_id',
23
+ 'CUSTOMER_MESSAGE' => 'customer_message',
24
+ 'RRN' => 'rrn'
25
+ }
26
+
27
+ @response = response
28
+ @op = op
29
+
30
+ if not isSuccessful()
31
+ response_array = toArray()
32
+ raise ResponseError.new("Transaction failed with error code #{response_array['response_code']} and message #{response_array['response_message']}", response_array)
33
+ end
34
+ end
35
+
36
+ def isSuccessful
37
+ response_array = toArray()
38
+ code = response_array['response_code']
39
+ if code != '1' and code != '2'
40
+ return false
41
+ else
42
+ return true
43
+ end
44
+ end
45
+
46
+ def getSafeId
47
+ response_array = toArray()
48
+ return response_array['safe_id']
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,50 @@
1
+ module Agms
2
+ class TransactionResponse < Response
3
+ # A class representing AGMS Transaction Response objects.
4
+
5
+ def initialize(response, op)
6
+ super(response, op)
7
+ @mapping = {
8
+ 'STATUS_CODE' => 'response_code',
9
+ 'STATUS_MSG' => 'response_message',
10
+ 'TRANS_ID' => 'transaction_id',
11
+ 'AUTH_CODE' => 'authorization_code',
12
+ 'AVS_CODE' => 'avs_result',
13
+ 'AVS_MSG' => 'avs_message',
14
+ 'CVV2_CODE' => 'cvv_result',
15
+ 'CVV2_MSG' => 'cvv_message',
16
+ 'ORDERID' => 'order_id',
17
+ 'SAFE_ID' => 'safe_id',
18
+ 'FULLRESPONSE' => 'full_response',
19
+ 'POSTSTRING' => 'post_string',
20
+ 'BALANCE' => 'gift_balance',
21
+ 'GIFTRESPONSE' => 'gift_response',
22
+ 'MERCHANT_ID' => 'merchant_id',
23
+ 'CUSTOMER_MESSAGE' => 'customer_message',
24
+ 'RRN' => 'rrn'
25
+ }
26
+
27
+ @response = response
28
+ @op = op
29
+
30
+ if not isSuccessful()
31
+ response_array = toArray()
32
+ raise ResponseError.new("Transaction failed with error code #{response_array['response_code']} and message #{response_array['response_message']}", response_array)
33
+ end
34
+ end
35
+
36
+ def isSuccessful
37
+ response_array = toArray()
38
+ if response_array['response_code'] != '1' and response_array['response_code'] != '2'
39
+ return false
40
+ else
41
+ return true
42
+ end
43
+ end
44
+
45
+ def getAuthorization
46
+ response_array = toArray()
47
+ return response_array['transaction_id']
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,66 @@
1
+ module Agms
2
+ class SAFE < Agms
3
+ # A class representing AGMS SAFE objects.
4
+
5
+ alias AgmsResetParameters resetParameters
6
+ alias AgmsSetParameter setParameter
7
+ alias AgmsDoConnect doConnect
8
+
9
+ def initialize
10
+ super()
11
+ @api_url = 'https://gateway.agms.com/roxapi/AGMS_SAFE_API.asmx'
12
+ @requestObject = 'SAFERequest'
13
+ @responseObject = 'SAFEResponse'
14
+ end
15
+
16
+ # @return [Object]
17
+ def add(params)
18
+ @op = 'AddToSAFE'
19
+ AgmsResetParameters()
20
+ AgmsSetParameter(:SAFE_Action, {:value => 'add_safe'})
21
+ params.each do |param, config|
22
+ AgmsSetParameter(param, config)
23
+ end
24
+ self.execute()
25
+ return @response.toArray()
26
+ end
27
+
28
+ # @return [Object]
29
+ def update(params)
30
+ @op = 'UpdateSAFE'
31
+ AgmsResetParameters()
32
+ AgmsSetParameter(:SAFE_Action, {:value => 'update_safe'})
33
+ params.each do |param, config|
34
+ AgmsSetParameter(param, config)
35
+ end
36
+ self.execute()
37
+ return @response.toArray()
38
+ end
39
+
40
+ # @return [Object]
41
+ def delete(params)
42
+ @op = 'DeleteFromSAFE'
43
+ AgmsResetParameters()
44
+ AgmsSetParameter(:SAFE_Action, {:value => 'delete_safe'})
45
+ params.each do |param, config|
46
+ AgmsSetParameter(param, config)
47
+ end
48
+ self.execute()
49
+ return @response.toArray()
50
+ end
51
+
52
+ protected
53
+ def execute
54
+ if @op == 'AddToSAFE'
55
+ AgmsDoConnect('AddToSAFE', @responseObject)
56
+ elsif @op == 'UpdateSAFE'
57
+ AgmsDoConnect('UpdateSAFE', @responseObject)
58
+ elsif @op == 'DeleteFromSAFE'
59
+ AgmsDoConnect('DeleteFromSAFE', @responseObject)
60
+ else
61
+ raise InvalidRequestError, "Invalid request to Transaction API #{@op}"
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,37 @@
1
+ module Agms
2
+ class Transaction < Agms
3
+ # A class representing AGMS Transaction objects.
4
+
5
+ alias AgmsResetParameters resetParameters
6
+ alias AgmsSetParameter setParameter
7
+ alias AgmsDoConnect doConnect
8
+
9
+ def initialize
10
+ super()
11
+ @api_url = 'https://gateway.agms.com/roxapi/agms.asmx'
12
+ @requestObject = 'TransactionRequest'
13
+ @responseObject = 'TransactionResponse'
14
+ end
15
+
16
+ # @return [Object]
17
+ def process(params)
18
+ @op = 'ProcessTransaction'
19
+ AgmsResetParameters()
20
+ params.each do |param, config|
21
+ AgmsSetParameter(param, config)
22
+ end
23
+ self.execute()
24
+ return @response.toArray()
25
+ end
26
+
27
+ protected
28
+ def execute
29
+ if @op == 'ProcessTransaction'
30
+ AgmsDoConnect('ProcessTransaction', @responseObject)
31
+ else
32
+ raise InvalidRequestError, "Invalid request to Transaction API #{@op}"
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Agms
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: agms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Maanas Royy
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Ruby Library for integrating AGMS Gateway
70
+ email:
71
+ - maanas@agms.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .travis.yml
77
+ - Gemfile
78
+ - README.md
79
+ - Rakefile
80
+ - agms.gemspec
81
+ - bin/console
82
+ - bin/setup
83
+ - example/hpp.rb
84
+ - example/invoicing.rb
85
+ - example/recurring.rb
86
+ - example/report.rb
87
+ - example/safe.rb
88
+ - example/transaction.rb
89
+ - init.yml
90
+ - lib/agms.rb
91
+ - lib/agms/agms.rb
92
+ - lib/agms/configuration.rb
93
+ - lib/agms/connect.rb
94
+ - lib/agms/error/agms_error.rb
95
+ - lib/agms/error/authentication_error.rb
96
+ - lib/agms/error/authorization_error.rb
97
+ - lib/agms/error/client_error_error.rb
98
+ - lib/agms/error/configuation_error.rb
99
+ - lib/agms/error/down_for_maintenance_error.rb
100
+ - lib/agms/error/forged_query_String_error.rb
101
+ - lib/agms/error/invalid_parameter_error.rb
102
+ - lib/agms/error/invalid_request_error.rb
103
+ - lib/agms/error/invalid_signature_error.rb
104
+ - lib/agms/error/not_found_error.rb
105
+ - lib/agms/error/request_validation_error.rb
106
+ - lib/agms/error/response_error.rb
107
+ - lib/agms/error/server_error_error.rb
108
+ - lib/agms/error/ssl_certificate_error.rb
109
+ - lib/agms/error/unexpected_error.rb
110
+ - lib/agms/error/upgrade_required_error.rb
111
+ - lib/agms/hpp.rb
112
+ - lib/agms/invoicing.rb
113
+ - lib/agms/recurring.rb
114
+ - lib/agms/report.rb
115
+ - lib/agms/request/hpp_request.rb
116
+ - lib/agms/request/invoicing_request.rb
117
+ - lib/agms/request/recurring_request.rb
118
+ - lib/agms/request/report_request.rb
119
+ - lib/agms/request/request.rb
120
+ - lib/agms/request/safe_request.rb
121
+ - lib/agms/request/transaction_request.rb
122
+ - lib/agms/response/hpp_response.rb
123
+ - lib/agms/response/invoicing_response.rb
124
+ - lib/agms/response/recurring_response.rb
125
+ - lib/agms/response/report_response.rb
126
+ - lib/agms/response/response.rb
127
+ - lib/agms/response/safe_response.rb
128
+ - lib/agms/response/transaction_response.rb
129
+ - lib/agms/safe.rb
130
+ - lib/agms/transaction.rb
131
+ - lib/agms/version.rb
132
+ homepage: http://www.onlinepaymentprocessing.com
133
+ licenses: []
134
+ metadata:
135
+ allowed_push_host: https://rubygems.org
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.4.5
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: AGMS Ruby Client Library
156
+ test_files: []