sunstone 6.0.0.8 → 6.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c4334de568780ae0f1bfff51878a34df6efc921931b3b8369d4c3dbf0212fc3
4
- data.tar.gz: 16ffa50224484c100d4161a77cb9618ac206ab56b9c11dbf5f78e5d4863b693b
3
+ metadata.gz: afae21d218aa760e3a36c2db071a80f25f825fb618f56c9bc9cb25ddb628ee23
4
+ data.tar.gz: a1b4c27957ba0330a74bab059b5b352c56d74eeafd0d9e910845badae194a0e5
5
5
  SHA512:
6
- metadata.gz: 1ae9e8e867434bdaa2df09eda49c69d80394b1a3f662a2d1fe7e01ea506379e03ad1092782ce87d9059ad64bc84cee590b7c5e0bd4000245c15a0a143279d1c1
7
- data.tar.gz: ca3fc4d00c10174a3ec7d6255e04f957e69ecaa9f0d3e6d2c7019774b42922980cafa574f90afeace08f6b35cbd7b79e9e7b22cc64e6a5ea964ab2bd77bb0e61
6
+ metadata.gz: 2bf28e210e209846f11c287b7153669721211b86e1e27de9388b52bbdeb37abe1ea53c8370abfc11ab50132275804796912eeeb67c0c4e83cd840f54be44634b
7
+ data.tar.gz: b0eb0399c0a7ff542d06b9b3b83a1dbc699d4de11b75e24813186fd6f6c6de375713903ecc4886efb6b78395bc44f77841238d365ec389ada64bfeca95449626
@@ -1,4 +1,4 @@
1
- dist: xenial
1
+ dist: bionic
2
2
  language: ruby
3
3
  sudo: false
4
4
 
@@ -8,23 +8,42 @@ cache:
8
8
  - /home/travis/.rvm/gems
9
9
 
10
10
  rvm:
11
- - 2.6
11
+ - 2.7
12
12
 
13
13
  env:
14
14
  matrix:
15
- - RAILS_VERSION=v6.0.0 GEM=activerecord:mysql2
16
- - RAILS_VERSION=v6.0.0 GEM=activerecord:sqlite3
17
- - RAILS_VERSION=v6.0.0 GEM=activerecord:postgresql
15
+ - RAILS_VERSION=v6.1.0 TASK='db:mysql:rebuild mysql2:test'
16
+ - RAILS_VERSION=v6.1.0 TASK='db:mysql:rebuild mysql2:isolated_test'
17
+ - RAILS_VERSION=v6.1.0 TASK='db:postgresql:rebuild postgresql:test'
18
+ - RAILS_VERSION=v6.1.0 TASK='db:postgresql:rebuild postgresql:isolated_test'
19
+ - RAILS_VERSION=v6.1.0 TASK='sqlite3:test'
20
+ - RAILS_VERSION=v6.1.0 TASK='sqlite3:isolated_test'
21
+ - RAILS_VERSION=v6.1.0 TASK='sqlite3_mem:test'
18
22
 
19
23
  services:
20
24
  - mysql
21
25
  addons:
22
- postgresql: "10"
26
+ postgresql: "13"
27
+ apt:
28
+ packages:
29
+ - postgresql-13
30
+ - postgresql-client-13
31
+
23
32
 
24
33
  before_install:
34
+ - sudo sed -i 's/port = 5433/port = 5432/' /etc/postgresql/13/main/postgresql.conf
35
+ - sudo cp /etc/postgresql/{9.3,13}/main/pg_hba.conf
36
+ - sudo pg_ctlcluster 13 main restart
25
37
  - unset BUNDLE_GEMFILE
26
38
  - gem update --system
27
39
  - gem update bundler
40
+ - gem install bundler --version 1.17.3
41
+ - mysql -e "create user rails@localhost;"
42
+ - mysql -e "grant all privileges on activerecord_unittest.* to rails@localhost;"
43
+ - mysql -e "grant all privileges on activerecord_unittest2.* to rails@localhost;"
44
+ - mysql -e "grant all privileges on inexistent_activerecord_unittest.* to rails@localhost;"
45
+ - mysql -e "create database activerecord_unittest default character set utf8mb4;"
46
+ - mysql -e "create database activerecord_unittest2 default character set utf8mb4;"
28
47
 
29
48
  install:
30
49
  - git clone --branch $RAILS_VERSION https://github.com/rails/rails.git ~/build/rails
@@ -46,4 +65,4 @@ before_script:
46
65
 
47
66
  script:
48
67
  - bundle exec rake test
49
- - cd ~/build/rails && ci/travis.rb
68
+ - cd ~/build/rails/activerecord && bundle exec rake $TASK
@@ -35,11 +35,11 @@ module ActiveRecord
35
35
  hm_options[:through] = middle_reflection.name
36
36
  hm_options[:source] = join_model.right_reflection.name
37
37
 
38
- [:before_add, :after_add, :before_remove, :after_remove, :autosave, :validate, :join_table, :class_name, :extend].each do |k|
38
+ [:before_add, :after_add, :before_remove, :after_remove, :autosave, :validate, :join_table, :class_name, :extend, :strict_loading].each do |k|
39
39
  hm_options[k] = options[k] if options.key? k
40
40
  end
41
41
 
42
- has_many name, scope, hm_options, &extension
42
+ has_many name, scope, **hm_options, &extension
43
43
  _reflections[name.to_s].parent_reflection = habtm_reflection
44
44
  end
45
45
  end
@@ -6,8 +6,8 @@ module ActiveRecord
6
6
  # Returns a Hash of the Arel::Attributes and attribute values that have been
7
7
  # typecasted for use in an Arel insert/update method.
8
8
  def attributes_with_values(attribute_names)
