sunstone 6.1.3 → 7.1.0.1

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.
@@ -3,28 +3,24 @@ require 'arel/visitors/visitor'
3
3
  module Arel
4
4
  module Visitors
5
5
  class Sunstone < Arel::Visitors::Visitor
6
-
6
+
7
7
  def compile(node, collector = Arel::Collectors::Sunstone.new)
8
8
  accept(node, collector).value
9
9
  end
10
-
11
- def preparable
12
- false
13
- end
14
-
10
+
15
11
  private
16
-
12
+
17
13
  def visit_Arel_Nodes_SelectStatement o, collector
18
14
  collector.table = o.cores.first.source.left.name
19
15
 
20
16
  collector = o.cores.inject(collector) { |c,x|
21
17
  visit_Arel_Nodes_SelectCore(x, c)
22
18
  }
23
-
19
+
24
20
  if !o.orders.empty?
25
21
  collector.order = o.orders.map { |x| visit(x, collector) }
26
22
  end
27
-
23
+
28
24
  collector = maybe_visit o.limit, collector
29
25
  collector = maybe_visit o.offset, collector
30
26
  collector = maybe_visit o.eager_load, collector
@@ -65,41 +61,36 @@ module Arel
65
61
  collector.request_type = Net::HTTP::Post
66
62
  collector.table = o.relation.name
67
63
  collector.operation = :insert
68
-
64
+
69
65
  if o.values
70
66
  if o.values.is_a?(Arel::Nodes::SqlLiteral) && o.values == 'DEFAULT VALUES'
71
67
  collector.updates = {}
72
68
  else
73
- collector.updates = {}
74
-
75
- o.values.expr[0].each_with_index do |value, i|
76
- k = value.value.name
77
- if k.is_a?(Hash)
78
- add_to_bottom_of_hash_or_array(k, value)
79
- collector.updates.deep_merge!(k) { |key, v1, v2|
80
- if (v1.is_a?(Array) && v2.is_a?(Array))
81
- v2.each_with_index do |v, j|
82
- if v1[j].nil?
83
- v1[j] = v2[j]
84
- else
85
- v1[j].deep_merge!(v2[j]) unless v2[j].nil?
86
- end
87
- end
88
- v1
89
- else
90
- v2
91
- end
92
- }
93
- else
94
- collector.updates[k] = visit(value, collector)
95
- end
96
- end
69
+ values = visit(o.values, collector)
70
+ collector.updates = o.columns.map(&:name).zip(values).to_h
97
71
  end
98
72
  end
99
-
73
+
100
74
  collector
101
75
  end
102
-
76
+
77
+ def visit_Arel_Nodes_ValuesList o, collector
78
+ o.rows[0].map do |v|
79
+ visit_subrelation v, collector
80
+ end
81
+ end
82
+
83
+ def visit_subrelation v, collector
84
+ case v
85
+ when Array
86
+ v.map { |v2| visit_subrelation v2, collector }
87
+ when Hash
88
+ v.transform_values { |v2| visit_subrelation v2, collector }
89
+ else
90
+ visit(v, collector)
91
+ end
92
+ end
93
+
103
94
  def find_bottom(hash)
104
95
  if hash.is_a?(Hash)
105
96
  if hash.values.first.is_a?(Array) || hash.values.first.is_a?(Hash)
@@ -116,10 +107,10 @@ module Arel
116
107
  end
117
108
  end
118
109
  end
119
-
110
+
120
111
  def add_to_bottom_of_hash_or_array(hash, value)
121
112
  hash = find_bottom(hash)
122
-
113
+
123
114
  if hash.is_a?(Hash)
124
115
  nkey = hash.keys.first
125
116
  nvalue = hash.values.first
@@ -165,26 +156,26 @@ module Arel
165
156
  #
166
157
  def visit_Arel_Nodes_UpdateStatement o, collector
167
158
  collector.request_type = Net::HTTP::Patch
168
-
159
+
169
160
  collector.table = o.relation.name
170
161
  collector.operation = :update
