jamm 0.0.1 → 1.0.2

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -57
  3. data/.rubocop.yml +18 -25
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +99 -0
  6. data/README.md +4 -4
  7. data/Rakefile +2 -0
  8. data/jamm.gemspec +16 -3
  9. data/lib/jamm/api/api/customer_api.rb +265 -0
  10. data/lib/jamm/api/api/healthcheck_api.rb +76 -0
  11. data/lib/jamm/api/api/payment_api.rb +203 -0
  12. data/lib/jamm/api/api_client.rb +385 -0
  13. data/lib/jamm/api/api_error.rb +58 -0
  14. data/lib/jamm/api/configuration.rb +293 -0
  15. data/lib/jamm/api/models/customer_service_update_customer_body.rb +247 -0
  16. data/lib/jamm/api/models/protobuf_any.rb +209 -0
  17. data/lib/jamm/api/models/rpc_status.rb +218 -0
  18. data/lib/jamm/api/models/v1_buyer.rb +274 -0
  19. data/lib/jamm/api/models/v1_charge.rb +233 -0
  20. data/lib/jamm/api/models/v1_contract.rb +225 -0
  21. data/lib/jamm/api/models/v1_create_contract_with_charge_request.rb +217 -0
  22. data/lib/jamm/api/models/v1_create_contract_with_charge_response.rb +222 -0
  23. data/lib/jamm/api/models/v1_create_contract_without_charge_request.rb +212 -0
  24. data/lib/jamm/api/models/v1_create_contract_without_charge_response.rb +217 -0
  25. data/lib/jamm/api/models/v1_create_customer_request.rb +207 -0
  26. data/lib/jamm/api/models/v1_create_customer_response.rb +207 -0
  27. data/lib/jamm/api/models/v1_customer.rb +223 -0
  28. data/lib/jamm/api/models/v1_delete_customer_response.rb +207 -0
  29. data/lib/jamm/api/models/v1_get_contract_response.rb +212 -0
  30. data/lib/jamm/api/models/v1_get_customer_response.rb +207 -0
  31. data/lib/jamm/api/models/v1_initial_charge.rb +225 -0
  32. data/lib/jamm/api/models/v1_merchant.rb +212 -0
  33. data/lib/jamm/api/models/v1_merchant_customer.rb +213 -0
  34. data/lib/jamm/api/models/v1_payment_link.rb +221 -0
  35. data/lib/jamm/api/models/v1_ping_response.rb +207 -0
  36. data/lib/jamm/api/models/v1_update_customer_response.rb +207 -0
  37. data/lib/jamm/api/models/v1_url.rb +216 -0
  38. data/lib/jamm/api/version.rb +15 -0
  39. data/lib/jamm/api.rb +65 -0
  40. data/lib/jamm/client.rb +14 -0
  41. data/lib/jamm/customer.rb +28 -0
  42. data/lib/jamm/errors.rb +4 -14
  43. data/lib/jamm/oauth.rb +5 -5
  44. data/lib/jamm/payment.rb +19 -11
  45. data/lib/jamm/version.rb +3 -1
  46. data/lib/jamm.rb +37 -117
  47. metadata +62 -37
  48. data/.github/workflows/build.yml +0 -23
  49. data/.github/workflows/ruby-publish.yml +0 -24
  50. data/CONTRIBUTORS +0 -1
  51. data/images/jamm_logo.png +0 -0
  52. data/lib/jamm/api_operations/create.rb +0 -16
  53. data/lib/jamm/api_operations/get.rb +0 -16
  54. data/lib/jamm/api_operations/list.rb +0 -16
  55. data/lib/jamm/api_operations/update.rb +0 -16
  56. data/lib/jamm/api_resource.rb +0 -5
  57. data/lib/jamm/charge.rb +0 -10
  58. data/lib/jamm/jamm_object.rb +0 -249
  59. data/lib/jamm/request.rb +0 -13
  60. data/lib/jamm/time_util.rb +0 -41
  61. data/lib/jamm/token.rb +0 -10
  62. data/lib/jamm/util.rb +0 -76
  63. data/test/jamm/charge_test.rb +0 -56
  64. data/test/jamm/oauth_test.rb +0 -47
  65. data/test/jamm/payment_test.rb +0 -17
  66. data/test/jamm/time_util_test.rb +0 -18
  67. data/test/jamm/token_test.rb +0 -52
  68. data/test/test_data.rb +0 -118
  69. data/test/test_helper.rb +0 -59
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jamm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamm
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-21 00:00:00.000000000 Z
11
+ date: 2024-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -24,52 +24,84 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: typhoeus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.1
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.1
27
47
  description: Jamm help you make payment without credit cards