9
- attrs = attribute_names.each_with_object({}) do |name, attrs|
10
- attrs[name] = _read_attribute(name)
9
+ attrs = attribute_names.index_with do |name|
10
+ _read_attribute(name)
11
11
  end
12
12
 
13
13
  if self.class.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
@@ -2,7 +2,7 @@ module ActiveRecord
2
2
  module Callbacks
3
3
  private
4
4
 
5
- def create_or_update(*) #:nodoc:
5
+ def create_or_update(**) #:nodoc:
6
6
  if self.class.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
7
7
  @_already_called ||= {}
8
8
  self.class.reflect_on_all_associations.each do |r|
@@ -1,12 +1,12 @@
1
1
  module ActiveRecord
2
2
  class PredicateBuilder # :nodoc:
3
3
 
4
- def expand_from_hash(attributes)
4
+ def expand_from_hash(attributes, &block)
5
5
  return ["1=0"] if attributes.empty?
6
6
 
7
7
  attributes.flat_map do |key, value|
8
8
  if value.is_a?(Hash) && !table.has_column?(key)
9
- ka = associated_predicate_builder(key).expand_from_hash(value)
9
+ ka = table.associated_table(key, &block).predicate_builder.expand_from_hash(value.stringify_keys)
10
10
  if self.send(:table).instance_variable_get(:@klass).connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