171
-
162
+
172
163
  # collector.id = o.wheres.first.children.first.right
173
164
  if !o.wheres.empty?
174
165
  collector.where = o.wheres.map { |x| visit(x, collector) }.inject([]) { |c, w|
175
166
  w.is_a?(Array) ? c += w : c << w
176
167
  }
177
168
  end
178
-
169
+
179
170
  if collector.where.size != 1 && collector.where.first.size != 1 && !collector.where.first['id']
180
171
  raise 'Upsupported'
181
172
  end
182
-
173
+
183
174
  collector.where = collector.where.first
184
-
175
+
185
176
  if o.values
186
177
  collector.updates = {}
187
-
178
+
188
179
  o.values.map { |x| visit(x, collector) }.each do |value|
189
180
  value.each do |key, v|
190
181
  if key.is_a?(Hash)
@@ -209,7 +200,7 @@ module Arel
209
200
  end
210
201
  end
211
202
  end
212
-
203
+
213
204
  collector
214
205
  end
215
206
  #
@@ -444,7 +435,7 @@ module Arel
444
435
  def visit_Arel_Nodes_Descending o, collector
445
436
  { visit(o.expr, collector) => :desc }
446
437
  end
447
-
438
+
448
439
  def visit_Arel_Nodes_RandomOrdering o, collector
449
440
  :random
450
441
  end
@@ -486,7 +477,7 @@ module Arel
486
477
  #
487
478
  def visit_Arel_Nodes_Count o, collector
488
479
  collector.operation = :calculate
489
-
480
+
490
481
  collector.columns ||= []
491
482
  collector.columns << {:count => (o.expressions.first.is_a?(Arel::Attributes::Attribute) ? o.expressions.first.name : o.expressions.first) }
492
483
  # collector.columns = visit o.expressions.first, collector
@@ -494,7 +485,7 @@ module Arel
494
485
 
495
486
  def visit_Arel_Nodes_Sum o, collector
496
487
  collector.operation = :calculate
497
-
488
+
498
489
  collector.columns ||= []
499
490
  collector.columns << {:sum => (o.expressions.first.is_a?(Arel::Attributes::Attribute) ? o.expressions.first.name : o.expressions.first) }
500
491
  # collector.columns = visit o.expressions.first, collector
@@ -502,7 +493,7 @@ module Arel
502
493
 
503
494
  def visit_Arel_Nodes_Max o, collector
504
495
  collector.operation = :calculate
505
-
496
+
506
497
  collector.columns ||= []
507
498
  if o.expressions.first.is_a?(Arel::Attributes::Attribute)
508
499
  relation = o.expressions.first.relation
@@ -704,11 +695,11 @@ module Arel
704
695
  end
705
696
  end
706
697
  alias_method :visit_Arel_Nodes_HomogeneousIn, :visit_Arel_Nodes_In
707
-
698
+
708
699
  def visit_Arel_Nodes_NotIn o, collector
709
700
  key = visit(o.left, collector)
710
701
  value = {not_in: visit(o.right, collector)}
711
-
702
+
712
703
  if hash.is_a?(Hash)
713
704
  add_to_bottom_of_hash_or_array(key, value)
714
705
  key
@@ -716,10 +707,10 @@ module Arel
716
707
  {key => value}
717
708
  end
718
709
  end
719
-
710
+
720
711
  # You merge a into b if a keys do not colid with b keys
721
712
  def mergeable?(hash_a, hash_b)
722
-
713
+
723
714
  hash_a.each do |key, value_a|
724
715
  #TODO: one day maybe just use symbols for all keys?
725
716
  if hash_b.has_key?(key.to_sym) || hash_b.has_key?(key.to_s)
@@ -733,7 +724,7 @@ module Arel
733
724
  end
734
725
  true
735
726
  end
736
-
727
+
737
728
  def visit_Arel_Nodes_And o, collector
738
729
  ors = []
739
730
 
@@ -748,16 +739,16 @@ module Arel
748
739
  ors << value
749
740
  end
750
741
  end