28
48
  email: support@jamm-pay.jp
29
49
  executables: []
30
50
  extensions: []
31
51
  extra_rdoc_files: []
32
52
  files:
33
- - ".github/workflows/build.yml"
34
- - ".github/workflows/ruby-publish.yml"
35
53
  - ".gitignore"
36
54
  - ".rubocop.yml"
37
- - CONTRIBUTORS
38
55
  - Gemfile
56
+ - Gemfile.lock
39
57
  - LICENSE
40
58
  - README.md
41
59
  - Rakefile
42
- - images/jamm_logo.png
43
60
  - jamm.gemspec
44
61
  - lib/jamm.rb
45
- - lib/jamm/api_operations/create.rb
46
- - lib/jamm/api_operations/get.rb
47
- - lib/jamm/api_operations/list.rb
48
- - lib/jamm/api_operations/update.rb
49
- - lib/jamm/api_resource.rb
50
- - lib/jamm/charge.rb
62
+ - lib/jamm/api.rb
63
+ - lib/jamm/api/api/customer_api.rb
64
+ - lib/jamm/api/api/healthcheck_api.rb
65
+ - lib/jamm/api/api/payment_api.rb
66
+ - lib/jamm/api/api_client.rb
67
+ - lib/jamm/api/api_error.rb
68
+ - lib/jamm/api/configuration.rb
69
+ - lib/jamm/api/models/customer_service_update_customer_body.rb
70
+ - lib/jamm/api/models/protobuf_any.rb
71
+ - lib/jamm/api/models/rpc_status.rb
72
+ - lib/jamm/api/models/v1_buyer.rb
73
+ - lib/jamm/api/models/v1_charge.rb
74
+ - lib/jamm/api/models/v1_contract.rb
75
+ - lib/jamm/api/models/v1_create_contract_with_charge_request.rb
76
+ - lib/jamm/api/models/v1_create_contract_with_charge_response.rb
77
+ - lib/jamm/api/models/v1_create_contract_without_charge_request.rb
78
+ - lib/jamm/api/models/v1_create_contract_without_charge_response.rb
79
+ - lib/jamm/api/models/v1_create_customer_request.rb
80
+ - lib/jamm/api/models/v1_create_customer_response.rb
81
+ - lib/jamm/api/models/v1_customer.rb
82
+ - lib/jamm/api/models/v1_delete_customer_response.rb
83
+ - lib/jamm/api/models/v1_get_contract_response.rb
84
+ - lib/jamm/api/models/v1_get_customer_response.rb
85
+ - lib/jamm/api/models/v1_initial_charge.rb
86
+ - lib/jamm/api/models/v1_merchant.rb
87
+ - lib/jamm/api/models/v1_merchant_customer.rb
88
+ - lib/jamm/api/models/v1_payment_link.rb
89
+ - lib/jamm/api/models/v1_ping_response.rb
90
+ - lib/jamm/api/models/v1_update_customer_response.rb
91
+ - lib/jamm/api/models/v1_url.rb
92
+ - lib/jamm/api/version.rb
93
+ - lib/jamm/client.rb
94
+ - lib/jamm/customer.rb
51
95
  - lib/jamm/errors.rb
52
- - lib/jamm/jamm_object.rb
53
96
  - lib/jamm/oauth.rb
54
97
  - lib/jamm/payment.rb
55
- - lib/jamm/request.rb
56
- - lib/jamm/time_util.rb
57
- - lib/jamm/token.rb
58
- - lib/jamm/util.rb
59
98
  - lib/jamm/version.rb