11
11
  ka.each { |k|
12
12
  if k.left.is_a?(Arel::Attributes::Attribute) || k.left.is_a?(Arel::Attributes::Relation)
@@ -28,13 +28,18 @@ module ActiveRecord
28
28
  value = [value] unless value.is_a?(Array)
29
29
  klass = PolymorphicArrayValue
30
30
  end
31
+ elsif associated_table.through_association?
32
+ next associated_table.predicate_builder.expand_from_hash(
33
+ associated_table.primary_key => value
34
+ )
31
35
  end
32
36
 
33
37
  klass ||= AssociationQueryValue
34
- queries = klass.new(associated_table, value).queries.map do |query|
35
- expand_from_hash(query).reduce(&:and)
38
+ queries = klass.new(associated_table, value).queries.map! do |query|
39
+ expand_from_hash(query)
36
40
  end
37
- queries.reduce(&:or)
41
+
42
+ grouping_queries(queries)
38
43
  elsif table.aggregated_with?(key)
39
44
  mapping = table.reflect_on_aggregation(key).mapping
40
45
  values = value.nil? ? [nil] : Array.wrap(value)
@@ -43,17 +48,18 @@ module ActiveRecord
43
48
  values = values.map do |object|
44
49
  object.respond_to?(aggr_attr) ? object.public_send(aggr_attr) : object
45
50
  end
46
- build(table.arel_attribute(column_name), values)
51
+ self[column_name, values]
47
52
  else
48
53
  queries = values.map do |object|
49
54
  mapping.map do |field_attr, aggregate_attr|
50
- build(table.arel_attribute(field_attr), object.try!(aggregate_attr))
51
- end.reduce(&:and)
55
+ self[field_attr, object.try!(aggregate_attr)]
56
+ end
52
57
  end
53
- queries.reduce(&:or)
58
+
59
+ grouping_queries(queries)
54
60
  end
55
61
  else
56
- build(table.arel_attribute(key), value)
62
+ self[key, value]
57
63
  end
58
64
  end
59
65
  end
@@ -77,7 +83,7 @@ module ActiveRecord
77
83
  relation
78
84
  end
79
85
 
80
- def instantiate(result_set, &block)
86
+ def instantiate(result_set, strict_loading_value, &block)
81
87
  seen = Hash.new { |i, object_id|
82
88
  i[object_id] = Hash.new { |j, child_class|
83
89
  j[child_class] = {}
@@ -98,14 +104,14 @@ module ActiveRecord
98
104
  result_set.each { |row_hash|
99
105
  parent_key = @klass.primary_key ? row_hash[@klass.primary_key] : row_hash
100
106
  parent = parents[parent_key] ||= @klass.instantiate(row_hash.select{|k,v| @klass.column_names.include?(k.to_s) }, &block)
101
- construct(parent, row_hash.select{|k,v| !@klass.column_names.include?(k.to_s) }, seen, model_cache)
107
+ construct(parent, row_hash.select{|k,v| !@klass.column_names.include?(k.to_s) }, seen, model_cache, strict_loading_value)
102
108
  }
103
109
  end
104
110
 
105
111
  parents.values
106
112
  end
107
113
 
108
- def construct(parent, relations, seen, model_cache)
114
+ def construct(parent, relations, seen, model_cache, strict_loading_value)
109
115
  relations.each do |key, attributes|
110
116
  reflection = parent.class.reflect_on_association(key)
111
117
  next unless reflection
@@ -116,22 +122,22 @@ module ActiveRecord
116
122
  else
117
123
  if parent.association_cached?(reflection.name)
118
124
  model = parent.association(reflection.name).target
119
- construct(model, attributes.select{|k,v| !model.class.column_names.include?(k.to_s) }, seen, model_cache)
125
+ construct(model, attributes.select{|k,v| !model.class.column_names.include?(k.to_s) }, seen, model_cache, strict_loading_value)
120
126
  end
121
127
  end
122
128
 
123
129
  if !reflection.collection?
124
- construct_association(parent, reflection, attributes, seen, model_cache)
130
+ construct_association(parent, reflection, attributes, seen, model_cache, strict_loading_value)
125
131
  else
126
132
  attributes.each do |row|
127
- construct_association(parent, reflection, row, seen, model_cache)
133
+ construct_association(parent, reflection, row, seen, model_cache, strict_loading_value)
128
134
  end
129
135
  end
130
136
 
131
137
  end
132
138
  end
133
139
 
134
- def construct_association(parent, reflection, attributes, seen, model_cache)
140
+ def construct_association(parent, reflection, attributes, seen, model_cache, strict_loading_value)
135
141
  return if attributes.nil?
136
142
 
137
143
  klass = if reflection.polymorphic?
@@ -143,7 +149,7 @@ module ActiveRecord
143
149
  model = seen[parent.object_id][klass][id]
144
150
 
145
151
  if model
146
- construct(model, attributes.select{|k,v| !klass.column_names.include?(k.to_s) }, seen, model_cache)
152
+ construct(model, attributes.select{|k,v| !klass.column_names.include?(k.to_s) }, seen, model_cache, strict_loading_value)
147
153
 
148
154
  other = parent.association(reflection.name)
149
155
 
@@ -155,14 +161,14 @@ module ActiveRecord
155
161
 
156
162
  other.set_inverse_instance(model)
157
163
  else
158
- model = construct_model(parent, reflection, id, attributes.select{|k,v| klass.column_names.include?(k.to_s) }, seen, model_cache)
164
+ model = construct_model(parent, reflection, id, attributes.select{|k,v| klass.column_names.include?(k.to_s) }, seen, model_cache, strict_loading_value)
159
165
  seen[parent.object_id][model.class.base_class][id] = model
160
- construct(model, attributes.select{|k,v| !klass.column_names.include?(k.to_s) }, seen, model_cache)
166
+ construct(model, attributes.select{|k,v| !klass.column_names.include?(k.to_s) }, seen, model_cache, strict_loading_value)
161
167
  end
162
168
  end
163
169
 
164
170
 
165
- def construct_model(record, reflection, id, attributes, seen, model_cache)
171
+ def construct_model(record, reflection, id, attributes, seen, model_cache, strict_loading_value)
166
172
  klass = if reflection.polymorphic?
167
173
  record.send(reflection.foreign_type).constantize
168
174
  else
@@ -191,12 +197,21 @@ module ActiveRecord
191
197
  relation.arel.eager_load = Arel::Nodes::EagerLoad.new(eager_load_values)
192
198
  else
193
199
  join_dependency = construct_join_dependency(
194
- eager_load_values + includes_values, Arel::Nodes::OuterJoin
200
+ eager_load_values | includes_values, Arel::Nodes::OuterJoin
195
201
  )
196
202
  relation = except(:includes, :eager_load, :preload).joins!(join_dependency)
197
203
  end
198
204
 
199
- if eager_loading && !using_limitable_reflections?(join_dependency.reflections)
205
+ if eager_loading && !(
206
+ using_limitable_reflections?(join_dependency.reflections) &&
207
+ using_limitable_reflections?(
208
+ construct_join_dependency(
209
+ select_association_list(joins_values).concat(
210
+ select_association_list(left_outer_joins_values)
211
+ ), nil
212
+ ).reflections
213
+ )
214
+ )
200
215
  if has_limit_or_offset?
201
216
  limited_ids = limited_ids_for(relation)
202
217
  limited_ids.empty? ? relation.none! : relation.where!(primary_key => limited_ids)
@@ -105,6 +105,8 @@ module ActiveRecord
105
105
  @_trigger_update_callback = affected_rows == 1
106
106
  end
107
107
 
108
+ @previously_new_record = false
109
+
108
110
  yield(self) if block_given?
109
111
 
110
112
  affected_rows
@@ -2,7 +2,7 @@ module ActiveRecord
2
2
  module Calculations
3
3
 
4
4
  def pluck(*column_names)
5
- if loaded? && (column_names.map(&:to_s) - @klass.attribute_names - @klass.attribute_aliases.keys).empty?
5
+ if loaded? && all_attributes?(column_names)
6
6
  return records.pluck(*column_names)
7
7
  end
8
8
 
@@ -14,10 +14,18 @@ module ActiveRecord
14
14
  return records.pluck(*column_names.map{|n| n.sub(/^#{klass.table_name}\./, "")})
15
15
  else
16
16
  klass.disallow_raw_sql!(column_names)
17
+ columns = arel_columns(column_names)
17
18
  relation = spawn
18
- relation.select_values = column_names
19
- result = skip_query_cache_if_necessary { klass.connection.select_all(relation.arel, nil) }
20
- result.cast_values(klass.attribute_types)
19
+ relation.select_values = columns
20
+
21
+ result = skip_query_cache_if_necessary do
22
+ if where_clause.contradiction?
23
+ ActiveRecord::Result.new([], [])
24
+ else
25
+ klass.connection.select_all(relation.arel, nil)
26
+ end
27
+ end
28
+ type_cast_pluck_values(result, columns)
21
29
  end
22
30
  end
23
31
 
@@ -18,8 +18,13 @@ module ActiveRecord
18
18
  @values
19
19
  else
20
20
  val = @values.dup
21
- casted_binds = binds.map(&:value_for_database)
22
- @indexes.each { |i| val[i] = connection.quote(casted_binds.shift) }
21
+ @indexes.each do |i|
22
+ value = binds.shift
23
+ if ActiveModel::Attribute === value
24
+ value = value.value_for_database
25
+ end
26
+ val[i] = connection.quote(value)
27
+ end
23
28
  val.join
24
29
  end
25
30
  end
@@ -20,7 +20,7 @@ module ActiveRecord
20
20
  # end
21
21
  # end
22
22
  #
23
- def save!(*) #:nodoc:
23
+ def save!(**) #:nodoc:
24
24
  if instance_variable_defined?(:@no_save_transaction) && @no_save_transaction
25
25
  super
26
26
  else
@@ -35,29 +35,22 @@ module ActiveRecord
35
35
 
36
36
  def with_transaction_returning_status
37
37
  status = nil
38
+ connection = self.class.connection
38
39
 
39
- if self.class.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter) && instance_variable_defined?(:@updating) && @updating
40
+ if connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter) && instance_variable_defined?(:@updating) && @updating
40
41
  status = yield
41
- status
42
42
  else
43
- self.class.transaction do
44
- if has_transactional_callbacks?
45
- add_to_transaction
46
- else
47
- sync_with_transaction_state if @transaction_state&.finalized?
48
- @transaction_state = self.class.connection.transaction_state
49
- end
43
+ ensure_finalize = !connection.transaction_open?
44
+ connection.transaction do
45
+ add_to_transaction(ensure_finalize || has_transactional_callbacks?)
50
46
  remember_transaction_record_state
51
47
 
52
48
  status = yield
53
49
  raise ActiveRecord::Rollback unless status
54
50
  end
55
- status
56
- end
57
- ensure
58
- if @transaction_state && @transaction_state.committed?
59
- clear_transaction_record_state
60
51
  end
52
+
53
+ status
61
54
  end
62
55
 
63
56
 
@@ -1,31 +1,31 @@
1
- module Arel
2
- module Attributes
3
- class EmptyRelation < Attribute
4
-
5
- attr_accessor :collection, :for_write
6
-
7
- def initialize(relation, name, collection = false, for_write=false)
8
- self[:relation] = relation
9
- self[:name] = name
10
- @collection = collection
11
- @for_write = for_write
12
- end
13
-
14
- def able_to_type_cast?
15
- false
16
- end
17
-
18
- def table_name
19
- nil
20
- end
21
-
22
- def eql? other
23
- self.class == other.class &&
24
- self.relation == other.relation &&
25
- self.name == other.name &&
26
- self.collection == other.collection
27
- end
28
-
29
- end
30
- end
31
- end
1
+ # module Arel
2
+ # module Attributes
3
+ # class EmptyRelation < Attribute
4
+ #
5
+ # attr_accessor :collection, :for_write
6
+ #
7
+ # def initialize(relation, name, collection = false, for_write=false)
8
+ # self[:relation] = relation
9
+ # self[:name] = name
10
+ # @collection = collection
11
+ # @for_write = for_write
12
+ # end
13
+ #
14
+ # def able_to_type_cast?
15
+ # false
16
+ # end
17
+ #
18
+ # def table_name
19
+ # nil
20
+ # end
21
+ #
22
+ # def eql? other
23
+ # self.class == other.class &&
24
+ # self.relation == other.relation &&
25
+ # self.name == other.name &&
26
+ # self.collection == other.collection
27
+ # end
28
+ #
29
+ # end
30
+ # end
31
+ # end
@@ -4,7 +4,7 @@ module Arel
4
4
 
5
5
  attr_accessor :eager_load
6
6
 
7
- def initialize cores = [SelectCore.new]
7
+ def initialize(cores = [SelectCore.new])
8
8
  super()
9
9
  @cores = cores
10
10
  @orders = []
@@ -2,8 +2,7 @@ module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  # Sunstone-specific extensions to column definitions in a table.
4
4
  class SunstoneColumn < Column #:nodoc:
5
- delegate :array, to: :sql_type_metadata
6
- alias :array? :array
5
+ attr_reader :array
7
6
 
8
7
  def initialize(name, sql_type_metadata, options={})
9
8
  @name = name.freeze
@@ -14,6 +13,7 @@ module ActiveRecord
14
13
  @collation = nil
15
14
  @table_name = nil
16
15
  @primary_key = (options['primary_key'] == true)
16
+ @array = options['array']
17
17
  end
18
18
 
19
19
  def primary_key?
@@ -50,7 +50,9 @@ module ActiveRecord
50
50
  # - format_type includes the column size constraint, e.g. varchar(50)
51
51
  # - ::regclass is a function that gives the id for a table name
52
52
  def column_definitions(table_name) # :nodoc:
53
- definition(table_name)['columns']
53
+ # First check for attributes and then for the deprecated columns field
54
+ # TODO: Remove after 0.3
55
+ definition(table_name)['attributes'] || definition(table_name)['columns']
54
56
  end
55
57
 
56
58
  # Returns the limit definition of the table (the maximum limit that can
@@ -17,7 +17,7 @@ require 'active_record/connection_adapters/sunstone/type/json'
17
17
  module ActiveRecord
18
18
  module ConnectionHandling # :nodoc:
19
19
 
20
- VALID_SUNSTONE_CONN_PARAMS = [:url, :host, :port, :api_key, :use_ssl, :user_agent, :ca_cert]
20
+ VALID_SUNSTONE_CONN_PARAMS = [:endpoint, :host, :port, :api_key, :use_ssl, :user_agent, :ca_cert]
21
21
 
22
22
  # Establishes a connection to the database that's used by all Active Record
23
23
  # objects
@@ -25,8 +25,8 @@ module ActiveRecord
25
25
  conn_params = config.symbolize_keys
26
26
  conn_params.delete_if { |_, v| v.nil? }
27
27
 
28
- if conn_params[:url]
29
- uri = URI.parse(conn_params.delete(:url))
28
+ if conn_params[:endpoint]
29
+ uri = URI.parse(conn_params.delete(:endpoint))
30
30
  conn_params[:api_key] ||= (uri.user ? CGI.unescape(uri.user) : nil)
31
31
  conn_params[:host] ||= uri.host
32
32
  conn_params[:port] ||= uri.port
@@ -212,8 +212,8 @@ module ActiveRecord
212
212
  end
213
213
  end
214
214
 
215
- def create_table_definition(name, temporary, options, as = nil) # :nodoc:
216
- SunstoneAPI::TableDefinition.new native_database_types, name, temporary, options, as
215
+ def create_table_definition(name, **options)
216
+ SunstoneAPI::TableDefinition.new(self, name, **options)
217
217
  end
218
218
 
219
219
  ActiveRecord::Type.add_modifier({ array: true }, Sunstone::Type::Array, adapter: :sunstone)
@@ -1,10 +1,4 @@
1
1
  require 'arel/visitors/visitor'
2
- class Arel::Visitors::Dot
3
- def visit_Arel_Nodes_Casted o
4
- # collector << quoted(o.val, o.attribute).to_s
5
- visit_String o.val
6
- end
7
- end
8
2
 
9
3
  module Arel
10
4
  module Visitors
@@ -233,7 +227,7 @@ module Arel
233
227
  #
234
228
  def visit_Arel_Nodes_Casted o, collector
235
229
  # collector << quoted(o.val, o.attribute).to_s
236
- o.val
230
+ o.value
237
231
  end
238
232
 
239
233
  def visit_Arel_Nodes_Quoted o, collector
@@ -953,9 +947,9 @@ module Arel
953
947
  end
954
948
  end
955
949
 
956
- def visit_Arel_Attributes_EmptyRelation o, collector, top=true
957
- o.for_write ? "#{o.name}_attributes" : o.name
958
- end
950
+ # def visit_Arel_Attributes_EmptyRelation o, collector, top=true
951
+ # o.for_write ? "#{o.name}_attributes" : o.name
952
+ # end
959
953
 
960
954
  def visit_Arel_Attributes_Attribute o, collector
961
955
  join_name = o.relation.table_alias || o.relation.name
@@ -10,7 +10,7 @@ module Sunstone
10
10
  #
11
11
  # Options:
12
12
  #
13
- # * <tt>:url</tt> - An optional url used to set the protocol, host, port,
13
+ # * <tt>:endpoint</tt> - An optional endpoint used to set the protocol, host, port,
14
14
  # and api_key
15
15
  # * <tt>:host</tt> - The default is to connect to 127.0.0.1.
16
16
  # * <tt>:port</tt> - Defaults to 80.
@@ -19,8 +19,8 @@ module Sunstone
19
19
  # * <tt>:user_agent</tt> - An optional string. Will be joined with other
20
20
  # User-Agent info.
21
21
  def initialize(config)
22
- if config[:url]
23
- uri = URI.parse(config.delete(:url))
22
+ if config[:endpoint]
23
+ uri = URI.parse(config.delete(:endpoint))
24
24
  config[:api_key] ||= (uri.user ? CGI.unescape(uri.user) : nil)
25
25
  config[:host] ||= uri.host
26
26
  config[:port] ||= uri.port
@@ -348,7 +348,7 @@ module Sunstone
348
348
  headers = Thread.current[:sunstone_headers]&.clone || {}
349
349
  headers['Accept'] = 'application/json'
350
350
  headers['User-Agent'] = user_agent
351
- headers['Api-Version'] = '0.1.0'
351
+ headers['Api-Version'] = '0.2.0'
352
352
  headers['Connection'] = 'keep-alive'
353
353
 
354
354
  request_api_key = Thread.current[:sunstone_api_key] || api_key
@@ -1,3 +1,3 @@
1
1
  module Sunstone
2
- VERSION = '6.0.0.8'
2
+ VERSION = '6.1.0.rc1'
3
3
  end
@@ -35,6 +35,6 @@ Gem::Specification.new do |s|
35
35
  # Runtime
36
36
  s.add_runtime_dependency 'msgpack'
37
37
  s.add_runtime_dependency 'cookie_store'
38
- s.add_runtime_dependency 'activerecord', '>= 6.0.0'
38
+ s.add_runtime_dependency 'activerecord', '>= 6.1.0'
39
39
  s.add_runtime_dependency 'arel-extensions', '>= 6.0.0.5'
40
40
  end
@@ -14,6 +14,7 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
14
14
 
15
15
  create_table "sailors" do |t|
16
16
  t.string "name", limit: 255
17
+ t.text "assignment"
17
18
  end
18
19
 
19
20
  create_table "sailors_ships", id: false do |t|
@@ -74,7 +75,7 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
74
75
  assert_requested req_stub
75
76
  end
76
77
 
77
- test '#save w/o changes' do
78
+ test '#save w/o changes does not trigger a request' do
78
79
  webmock(:get, '/fleets', where: {id: 1}, limit: 1).to_return(
79
80
  body: [{id: 1, name: 'Armada Duo'}].to_json
80
81
  )
@@ -85,6 +86,18 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
85
86
  assert fleet.save
86
87
  assert_equal 1, fleet.id
87
88
  assert_equal 'Armada Duo', fleet.name
89
+
90
+
91
+ webmock(:get, '/sailors', where: {id: 1}, limit: 1).to_return(
92
+ body: [{id: 1, name: 'Nandor', assignment: 'stay alert'}].to_json
93
+ )
94
+
95
+ fleet = Sailor.find(1)
96
+ fleet.save
97
+
98
+ assert fleet.save
99
+ assert_equal 1, fleet.id
100
+ assert_equal 'stay alert', fleet.assignment
88
101
  end
89
102
 
90
103
  test '#save attempts another request while in transaction' do
@@ -107,7 +107,7 @@ class ActiveRecord::QueryTest < ActiveSupport::TestCase
107
107
  end
108
108
 
109
109
  test '#to_sql binds correctly when joining' do
110
- assert_equal 'SELECT ships.* FROM ships INNER JOIN ownerships ON ownerships.asset_id = ships.id AND ownerships.asset_type = \'ActiveRecord::QueryTest::Ship\' WHERE ownerships.id = 1', Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sql
110
+ assert_equal 'SELECT ships.* FROM ships INNER JOIN ownerships ON ownerships.asset_type = \'ActiveRecord::QueryTest::Ship\' AND ownerships.asset_id = ships.id WHERE ownerships.id = 1', Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sql
111
111
  end
112
112
 
113
113
  test '#to_sar' do
@@ -34,6 +34,10 @@ class ActiveSupport::TestCase
34
34
  def string(name, options={})
35
35
  @columns[name] = Column.new(name, :string, options)
36
36
  end
37
+
38
+ def text(name, options={})
39
+ @columns[name] = Column.new(name, :text, options)
40
+ end
37
41
 
38
42
  def datetime(name, options={})
39
43
  @columns[name] = Column.new(name, :datetime, options)
@@ -82,7 +86,7 @@ class ActiveSupport::TestCase
82
86
 
83
87
  set_callback(:setup, :before) do
84
88
  if !instance_variable_defined?(:@suite_setup_run) && self.class.class_variable_defined?(:@@schema)
85
- ActiveRecord::Base.establish_connection(adapter: 'sunstone', url: 'http://example.com')
89
+ ActiveRecord::Base.establish_connection(adapter: 'sunstone', endpoint: 'http://example.com')
86
90
 
87
91
  req_stub = stub_request(:get, /^http:\/\/example.com/).with do |req|
88
92
  case req.uri.path
@@ -2,40 +2,40 @@ require 'test_helper'
2
2
 
3
3
  class Sunstone::Connection::ConfigurationTest < ActiveSupport::TestCase
4
4
 
5
- test "setting the url sets the api_key" do
6
- connection = Sunstone::Connection.new(url: 'http://my_api_key@localhost')
5
+ test "setting the endpoint sets the api_key" do
6
+ connection = Sunstone::Connection.new(endpoint: 'http://my_api_key@localhost')
7
7
  assert_equal('my_api_key', connection.api_key)
8
8
  end
9
9
 
10
- test "setting the url sets the host" do
11
- connection = Sunstone::Connection.new(url: 'https://example.com')
10
+ test "setting the endpoint sets the host" do
11
+ connection = Sunstone::Connection.new(endpoint: 'https://example.com')
12
12
  assert_equal('example.com', connection.host)
13
13
  end
14
14
 
15
- test "setting the url sets the port" do
16
- connection = Sunstone::Connection.new(url: 'http://localhost')
15
+ test "setting the endpoint sets the port" do
16
+ connection = Sunstone::Connection.new(endpoint: 'http://localhost')
17
17
  assert_equal(80, connection.port)
18
18
 
19
- connection = Sunstone::Connection.new(url: 'https://localhost')
19
+ connection = Sunstone::Connection.new(endpoint: 'https://localhost')
20
20
  assert_equal(443, connection.port)
21
21
 
22
- connection = Sunstone::Connection.new(url: 'https://localhost:4321')
22
+ connection = Sunstone::Connection.new(endpoint: 'https://localhost:4321')
23
23
  assert_equal(4321, connection.port)
24
24
  end
25
25
 
26
- test "setting the url sets the use_ssl option" do
27
- connection = Sunstone::Connection.new(url: 'http://localhost')
26
+ test "setting the endpoint sets the use_ssl option" do
27
+ connection = Sunstone::Connection.new(endpoint: 'http://localhost')
28
28
  assert_equal(false, connection.use_ssl)
29
29
 
30
- connection = Sunstone::Connection.new(url: 'https://localhost')
30
+ connection = Sunstone::Connection.new(endpoint: 'https://localhost')
31
31
  assert_equal(true, connection.use_ssl)
32
32
  end
33
33
 
34
34
  test "setting the user_agent appends it to the User-Agent" do
35
- connection = Sunstone::Connection.new(url: 'http://localhost')
35
+ connection = Sunstone::Connection.new(endpoint: 'http://localhost')
36
36
  assert_equal("Sunstone/#{Sunstone::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_PLATFORM}", connection.user_agent)
37
37
 
38
- connection = Sunstone::Connection.new(url: 'http://localhost', user_agent: "MyGem/3.14")
38
+ connection = Sunstone::Connection.new(endpoint: 'http://localhost', user_agent: "MyGem/3.14")
39
39
  assert_equal("MyGem/3.14 Sunstone/#{Sunstone::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_PLATFORM}", connection.user_agent)
40
40
  end
41
41
 
@@ -4,7 +4,7 @@ class Sunstone::Connection::CookieStoreTest < ActiveSupport::TestCase
4
4
 
5
5
  test '#send_request(#<Net::HTTPRequest) adds cookies to the cookie store if present' do
6
6
  store = CookieStore::HashStore.new
7
- connection = Sunstone::Connection.new(url: "http://testhost.com")
7
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
8
8
  stub_request(:get, "http://testhost.com/test").to_return(:body => 'get', :headers => {'Set-Cookie' => 'foo=bar; Max-Age=3600'})
9
9
 
10
10
  Sunstone::Connection.with_cookie_store(store) { connection.get('/test') }
@@ -17,7 +17,7 @@ class Sunstone::Connection::CookieStoreTest < ActiveSupport::TestCase
17
17
 
18
18
  test '#send_request(#<Net::HTTPRequest) sends cookie header if cookie store is present' do
19
19
  store = CookieStore::HashStore.new
20
- connection = Sunstone::Connection.new(url: "http://testhost.com")
20
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
21
21
  stub_request(:get, "http://testhost.com/test").to_return(
22
22
  headers: {
23
23
  'Set-Cookie' => 'foo=bar; Path="/" Max-Age=3600'
@@ -5,28 +5,28 @@ class Sunstone::Connection::RequestHelpersTest < ActiveSupport::TestCase
5
5
  # Sunstone.get ==============================================================
6
6
 
7
7
  test '#get(path)' do
8
- connection = Sunstone::Connection.new(url: "http://testhost.com")
8
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
9
9
  stub_request(:get, "http://testhost.com/test").to_return(:body => "get")
10
10
 
11
11
  assert_equal('get', connection.get('/test').body)
12
12
  end
13
13
 
14
14
  test '#get(path, params) with params as string' do
15
- connection = Sunstone::Connection.new(url: "http://testhost.com")
15
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
16
16
  stub_request(:get, "http://testhost.com/test").with(:query => {'key' => 'value'}).to_return(:body => "get")
17
17
 
18
18
  assert_equal 'get', connection.get('/test', 'key=value').body
19
19
  end
20
20
 
21
21
  test '#get(path, params) with params as hash' do
22
- connection = Sunstone::Connection.new(url: "http://testhost.com")
22
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
23
23
  stub_request(:get, "http://testhost.com/test").with(:query => {'key' => 'value'}).to_return(:body => "get")
24
24
 
25
25
  assert_equal 'get', connection.get('/test', {:key => 'value'}).body
26
26
  end
27
27
 
28
28
  test '#get(path, &block)' do
29
- connection = Sunstone::Connection.new(url: "http://testhost.com")
29
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
30
30
  stub_request(:get, "http://testhost.com/test").to_return(:body => 'get')
31
31
 
32
32
  connection.get('/test') do |response|
@@ -37,21 +37,21 @@ class Sunstone::Connection::RequestHelpersTest < ActiveSupport::TestCase
37
37
  # Sunstone.post =============================================================
38
38
 
39
39
  test '#post(path)' do
40
- connection = Sunstone::Connection.new(url: "http://testhost.com")
40
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
41
41
  stub_request(:post, "http://testhost.com/test").to_return(:body => "post")
42
42
 
43
43
  assert_equal('post', connection.post('/test').body)
44
44
  end
45
45
 
46
46
  test '#post(path, body)' do
47
- connection = Sunstone::Connection.new(url: "http://testhost.com")
47
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
48
48
  stub_request(:post, "http://testhost.com/test").with(:body => 'body').to_return(:body => "post")
49
49
 
50
50
  assert_equal('post', connection.post('/test', 'body').body)
51
51
  end
52
52
 
53
53
  test '#post(path, &block)' do
54
- connection = Sunstone::Connection.new(url: "http://testhost.com")
54
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
55
55
  stub_request(:post, "http://testhost.com/test").to_return(:body => 'post')
56
56
 
57
57
  connection.post('/test') do |response|
@@ -62,21 +62,21 @@ class Sunstone::Connection::RequestHelpersTest < ActiveSupport::TestCase
62
62
  # Sunstone.put ==============================================================
63
63
 
64
64
  test '#put(path)' do
65
- connection = Sunstone::Connection.new(url: "http://testhost.com")
65
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
66
66
  stub_request(:put, "http://testhost.com/test").to_return(:body => "put")
67
67
 
68
68
  assert_equal('put', connection.put('/test').body)
69
69
  end
70
70
 
71
71
  test '#put(path, body)' do
72
- connection = Sunstone::Connection.new(url: "http://testhost.com")
72
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
73
73
  stub_request(:put, "http://testhost.com/test").with(:body => 'body').to_return(:body => "put")
74
74
 
75
75
  assert_equal('put', connection.put('/test', 'body').body)
76
76
  end
77
77
 
78
78
  test '#put(path, &block)' do
79
- connection = Sunstone::Connection.new(url: "http://testhost.com")
79
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
80
80
  stub_request(:put, "http://testhost.com/test").to_return(:body => 'put')
81
81
 
82
82
  connection.put('/test') do |response|
@@ -87,14 +87,14 @@ class Sunstone::Connection::RequestHelpersTest < ActiveSupport::TestCase
87
87
  # Sunstone.delete ===========================================================
88
88
 
89
89
  test '#delete' do
90
- connection = Sunstone::Connection.new(url: "http://testhost.com")
90
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
91
91
  stub_request(:delete, "http://testhost.com/test").to_return(:body => "delete")
92
92
 
93
93
  assert_equal('delete', connection.delete('/test').body)
94
94
  end
95
95
 
96
96
  test '#delete(path, &block)' do
97
- connection = Sunstone::Connection.new(url: "http://testhost.com")
97
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
98
98
  stub_request(:delete, "http://testhost.com/test").to_return(:body => 'delete')
99
99
 
100
100
  connection.delete('/test') do |response|
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
  class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
4
4
 
5
5
  test '#send_request(#<Net::HTTPRequest>) includes the api-key header when present' do
6
- connection = Sunstone::Connection.new(url: "http://my_api_key@example.com")
6
+ connection = Sunstone::Connection.new(endpoint: "http://my_api_key@example.com")
7
7
 
8
8
  test_stub = stub_request(:get, "http://example.com/verify").with { |req|
9
9
  req.headers['Api-Key'] == 'my_api_key'
@@ -13,7 +13,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
13
13
  end
14
14
 
15
15
  test '#send_request(#<Net::HTTPRequest>) includes the user_agent' do
16
- connection = Sunstone::Connection.new(url: "http://example.com")
16
+ connection = Sunstone::Connection.new(endpoint: "http://example.com")
17
17
 
18
18
  test_stub = stub_request(:get, "http://example.com/verify").with { |req|
19
19
  req.headers['User-Agent'] =~ /Sunstone\/\S+ Ruby\/\S+ \S+/
@@ -22,7 +22,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
22
22
  assert_requested(test_stub)
23
23
 
24
24
  # Custom Agent
25
- connection = Sunstone::Connection.new(url: "http://example.com", user_agent: "MyClient/2")
25
+ connection = Sunstone::Connection.new(endpoint: "http://example.com", user_agent: "MyClient/2")
26
26
 
27
27
  test_stub = stub_request(:get, "http://example.com/verify").with { |req|
28
28
  req.headers['User-Agent'] =~ /MyClient\/2 Sunstone\/\S+ Ruby\/\S+ \S+/
@@ -34,7 +34,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
34
34
  test '#send_request(#<Net::HTTPRequest>)' do
35
35
  stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
36
36
 
37
- connection = Sunstone::Connection.new(url: "http://testhost.com")
37
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
38
38
  assert_equal('get', connection.send_request(Net::HTTP::Get.new('/test')).body)
39
39
  end
40
40
 
@@ -45,7 +45,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
45
45
  body: "post"
46
46
  )
47
47
 
48
- connection = Sunstone::Connection.new(url: "http://testhost.com")
48
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
49
49
  assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), '{"key":"value"}').body)
50
50
  end
51
51
 
@@ -58,14 +58,14 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
58
58
  wr.write('{"key":"value"}')
59
59
  wr.close
60
60
 
61
- connection = Sunstone::Connection.new(url: "http://testhost.com")
61
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
62
62
  assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), rd).body)
63
63
  end
64
64
 
65
65
  test '#send_request(#<Net::HTTPRequest>, body) with Ruby Object body' do
66
66
  stub_request(:post, "http://testhost.com/test").with(body: '{"key":"value"}').to_return(body: "post")
67
67
 
68
- connection = Sunstone::Connection.new(url: "http://testhost.com")
68
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
69
69
  assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), {:key => 'value'}).body)