751
-
742
+
752
743
  result = []
753
744
  ors.each_with_index do |c, i|
754
745
  result << c
755
746
  result << 'AND' if ors.size != i + 1
756
747
  end
757
-
748
+
758
749
  result.size == 1 ? result.first : result
759
750
  end
760
-
751
+
761
752
  def visit_Arel_Nodes_Or o, collector
762
753
  [visit(o.left, collector), 'OR', visit(o.right, collector)]
763
754
  end
@@ -765,8 +756,15 @@ module Arel
765
756
  def visit_Arel_Nodes_Assignment o, collector
766
757
  case o.left
767
758
  when Arel::Nodes::UnqualifiedColumn
768
- { visit(o.left.expr, collector) => visit(o.right, collector) }
769
- when Arel::Attributes::Attribute, Arel::Nodes::BindParam
759
+ case o.right
760
+ when Array
761
+ { visit(o.left.expr, collector) => o.right.map { |i| i.transform_values { |v| visit(v, collector) } } }
762
+ when Hash
763
+ { visit(o.left.expr, collector) => o.right.transform_values { |v| visit(v, collector) } }
764
+ else
765
+ { visit(o.left.expr, collector) => visit(o.right, collector) }
766
+ end
767
+ when Arel::Attributes::Attribute, Arel::Nodes::BindParam, ActiveModel::Attribute
770
768
  { visit(o.left, collector) => visit(o.right, collector) }
771
769
  else
772
770
  collector = visit o.left, collector
@@ -783,7 +781,7 @@ module Arel
783
781
  okey.merge!(value)
784
782
  hash
785
783
  end
786
-
784
+
787
785
  def add_to_bottom_of_hash(hash, value)
788
786
  okey = hash
789
787
  while okey.is_a?(Hash) && (okey.values.first.is_a?(Hash) || okey.values.first.is_a?(Array))
@@ -798,11 +796,11 @@ module Arel
798
796
  okey[nkey] = { nvalue => value }
799
797
  hash
800
798
  end
801
-
799
+
802
800
  def visit_Arel_Nodes_Equality o, collector
803
801
  key = visit(o.left, collector)
804
802
  value = (o.right.nil? ? nil : visit(o.right, collector))
805
-
803
+
806
804
  if key.is_a?(Hash)
807
805
  add_to_bottom_of_hash(key, {eq: value})
808
806
  elsif o.left.class.name == 'Arel::Attributes::Key'
@@ -811,7 +809,7 @@ module Arel
811
809
  { key => value }
812
810
  end
813
811
  end
814
-
812
+
815
813
  def visit_Arel_Nodes_TSMatch(o, collector)
816
814
  key = visit(o.left, collector)
817
815
  value = { ts_match: (o.right.nil? ? nil : visit(o.right, collector)) }
@@ -827,11 +825,11 @@ module Arel
827
825
  hash
828
826
  end
829
827
  end
830
-
828
+
831
829
  def visit_Arel_Nodes_TSVector(o, collector)
832
830
  visit(o.attribute, collector)
833
831
  end
834
-
832
+
835
833
  def visit_Arel_Nodes_TSQuery(o, collector)
836
834
  if o.language
837
835
  [visit(o.expression, collector), visit(o.language, collector)]
@@ -839,11 +837,11 @@ module Arel
839
837
  visit(o.expression, collector)
840
838
  end
841
839
  end
842
-
840
+
843
841
  def visit_Arel_Nodes_HasKey o, collector
844
842
  key = visit(o.left, collector)
845
843
  value = {has_key: (o.right.nil? ? nil : o.right.to_s)}
846
-
844
+
847
845
  if key.is_a?(Hash)
848
846
  okey = key
849
847
  while okey.values.first.is_a?(Hash)
@@ -860,7 +858,7 @@ module Arel
860
858
  def visit_Arel_Nodes_HasKeys o, collector
861
859
  key = visit(o.left, collector)
862
860
  value = { has_keys: visit(o.right, collector) }
863
-
861
+
864
862
  if key.is_a?(Hash)