60
- - test/jamm/charge_test.rb
61
- - test/jamm/oauth_test.rb
62
- - test/jamm/payment_test.rb
63
- - test/jamm/time_util_test.rb
64
- - test/jamm/token_test.rb
65
- - test/test_data.rb
66
- - test/test_helper.rb
67
- homepage: ''
99
+ homepage: https://jamm-pay.jp
68
100
  licenses:
69
101
  - MIT
70
102
  metadata:
71
103
  source_code_uri: https://github.com/jamm-pay/Jamm-SDK-Ruby
72
- post_install_message:
104
+ post_install_message:
73
105
  rdoc_options: []
74
106
  require_paths:
75
107
  - lib
@@ -84,15 +116,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
116
  - !ruby/object:Gem::Version
85
117
  version: '0'
86
118
  requirements: []
87
- rubygems_version: 3.4.19
88
- signing_key:
119
+ rubygems_version: 3.2.3
120
+ signing_key:
89
121
  specification_version: 4
90
122
  summary: Ruby SDK for the Jamm API
91
- test_files:
92
- - test/jamm/charge_test.rb
93
- - test/jamm/oauth_test.rb
94
- - test/jamm/payment_test.rb
95
- - test/jamm/time_util_test.rb
96
- - test/jamm/token_test.rb
97
- - test/test_data.rb
98
- - test/test_helper.rb
123
+ test_files: []
@@ -1,23 +0,0 @@
1
- name: Multibranch Ruby CI Flow
2
-
3
- on:
4
- pull_request:
5
- branches:
6
- - main
7
- push:
8
- branches:
9
- - main
10
-
11
- jobs:
12
- build:
13
- runs-on: ubuntu-latest
14
- steps:
15
- - uses: actions/checkout@v4
16
- - name: Ruby setup
17
- uses: ruby/setup-ruby@v1
18
- with:
19
- ruby-version: "3.2.2"
20
- - name: Install dependencies
21
- run: bundle install
22
- - name: Run Test
23
- run: bundle exec rake
@@ -1,24 +0,0 @@
1
- name: Publish Ruby Package
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- jobs:
8
- deploy:
9
-
10
- runs-on: ubuntu-latest
11
-
12
- steps:
13
- - uses: actions/checkout@v4
14
- - name: Set up Ruby
15
- uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: '3.2'
18
- bundler-cache: true
19
- - name: Build and publish
20
- env:
21
- GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
22
- run: |
23
- bundle exec rake build
24
- bundle exec gem push pkg/jamm-*.gem
data/CONTRIBUTORS DELETED
@@ -1 +0,0 @@
1
- Tomu Hirata tomu.hirata@gmail.com
data/images/jamm_logo.png DELETED
Binary file
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jamm
4
- module APIOperations
5
- module Create
6
- def create(params = {}, headers = {})
7
- request_jamm_api(
8
- method: :post,
9
- path: resource_url,
10
- params: params,
11
- headers: headers
12
- )
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jamm
4
- module APIOperations
5
- module Get
6
- def get(id, params = {}, headers = {})
7
- request_jamm_api(
8
- method: :get,
9
- path: "#{resource_url}/#{id}",
10
- params: params,
11
- headers: headers
12
- )
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jamm
4
- module APIOperations
5
- module List
6
- def list(params = {}, headers = {})
7
- request_jamm_api(
8
- method: :get,
9
- path: resource_url,
10
- params: params,
11
- headers: headers
12
- )
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jamm
4
- module APIOperations
5
- module Update
6
- def update(id, params = {}, headers = {})
7
- request_jamm_api(
8
- method: :patch,
9
- path: "#{resource_url}/#{id}",
10
- params: params,
11
- headers: headers
12
- )
13
- end
14
- end
15
- end
16
- end
@@ -1,5 +0,0 @@
1
- module Jamm
2
- class APIResource
3
- include Jamm::Request
4
- end
5
- end
data/lib/jamm/charge.rb DELETED
@@ -1,10 +0,0 @@
1
- module Jamm
2
- class Charge < APIResource
3
- extend Jamm::APIOperations::List
4
- extend Jamm::APIOperations::Get
5
-
6
- def self.resource_url
7
- '/payments/charges'
8
- end
9
- end
10
- end
@@ -1,249 +0,0 @@
1
- module Jamm
2
- class JammObject
3
- include Enumerable
4
-
5
- @@permanent_attributes = Set.new([:id]) # rubocop:disable Style/ClassVars
6
-
7
- # The default :id method is deprecated and isn't useful to us
8
- undef :id if method_defined?(:id)
9
-
10
- def initialize(id = nil)
11
- # parameter overloading!
12
- if id.is_a?(Hash)
13
- @retrieve_params = id.dup
14
- @retrieve_params.delete(:id)
15
- id = id[:id]
16
- else
17
- @retrieve_params = {}
18
- end
19
-
20
- @values = {}
21
- # This really belongs in APIResource, but not putting it there allows us
22
- # to have a unified inspect method
23
- @unsaved_values = Set.new
24
- @transient_values = Set.new
25
- @values[:id] = id if id
26
- end
27
-
28
- def self.construct_from(values)
29
- new(values[:id]).refresh_from(values)
30
- end
31
-
32
- def to_s(*_args)
33
- JSON.pretty_generate(@values)
34
- end
35
-
36
- def inspect
37
- id_string = respond_to?(:id) && !id.nil? ? " id=#{id}" : ''
38
- "#<#{self.class}:0x#{object_id.to_s(16)}#{id_string}> JSON: " + JSON.pretty_generate(@values)
39
- end
40
-
41
- def refresh_from(values, partial: false)
42
- @original_values = Marshal.load(Marshal.dump(values)) # deep copy
43
- removed = partial ? Set.new : Set.new(@values.keys - values.keys)
44
- added = Set.new(values.keys - @values.keys)
45
- # Wipe old state before setting new. This is useful for e.g. updating a
46
- # customer, where there is no persistent card parameter. Mark those values
47
- # which don't persist as transient
48
-
49
- instance_eval do
50
- remove_accessors(removed)
51
- add_accessors(added)
52
- end
53
- removed.each do |k|
54
- @values.delete(k)
55
- @transient_values.add(k)
56
- @unsaved_values.delete(k)
57
- end
58
- values.each do |k, v|
59
- @values[k] = Util.convert_to_jamm_object(v)
60
- @transient_values.delete(k)
61
- @unsaved_values.delete(k)
62
- end
63
-
64
- self
65
- end
66
-
67
- def [](k)
68
- @values[k.to_sym]
69
- end
70
-
71
- def []=(k, v)
72
- send(:"#{k}=", v)
73
- end
74
-
75
- def keys
76
- @values.keys
77
- end
78
-
79
- def values
80
- @values.values
81
- end
82
-
83
- def to_json(*_a)
84
- JSON.generate(@values)
85
- end
86
-
87
- def as_json(*a)
88
- @values.as_json(*a)
89
- end
90
-
91
- def to_hash
92
- @values.transform_values do |value|
93
- value.respond_to?(:to_hash) ? value.to_hash : value
94
- end
95
- end
96
-
97
- def each(&blk)
98
- @values.each(&blk)
99
- end
100
-
101
- def _dump(_level)
102
- Marshal.dump(@values)
103
- end
104
-
105
- def self._load(args)
106
- values = Marshal.load(args)
107
- construct_from(values)
108
- end
109
-
110
- def serialize_nested_object(key)
111
- new_value = @values[key]
112
- return {} if new_value.is_a?(APIResource)
113
-
114
- if @unsaved_values.include?(key)
115
- # the object has been reassigned
116
- # e.g. as object.key = {foo => bar}
117
- update = new_value
118
- new_keys = update.keys.map(&:to_sym)
119
-
120
- # remove keys at the server, but not known locally
121
- if @original_values.include?(key)
122
- keys_to_unset = @original_values[key].keys - new_keys
123
- keys_to_unset.each { |unset_key| update[unset_key] = '' }
124
- end
125
-
126
- update
127
- else
128
- # can be serialized normally
129
- self.class.serialize_params(new_value)
130
- end
131
- end
132
-
133
- def self.serialize_params(obj, original_value = nil)
134
- case obj
135
- when nil
136
- ''
137
- when JammObject
138
- unsaved_keys = obj.instance_variable_get(:@unsaved_values)
139
- obj_values = obj.instance_variable_get(:@values)
140
- update_hash = {}
141
-
142
- unsaved_keys.each do |k|
143
- update_hash[k] = serialize_params(obj_values[k])
144
- end
145
-
146
- obj_values.each do |k, v|
147
- if v.is_a?(JammObject) || v.is_a?(Hash)
148
- update_hash[k] = obj.serialize_nested_object(k)
149
- elsif v.is_a?(Array)
150
- original_value = obj.instance_variable_get(:@original_values)[k]
151
- if original_value && original_value.length > v.length
152
- # url params provide no mechanism for deleting an item in an array,
153
- # just overwriting the whole array or adding new items. So let's not
154
- # allow deleting without a full overwrite until we have a solution.
155
- raise ArgumentError, 'You cannot delete an item from an array, you must instead set a new array'
156
- end
157
-
158
- update_hash[k] = serialize_params(v, original_value)
159
- end
160
- end
161
-
162
- update_hash
163
- when Array
164
- update_hash = {}
165
- obj.each_with_index do |value, index|
166
- update = serialize_params(value)
167
- update_hash[index] = update if update != {} && (!original_value || update != original_value[index])
168
- end
169
-
170
- if update_hash == {}
171
- nil
172
- else
173
- update_hash
174
- end
175
- else
176
- obj
177
- end
178
- end
179
-
180
- protected
181
-
182
- def metaclass
183
- class << self; self; end
184
- end
185
-
186
- def remove_accessors(keys)
187
- metaclass.instance_eval do
188
- keys.each do |k|
189
- next if @@permanent_attributes.include?(k)
190
-
191
- k_eq = :"#{k}="
192
- remove_method(k) if method_defined?(k)
193
- remove_method(k_eq) if method_defined?(k_eq)
194
- end
195
- end
196
- end
197
-
198
- def add_accessors(keys)
199
- metaclass.instance_eval do
200
- keys.each do |k|
201
- next if @@permanent_attributes.include?(k)
202
-
203
- k_eq = :"#{k}="
204
- define_method(k) { @values[k] }
205
- define_method(k_eq) do |v|
206
- if v == ''
207
- raise ArgumentError, "You cannot set #{k} to an empty string." \
208
- 'We interpret empty strings as nil in requests.' \
209
- "You may set #{self}.#{k} = nil to delete the property."
210
- end
211
- @values[k] = v
212
- @unsaved_values.add(k)
213
- end
214
- end
215
- end
216
- end
217
-
218
- def method_missing(name, *args)
219
- if name.to_s.end_with?('=')
220
- attr = name.to_s[0...-1].to_sym
221
- add_accessors([attr])
222
- begin
223
- mth = method(name)
224
- rescue NameError
225
- raise NoMethodError,
226
- "Cannot set #{attr} on this object. HINT: you can't set: #{@@permanent_attributes.to_a.join(', ')}"
227
- end
228
- return mth.call(args[0])
229
- elsif @values.key?(name)
230
- return @values[name]
231
- end
232
-
233
- begin
234
- super
235
- rescue NoMethodError => e
236
- if @transient_values.include?(name)
237
- raise NoMethodError,
238
- e.message + ". HINT: The '#{name}' attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by Jamm's API, probably as a result of a save(). The attributes currently available on this object are: #{@values.keys.join(', ')}"
239
- end
240
-
241
- raise
242
- end
243
- end
244
-
245
- def respond_to_missing?(symbol, include_private = false)
246
- @values&.key?(symbol) || super
247
- end
248
- end
249
- end
data/lib/jamm/request.rb DELETED
@@ -1,13 +0,0 @@
1
- module Jamm
2
- module Request
3
- module ClassMethods
4
- def request_jamm_api(method:, path:, params: {}, headers: {})
5
- Jamm.request_jamm_api(method, path, params, headers)
6
- end
7
- end
8
-
9
- def self.included(base)
10
- base.extend(ClassMethods)
11
- end
12
- end
13
- end
@@ -1,41 +0,0 @@
1
- require 'time'
2
- module Jamm
3
- class TimeUtil
4
- def self.relative_time_to_iso(relative_time)
5
- # Check if the input string is in ISO format
6
- return relative_time if iso_format?(relative_time)
7
-
8
- # Parse the relative time string
9
- quantity, unit = relative_time.split
10
- quantity = quantity.to_i
11
-
12
- # Calculate the time delta
13
- case unit.downcase
14
- when 'second', 'seconds'
15
- time_delta = quantity
16
- when 'minute', 'minutes'
17
- time_delta = quantity * 60
18
- when 'hour', 'hours'
19
- time_delta = quantity * 60 * 60
20
- when 'day', 'days'
21
- time_delta = quantity * 60 * 60 * 24
22
- when 'week', 'weeks'
23
- time_delta = quantity * 60 * 60 * 24 * 7
24
- else
25
- raise ArgumentError, "Unknown time unit: #{unit}"
26
- end
27
-
28
- # Calculate the ISO datetime string
29
- iso_time = Time.now + time_delta
30
- iso_time.strftime('%Y-%m-%dT%H:%M:%SZ')
31
- end
32
-
33
- def self.iso_format?(string)
34
- # Check if the string matches the ISO 8601 datetime format
35
-
36
- !!Time.iso8601(string)
37
- rescue StandardError
38
- false
39
- end
40
- end
41
- end
data/lib/jamm/token.rb DELETED
@@ -1,10 +0,0 @@
1
- module Jamm
2
- class Token < APIResource
3
- extend Jamm::APIOperations::List
4
- extend Jamm::APIOperations::Get
5
-
6
- def self.resource_url
7
- '/payments/tokens'
8
- end
9
- end
10
- end
data/lib/jamm/util.rb DELETED
@@ -1,76 +0,0 @@
1
- module Jamm
2
- module Util
3
- def self.convert_to_jamm_object(response)
4
- case response
5
- when Array
6
- response.map { |i| convert_to_jamm_object(i) }
7
- when Hash
8
- JammObject.construct_from(response)
9
- else
10
- response
11
- end
12
- end
13
-
14
- def self.symbolize_names(object)
15
- case object
16
- when Hash
17
- new_hash = {}
18
- object.each do |key, value|
19
- key = begin
20
- key.to_sym
21
- rescue StandardError
22
- key
23
- end || key
24
- new_hash[key] = symbolize_names(value)
25
- end
26
- new_hash
27
- when Array
28
- object.map { |value| symbolize_names(value) }
29
- else
30
- object
31
- end
32
- end
33
-
34
- def self.url_encode(key)
35
- # URI.escape is obsolete, so just use the code fragment in URI library
36
- # (from URI::RFC2396_Parser#escape)
37
- key.to_s.gsub(Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) do
38
- us = ::Regexp.last_match(0)
39
- tmp = ''
40
- us.each_byte do |uc|
41
- tmp << format('%%%02X', uc)
42
- end
43
- tmp
44
- end.force_encoding(Encoding::US_ASCII)
45
- end
46
-
47
- def self.flatten_params(params, parent_key = nil)
48
- result = []
49
- params.each do |key, value|
50
- calculated_key = parent_key ? "#{parent_key}[#{url_encode(key)}]" : url_encode(key)
51
- if value.is_a?(Hash)
52
- result += flatten_params(value, calculated_key)
53
- elsif value.is_a?(Array)
54
- result += flatten_params_array(value, calculated_key)
55
- else
56
- result << [calculated_key, value]
57
- end
58
- end
59
- result
60
- end
61
-
62
- def self.flatten_params_array(value, calculated_key)
63
- result = []
64
- value.each do |elem|
65
- if elem.is_a?(Hash)
66
- result += flatten_params(elem, calculated_key)
67
- elsif elem.is_a?(Array)
68
- result += flatten_params_array(elem, calculated_key)
69
- else
70
- result << ["#{calculated_key}[]", elem]
71
- end
72
- end
73
- result
74
- end
75
- end
76
- end