70
70
  end
71
71
 
@@ -80,7 +80,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
80
80
  stub_request(:get, "http://testhost.com/503").to_return(status: 503)
81
81
  stub_request(:get, "http://testhost.com/550").to_return(status: 550)
82
82
 
83
- connection = Sunstone::Connection.new(url: "http://testhost.com")
83
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
84
84
  assert_raises(Sunstone::Exception::BadRequest) { connection.send_request(Net::HTTP::Get.new('/400')) }
85
85
  assert_raises(Sunstone::Exception::Unauthorized) { connection.send_request(Net::HTTP::Get.new('/401')) }
86
86
  assert_raises(Sunstone::Exception::Forbidden) { connection.send_request(Net::HTTP::Get.new('/403')) }
@@ -95,7 +95,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
95
95
  test '#send_request(#<Net::HTTPRequest>, &block) returns value returned from &block' do
96
96
  stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
97
97
 
98
- connection = Sunstone::Connection.new(url: "http://testhost.com")
98
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
99
99
  value = connection.send_request(Net::HTTP::Get.new('/test')) do |response|
100
100
  3215
101
101
  end
@@ -104,7 +104,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
104
104
  end
105
105
 
106
106
  test '#send_request(#<Net::HTTPRequest>, &block)' do
107
- connection = Sunstone::Connection.new(url: "http://testhost.com")
107
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
108
108
  stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