865
863
  okey = key
866
864
  while okey.values.first.is_a?(Hash)
@@ -877,7 +875,7 @@ module Arel
877
875
  def visit_Arel_Nodes_HasAnyKey o, collector
878
876
  key = visit(o.left, collector)
879
877
  value = { has_any_key: visit(o.right, collector) }
880
-
878
+
881
879
  if key.is_a?(Hash)
882
880
  okey = key
883
881
  while okey.values.first.is_a?(Hash)
@@ -907,11 +905,11 @@ module Arel
907
905
  def visit_Arel_Nodes_UnqualifiedColumn o, collector
908
906
  o.name
909
907
  end
910
-
908
+
911
909
  def visit_Arel_Attributes_Cast(o, collector)
912
910
  visit(o.relation, collector) # No casting yet
913
911
  end
914
-
912
+
915
913
  def visit_Arel_Attributes_Key o, collector
916
914
  "#{visit(o.relation, collector)}.#{o.name}"
917
915
  end
@@ -951,7 +949,7 @@ module Arel
951
949
  # def visit_Arel_Attributes_EmptyRelation o, collector, top=true
952
950
  # o.for_write ? "#{o.name}_attributes" : o.name
953
951
  # end
954
-
952
+
955
953
  def visit_Arel_Attributes_Attribute o, collector
956
954
  join_name = o.relation.table_alias || o.relation.name
957
955
 
@@ -968,6 +966,15 @@ module Arel
968
966
  alias :visit_Arel_Attributes_Time :visit_Arel_Attributes_Attribute
969
967
  alias :visit_Arel_Attributes_Boolean :visit_Arel_Attributes_Attribute
970
968
 
969
+ def visit_ActiveModel_Attribute(o, collector)
970
+ if o.value.is_a?(ActiveRecord::StatementCache::Substitute)
971
+ a = collector.add_bind(o)
972
+ o
973
+ else
974
+ o.value_for_database
975
+ end
976
+ end
977
+
971
978
  def visit_Arel_Nodes_BindParam o, collector
972
979
  a = collector.add_bind(o.value)
973
980
  o.is_a?(Arel::Nodes::BindParam) ? o : a
@@ -1064,12 +1071,11 @@ module Arel
1064
1071
  collector
1065
1072
  end
1066
1073
  end
1067
-
1074
+
1068
1075
  def maybe_visit thing, collector
1069
1076
  return collector unless thing
1070
- collector << " "
1071
1077
  visit thing, collector
1072
1078
  end
1073
1079
  end
1074
1080
  end
1075
- end
1081
+ end
@@ -4,7 +4,7 @@
4
4
  module Sunstone
5
5
  class Connection
6
6
 
7
- attr_reader :api_key, :host, :port, :use_ssl
7
+ attr_reader :api_key, :host, :port, :use_ssl, :prefix
8
8
 
9
9
  # Initialize a connection a Sunstone API server.
10
10
  #
@@ -31,7 +31,7 @@ module Sunstone
31
31
  self.instance_variable_set(:"@#{key}", config[key])
32
32
  end
33
33
 
34
- @connection = Net::HTTP.new(host, port)
34
+ @connection = Net::HTTP.new(host, port || (use_ssl ? 443 : 80))
35
35
  @connection.max_retries = 0
36
36
  @connection.open_timeout = 5
37
37
  @connection.read_timeout = 30
@@ -132,25 +132,52 @@ module Sunstone
132
132
  if Thread.current[:sunstone_transaction_count] == 1 && !Thread.current[:sunstone_request_sent]
133
133
  Thread.current[:sunstone_request_sent] = request
134
134
  elsif Thread.current[:sunstone_request_sent]
135
- log_mess = request.path.split('?', 2)
136
- log_mess += Thread.current[:sunstone_request_sent].path.split('?', 2)
137
- raise ActiveRecord::StatementInvalid, <<~MSG
135
+ message = <<~MSG
138
136
  Cannot send multiple request in a transaction.
139
-
137
+
140
138
  Trying to send:
141
- #{request.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[1])) : '' }
142
-
143
- Already sent:
144
- #{Thread.current[:sunstone_request_sent].method} #{log_mess[2]} #{(log_mess[3] && !log_mess[3].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[3])) : '' }
145
139
  MSG
140
+
141
+ path_and_query = request.path.split('?', 2)
142
+ message << " #{request.method} #{path_and_query[0]}"
143
+ if path_and_query[1]
144
+ if request['Query-Encoding'] == 'application/msgpack'
145
+ message << " " << MessagePack.unpack(CGI.unescape(path_and_query[1])).inspect
146
+ else
147
+ message << " " << CGI.unescape(path_and_query[1])
148
+ end
149
+ end
150
+
151
+ message << "\n\nAlready sent:\n"
152
+ path_and_query = Thread.current[:sunstone_request_sent].path.split('?', 2)
153
+ message << " #{Thread.current[:sunstone_request_sent].method} #{path_and_query[0]}"
154
+ if path_and_query[1]
155
+ if request['Query-Encoding'] == 'application/msgpack'
156
+ message << " " << MessagePack.unpack(CGI.unescape(path_and_query[1]))
157
+ else
158
+ message << " " << CGI.unescape(path_and_query[1])
159
+ end
160
+ end
161
+
162
+ raise ActiveRecord::StatementInvalid, message
146
163
  else
147
164
  log_mess = request.path.split('?', 2)
148
- raise ActiveRecord::StatementInvalid, <<~MSG
149
- Cannot send multiple request in a transaction.
165
+ message = if request['Query-Encoding'] == 'application/msgpack'
166
+ <<~MSG
167
+ Cannot send multiple request in a transaction.
150
168
 
151
- Trying to send:
152
- #{request.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[1])) : '' }
153
- MSG
169
+ Trying to send:
170
+ #{request.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[1])) : '' }
171
+ MSG
172
+ else
173
+ <<~MSG
174
+ Cannot send multiple request in a transaction.
175
+
176
+ Trying to send:
177
+ #{request.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? CGI.unescape(log_mess[1]) : '' }
178
+ MSG
179
+ end
180
+ raise ActiveRecord::StatementInvalid, message
154
181
  end
155
182
  end
156
183
 
@@ -1,3 +1,3 @@
1
1
  module Sunstone
2
- VERSION = '6.1.3'
2
+ VERSION = '7.1.0.1'
3
3
  end
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.1.3
4
+ version: 7.1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-15 00:00:00.000000000 Z
11
+ date: 2023-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 6.1.0
187
+ version: 7.1.0
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 6.1.0
194
+ version: 7.1.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: msgpack
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -226,42 +226,42 @@ dependencies:
226
226
  requirements:
227
227
  - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 6.1.3
229
+ version: 7.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.1.3
236
+ version: 7.1.0
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: arel-extensions
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - ">="
242
242
  - !ruby/object:Gem::Version
243
- version: 6.1.0
243
+ version: 7.0.1
244
244
  type: :runtime
245
245
  prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
247
247
  requirements:
248
248
  - - ">="
249
249
  - !ruby/object:Gem::Version
250
- version: 6.1.0
250
+ version: 7.0.1
251
251
  - !ruby/object:Gem::Dependency
252
252
  name: activerecord-filter
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
255
  - - ">="
256
256
  - !ruby/object:Gem::Version
257
- version: 6.1.0
257
+ version: 7.0.0
258
258
  type: :runtime
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
- version: 6.1.0
264
+ version: 7.0.0
265
265
  description: A library for interacting with REST APIs. Similar to ActiveResource
266
266
  email:
267
267
  - jonbracy@gmail.com
@@ -323,7 +323,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
323
323
  - !ruby/object:Gem::Version
324
324
  version: '0'
325
325
  requirements: []
326
- rubygems_version: 3.2.3
326
+ rubygems_version: 3.4.13
327
327
  signing_key:
328
328
  specification_version: 4
329
329
  summary: A library for interacting with REST APIs