sunstone 6.0.0.4 → 6.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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +141 -0
- data/README.md +39 -3
- data/ext/active_record/associations.rb +2 -2
- data/ext/active_record/attribute_methods.rb +2 -2
- data/ext/active_record/callbacks.rb +1 -1
- data/ext/active_record/finder_methods.rb +40 -35
- data/ext/active_record/persistence.rb +2 -0
- data/ext/active_record/relation/calculations.rb +2 -2
- data/ext/active_record/statement_cache.rb +9 -5
- data/ext/active_record/transactions.rb +8 -15
- data/ext/arel/attributes/empty_relation.rb +31 -31
- data/ext/arel/nodes/select_statement.rb +1 -1
- data/lib/active_record/connection_adapters/sunstone/column.rb +2 -2
- data/lib/active_record/connection_adapters/sunstone/database_statements.rb +5 -5
- data/lib/active_record/connection_adapters/sunstone/schema_statements.rb +18 -8
- data/lib/active_record/connection_adapters/sunstone/type/binary.rb +34 -0
- data/lib/active_record/connection_adapters/sunstone_adapter.rb +39 -26
- data/lib/arel/visitors/sunstone.rb +13 -37
- data/lib/sunstone.rb +16 -2
- data/lib/sunstone/connection.rb +1 -1
- data/lib/sunstone/version.rb +1 -1
- data/sunstone.gemspec +3 -2
- data/test/active_record/persistance_test.rb +31 -6
- data/test/active_record/query_test.rb +9 -1
- data/test/schema_mock.rb +30 -26
- data/test/sunstone/connection/column_definition_test.rb +30 -0
- data/test/test_helper.rb +1 -0
- metadata +28 -12
- data/.travis.yml +0 -49
- data/ext/arel/attributes/relation.rb +0 -31
data/lib/sunstone.rb
CHANGED
@@ -35,7 +35,21 @@ require File.expand_path(File.join(__FILE__, '../../ext/active_support/core_ext/
|
|
35
35
|
|
36
36
|
require File.expand_path(File.join(__FILE__, '../../ext/arel/select_manager'))
|
37
37
|
require File.expand_path(File.join(__FILE__, '../../ext/arel/nodes/eager_load'))
|
38
|
-
require File.expand_path(File.join(__FILE__, '../../ext/arel/attributes/relation'))
|
39
38
|
require File.expand_path(File.join(__FILE__, '../../ext/arel/attributes/empty_relation'))
|
40
39
|
require File.expand_path(File.join(__FILE__, '../../ext/arel/nodes/select_statement'))
|
41
|
-
require File.expand_path(File.join(__FILE__, '../../ext/active_record/finder_methods'))
|
40
|
+
require File.expand_path(File.join(__FILE__, '../../ext/active_record/finder_methods'))
|
41
|
+
|
42
|
+
if ActiveRecord::VERSION::MAJOR == 6 && ActiveRecord::VERSION::MINOR == 1
|
43
|
+
# Patch to allow Rails 6.1 pass url to adapter, all other versions work
|
44
|
+
require 'active_record/database_configurations'
|
45
|
+
class ActiveRecord::DatabaseConfigurations::UrlConfig
|
46
|
+
private
|
47
|
+
def build_url_hash
|
48
|
+
if url.nil? || %w(jdbc: http: https:).any? { |protocol| url.start_with?(protocol) }
|
49
|
+
{ url: url }
|
50
|
+
else
|
51
|
+
ConnectionUrlResolver.new(url).to_hash
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/sunstone/connection.rb
CHANGED
@@ -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.
|
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
|
data/lib/sunstone/version.rb
CHANGED
data/sunstone.gemspec
CHANGED
@@ -30,10 +30,11 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_development_dependency 'rgeo'
|
31
31
|
s.add_development_dependency 'simplecov'
|
32
32
|
s.add_development_dependency 'byebug'
|
33
|
-
s.add_development_dependency 'activesupport', '>= 6.
|
33
|
+
s.add_development_dependency 'activesupport', '>= 6.1.0'
|
34
34
|
|
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.
|
38
|
+
s.add_runtime_dependency 'activerecord', '>= 6.1.0'
|
39
|
+
s.add_runtime_dependency 'arel-extensions', '>= 6.1.0'
|
39
40
|
end
|
@@ -11,9 +11,10 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
11
11
|
create_table "fleets" do |t|
|
12
12
|
t.string "name", limit: 255
|
13
13
|
end
|
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|
|
@@ -22,7 +23,7 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
22
23
|
end
|
23
24
|
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
class Fleet < ActiveRecord::Base
|
27
28
|
has_many :ships
|
28
29
|
end
|
@@ -36,16 +37,19 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
36
37
|
class Sailor < ActiveRecord::Base
|
37
38
|
has_and_belongs_to_many :ships
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
class TestModelA < ActiveRecord::Base
|
41
42
|
end
|
42
|
-
|
43
|
+
|
43
44
|
class TestModelB < ActiveRecord::Base
|
44
45
|
before_save do
|
45
46
|
TestModelA.create
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
50
|
+
class TestModelC < ActiveRecord::Base
|
51
|
+
end
|
52
|
+
|
49
53
|
test '#create with errors' do
|
50
54
|
req_stub = webmock(:post, "/fleets").with(
|
51
55
|
body: { fleet: {} }.to_json
|
@@ -71,7 +75,7 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
71
75
|
assert_requested req_stub
|
72
76
|
end
|
73
77
|
|
74
|
-
test '#save w/o changes' do
|
78
|
+
test '#save w/o changes does not trigger a request' do
|
75
79
|
webmock(:get, '/fleets', where: {id: 1}, limit: 1).to_return(
|
76
80
|
body: [{id: 1, name: 'Armada Duo'}].to_json
|
77
81
|
)
|
@@ -82,9 +86,30 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
82
86
|
assert fleet.save
|
83
87
|
assert_equal 1, fleet.id
|
84
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
|
85
101
|
end
|
86
102
|
|
87
103
|
test '#save attempts another request while in transaction' do
|
104
|
+
webmock(:get, '/test_model_cs/schema').to_return(
|
105
|
+
body: {
|
106
|
+
attributes: {
|
107
|
+
id: {type: 'integer', primary_key: true, null: false, array: false},
|
108
|
+
name: {type: 'string', primary_key: false, null: true, array: false}
|
109
|
+
}
|
110
|
+
}.to_json,
|
111
|
+
headers: { 'StandardAPI-Version' => '6.0.0.29' }
|
112
|
+
)
|
88
113
|
webmock(:get, '/test_model_bs/schema').to_return(
|
89
114
|
body: {
|
90
115
|
columns: {
|
@@ -156,4 +181,4 @@ class ActiveRecord::PersistanceTest < ActiveSupport::TestCase
|
|
156
181
|
assert_requested req_stub
|
157
182
|
end
|
158
183
|
|
159
|
-
end
|
184
|
+
end
|
@@ -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.
|
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
|
@@ -119,5 +119,13 @@ class ActiveRecord::QueryTest < ActiveSupport::TestCase
|
|
119
119
|
query = MessagePack.unpack(CGI.unescape(uri.query))
|
120
120
|
assert_equal({"where"=>{"ownerships"=>{"id"=>{"eq"=>1}}}}, query)
|
121
121
|
end
|
122
|
+
|
123
|
+
test 'Arel::Nodes::HomogeneousIn' do
|
124
|
+
webmock(:get, "/ships", { where: {id: {in: [10,12]} }, limit: 100, offset: 0 }).to_return({
|
125
|
+
body: [].to_json
|
126
|
+
})
|
127
|
+
|
128
|
+
Ship.where(id: [10,12]).to_a
|
129
|
+
end
|
122
130
|
|
123
131
|
end
|
data/test/schema_mock.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
class ActiveSupport::TestCase
|
2
2
|
class Schema
|
3
|
-
|
3
|
+
|
4
4
|
class Table
|
5
|
-
|
5
|
+
|
6
6
|
class Column
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(name, type, options={})
|
9
9
|
@name = name
|
10
10
|
@type = type
|
11
11
|
@options = options
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def as_json
|
15
15
|
{type: @type, primary_key: false, null: true, array: false}.merge(@options)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
attr_accessor :name, :options, :columns
|
20
|
-
|
20
|
+
|
21
21
|
def initialize(name, options={}, &block)
|
22
22
|
@name = name
|
23
23
|
@options = options
|
@@ -30,36 +30,40 @@ class ActiveSupport::TestCase
|
|
30
30
|
|
31
31
|
block.call(self)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
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)
|
40
44
|
end
|
41
|
-
|
45
|
+
|
42
46
|
def integer(name, options={})
|
43
47
|
@columns[name] = Column.new(name, :integer, options)
|
44
48
|
end
|
45
|
-
|
49
|
+
|
46
50
|
def to_json
|
47
51
|
json = @options.slice(:limit)
|
48
|
-
json[:
|
52
|
+
json[:attributes] = {}
|
49
53
|
@columns.each do |name, column|
|
50
|
-
json[:
|
54
|
+
json[:attributes][name] = column.as_json
|
51
55
|
end
|
52
56
|
json.to_json
|
53
57
|
end
|
54
|
-
|
58
|
+
|
55
59
|
end
|
56
|
-
|
60
|
+
|
57
61
|
attr_accessor :tables
|
58
|
-
|
62
|
+
|
59
63
|
def initialize
|
60
64
|
@tables = {}
|
61
65
|
end
|
62
|
-
|
66
|
+
|
63
67
|
def self.define(&block)
|
64
68
|
i = new
|
65
69
|
i.define(&block)
|
@@ -69,21 +73,21 @@ class ActiveSupport::TestCase
|
|
69
73
|
def define(&block)
|
70
74
|
instance_eval(&block)
|
71
75
|
end
|
72
|
-
|
76
|
+
|
73
77
|
def create_table(name, options={}, &block)
|
74
78
|
@tables[name] = Table.new(name, options, &block)
|
75
79
|
end
|
76
|
-
|
80
|
+
|
77
81
|
end
|
78
|
-
|
82
|
+
|
79
83
|
def self.schema(&block)
|
80
84
|
self.class_variable_set(:@@schema, Schema.define(&block))
|
81
85
|
end
|
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
89
|
ActiveRecord::Base.establish_connection(adapter: 'sunstone', url: 'http://example.com')
|
86
|
-
|
90
|
+
|
87
91
|
req_stub = stub_request(:get, /^http:\/\/example.com/).with do |req|
|
88
92
|
case req.uri.path
|
89
93
|
when '/tables'
|
@@ -94,24 +98,24 @@ class ActiveSupport::TestCase
|
|
94
98
|
false
|
95
99
|
end
|
96
100
|
end
|
97
|
-
|
101
|
+
|
98
102
|
req_stub.to_return do |req|
|
99
103
|
case req.uri.path
|
100
104
|
when '/tables'
|
101
105
|
{
|
102
106
|
body: self.class.class_variable_get(:@@schema).tables.keys.to_json,
|
103
|
-
headers: { 'StandardAPI-Version' => '
|
107
|
+
headers: { 'StandardAPI-Version' => '6.0.0.29' }
|
104
108
|
}
|
105
109
|
when /^\/(\w+)\/schema$/i
|
106
110
|
{
|
107
111
|
body: self.class.class_variable_get(:@@schema).tables[$1].to_json,
|
108
|
-
headers: { 'StandardAPI-Version' => '
|
112
|
+
headers: { 'StandardAPI-Version' => '6.0.0.29' }
|
109
113
|
}
|
110
114
|
end
|
111
115
|
end
|
112
|
-
|
116
|
+
|
113
117
|
end
|
114
118
|
@suite_setup_run = true
|
115
119
|
end
|
116
|
-
|
117
|
-
end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Sunstone::Connection::ColumnDefinitionTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
schema do
|
6
|
+
create_table "ships", limit: 100 do |t|
|
7
|
+
t.string "name", limit: 255
|
8
|
+
t.integer "guns", limit: 8
|
9
|
+
t.integer "sailor_count"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Ship < ActiveRecord::Base
|
14
|
+
end
|
15
|
+
|
16
|
+
test "default limit on column" do
|
17
|
+
assert_nil Ship.columns_hash['sailor_count'].limit
|
18
|
+
end
|
19
|
+
|
20
|
+
test "custom limit on column" do
|
21
|
+
assert_equal 8, Ship.columns_hash['guns'].limit
|
22
|
+
end
|
23
|
+
|
24
|
+
test "custom limit on string column" do
|
25
|
+
assert_equal 255, Ship.columns_hash['name'].limit
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
data/test/test_helper.rb
CHANGED
@@ -69,6 +69,7 @@ class ActiveSupport::TestCase
|
|
69
69
|
|
70
70
|
stub_request(method, /^#{ActiveRecord::Base.connection.instance_variable_get(:@connection).url}/).with do |req|
|
71
71
|
if query
|
72
|
+
puts unpack(req&.uri&.query&.sub(/=true$/, '')) if req&.uri&.query
|
72
73
|
req&.uri&.path == path && req.uri.query && unpack(req.uri.query.sub(/=true$/, '')) == query
|
73
74
|
else
|
74
75
|
req&.uri&.path == path && req.uri.query.nil?
|
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.
|
4
|
+
version: 6.1.0.2
|
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:
|
11
|
+
date: 2021-03-23 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.
|
187
|
+
version: 6.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.
|
194
|
+
version: 6.1.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: msgpack
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,14 +226,28 @@ dependencies:
|
|
226
226
|
requirements:
|
227
227
|
- - ">="
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version: 6.
|
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.
|
236
|
+
version: 6.1.0
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: arel-extensions
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: 6.1.0
|
244
|
+
type: :runtime
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 6.1.0
|
237
251
|
description: A library for interacting with REST APIs. Similar to ActiveResource
|
238
252
|
email:
|
239
253
|
- jonbracy@gmail.com
|
@@ -241,9 +255,9 @@ executables: []
|
|
241
255
|
extensions: []
|
242
256
|
extra_rdoc_files: []
|
243
257
|
files:
|
258
|
+
- ".github/workflows/main.yml"
|
244
259
|
- ".gitignore"
|
245
260
|
- ".tm_properties"
|
246
|
-
- ".travis.yml"
|
247
261
|
- Gemfile
|
248
262
|
- LICENSE
|
249
263
|
- README.md
|
@@ -262,7 +276,6 @@ files:
|
|
262
276
|
- ext/active_record/transactions.rb
|
263
277
|
- ext/active_support/core_ext/object/to_query.rb
|
264
278
|
- ext/arel/attributes/empty_relation.rb
|
265
|
-
- ext/arel/attributes/relation.rb
|
266
279
|
- ext/arel/nodes/eager_load.rb
|
267
280
|
- ext/arel/nodes/select_statement.rb
|
268
281
|
- ext/arel/select_manager.rb
|
@@ -271,6 +284,7 @@ files:
|
|
271
284
|
- lib/active_record/connection_adapters/sunstone/schema_dumper.rb
|
272
285
|
- lib/active_record/connection_adapters/sunstone/schema_statements.rb
|
273
286
|
- lib/active_record/connection_adapters/sunstone/type/array.rb
|
287
|
+
- lib/active_record/connection_adapters/sunstone/type/binary.rb
|
274
288
|
- lib/active_record/connection_adapters/sunstone/type/date_time.rb
|
275
289
|
- lib/active_record/connection_adapters/sunstone/type/ewkb.rb
|
276
290
|
- lib/active_record/connection_adapters/sunstone/type/json.rb
|
@@ -301,6 +315,7 @@ files:
|
|
301
315
|
- test/active_record/query_test.rb
|
302
316
|
- test/active_record/rpc_test.rb
|
303
317
|
- test/schema_mock.rb
|
318
|
+
- test/sunstone/connection/column_definition_test.rb
|
304
319
|
- test/sunstone/connection/configuration_test.rb
|
305
320
|
- test/sunstone/connection/cookie_store_test.rb
|
306
321
|
- test/sunstone/connection/request_helper_test.rb
|
@@ -310,7 +325,7 @@ files:
|
|
310
325
|
homepage: http://sunstonerb.com
|
311
326
|
licenses: []
|
312
327
|
metadata: {}
|
313
|
-
post_install_message:
|
328
|
+
post_install_message:
|
314
329
|
rdoc_options: []
|
315
330
|
require_paths:
|
316
331
|
- lib
|
@@ -325,8 +340,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
325
340
|
- !ruby/object:Gem::Version
|
326
341
|
version: '0'
|
327
342
|
requirements: []
|
328
|
-
rubygems_version: 3.
|
329
|
-
signing_key:
|
343
|
+
rubygems_version: 3.2.3
|
344
|
+
signing_key:
|
330
345
|
specification_version: 4
|
331
346
|
summary: A library for interacting with REST APIs
|
332
347
|
test_files:
|
@@ -346,6 +361,7 @@ test_files:
|
|
346
361
|
- test/active_record/query_test.rb
|
347
362
|
- test/active_record/rpc_test.rb
|
348
363
|
- test/schema_mock.rb
|
364
|
+
- test/sunstone/connection/column_definition_test.rb
|
349
365
|
- test/sunstone/connection/configuration_test.rb
|
350
366
|
- test/sunstone/connection/cookie_store_test.rb
|
351
367
|
- test/sunstone/connection/request_helper_test.rb
|