109
109
 
110
110
  connection.send_request(Net::HTTP::Get.new('/test')) do |response|
@@ -122,7 +122,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
122
122
  end
123
123
 
124
124
  test '#send_request(#<Net::HTTPRequest>, &block) with block reading chunks' do
125
- connection = Sunstone::Connection.new(url: "http://testhost.com")
125
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
126
126
 
127
127
  rd, wr = IO.pipe
128
128
  rd = Net::BufferedIO.new(rd)
@@ -149,7 +149,7 @@ class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
149
149
 
150
150
  # TODO: support multple depreaction-notice headers
151
151
  test 'deprecation warning printed when deprecation header returned' do
152
- connection = Sunstone::Connection.new(url: "http://testhost.com")
152
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
153
153
 
154
154
  stub_request(:get, "http://testhost.com/test").to_return(
155
155
  body: 'get',
@@ -5,7 +5,7 @@ class Sunstone::ConnectionTest < ActiveSupport::TestCase
5
5
  # #ping =====================================================================
6
6
 
7
7
  test '#ping' do
8
- connection = Sunstone::Connection.new(url: "http://testhost.com")
8
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
9
9
  stub_request(:get, "http://testhost.com/ping").to_return(:body => 'pong')
10
10
 
11
11
  assert_equal( 'pong', connection.ping )
@@ -14,7 +14,7 @@ class Sunstone::ConnectionTest < ActiveSupport::TestCase
14
14
  # #server_config ===========================================================
15
15
 
16
16
  test '#config' do
17
- connection = Sunstone::Connection.new(url: "http://testhost.com")
17
+ connection = Sunstone::Connection.new(endpoint: "http://testhost.com")
18
18
  stub_request(:get, "http://testhost.com/config").to_return(:body => '{"server": "configs"}')
19
19
 
20
20
  assert_equal( {:server => "configs"}, connection.server_config )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunstone
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.8
4
+ version: 6.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-12 00:00:00.000000000 Z
11
+ date: 2020-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 6.0.0
229
+ version: 6.1.0
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
- version: 6.0.0
236
+ version: 6.1.0
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: arel-extensions
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -325,7 +325,7 @@ files:
325
325
  homepage: http://sunstonerb.com
326
326
  licenses: []
327
327
  metadata: {}
328
- post_install_message:
328
+ post_install_message:
329
329
  rdoc_options: []
330
330
  require_paths:
331
331
  - lib
@@ -336,12 +336,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
336
336
  version: '2.6'
337
337
  required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  requirements:
339
- - - ">="
339
+ - - ">"
340
340
  - !ruby/object:Gem::Version
341
- version: '0'
341
+ version: 1.3.1
342
342
  requirements: []
343
- rubygems_version: 3.0.3
344
- signing_key:
343
+ rubygems_version: 3.1.4
344
+ signing_key:
345
345
  specification_version: 4
346
346
  summary: A library for interacting with REST APIs
347
347
  test_files: