sunstone 6.0.0.5 → 6.1.3

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/ext/active_record/associations.rb +2 -2
  3. data/ext/active_record/attribute_methods.rb +2 -2
  4. data/ext/active_record/callbacks.rb +1 -1
  5. data/ext/active_record/finder_methods.rb +42 -36
  6. data/ext/active_record/persistence.rb +2 -0
  7. data/ext/active_record/relation/calculations.rb +2 -2
  8. data/ext/active_record/statement_cache.rb +9 -5
  9. data/ext/active_record/transactions.rb +8 -15
  10. data/ext/arel/attributes/empty_relation.rb +31 -31
  11. data/ext/arel/nodes/select_statement.rb +1 -1
  12. data/lib/active_record/connection_adapters/sunstone/column.rb +3 -3
  13. data/lib/active_record/connection_adapters/sunstone/database_statements.rb +5 -5
  14. data/lib/active_record/connection_adapters/sunstone/schema_statements.rb +18 -8
  15. data/lib/active_record/connection_adapters/sunstone/type/binary.rb +34 -0
  16. data/lib/active_record/connection_adapters/sunstone_adapter.rb +39 -26
  17. data/lib/arel/visitors/sunstone.rb +13 -15
  18. data/lib/sunstone.rb +16 -2
  19. data/lib/sunstone/connection.rb +1 -1
  20. data/lib/sunstone/version.rb +1 -1
  21. metadata +40 -64
  22. data/.gitignore +0 -31
  23. data/.tm_properties +0 -1
  24. data/.travis.yml +0 -49
  25. data/Gemfile +0 -4
  26. data/README.md +0 -10
  27. data/Rakefile +0 -37
  28. data/TODO.md +0 -89
  29. data/ext/arel/attributes/relation.rb +0 -31
  30. data/sunstone.gemspec +0 -39
  31. data/test/active_record/associations/belongs_to_test.rb +0 -162
  32. data/test/active_record/associations/has_and_belongs_to_many_test.rb +0 -125
  33. data/test/active_record/associations/has_many_test.rb +0 -244
  34. data/test/active_record/eager_loading_test.rb +0 -62
  35. data/test/active_record/persistance_test.rb +0 -159
  36. data/test/active_record/preload_test.rb +0 -51
  37. data/test/active_record/query/all_test.rb +0 -33
  38. data/test/active_record/query/count_test.rb +0 -51
  39. data/test/active_record/query/distinct_test.rb +0 -30
  40. data/test/active_record/query/find_test.rb +0 -37
  41. data/test/active_record/query/limit_test.rb +0 -19
  42. data/test/active_record/query/order_test.rb +0 -27
  43. data/test/active_record/query/where_test.rb +0 -79
  44. data/test/active_record/query_test.rb +0 -123
  45. data/test/active_record/rpc_test.rb +0 -30
  46. data/test/schema_mock.rb +0 -117
  47. data/test/sunstone/connection/configuration_test.rb +0 -44
  48. data/test/sunstone/connection/cookie_store_test.rb +0 -37
  49. data/test/sunstone/connection/request_helper_test.rb +0 -105
  50. data/test/sunstone/connection/send_request_test.rb +0 -164
  51. data/test/sunstone/connection_test.rb +0 -23
  52. data/test/test_helper.rb +0 -152
@@ -1,30 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ActiveRecord::RPCTest < ActiveSupport::TestCase
4
-
5
- schema do
6
- create_table "ships", limit: 100 do |t|
7
- t.string "name", limit: 255
8
- end
9
- end
10
-
11
- class Ship < ActiveRecord::Base
12
- rpc :self_destruct
13
- end
14
-
15
- test '::rpc calls custom controller function' do
16
- webmock(:get, "/ships", { limit: 1, order: [{id: :asc}] }).to_return({
17
- body: [{id: 3, name: 'Sivar'}].to_json
18
- })
19
-
20
- webmock(:post, '/ships/3/self_destruct').to_return({
21
- body: {name: 'DESTROYED'}.to_json
22
- })
23
-
24
- ship = Ship.first
25
- assert ship.self_destruct!
26
- assert_equal 'DESTROYED', ship.name
27
- assert ship.changes.empty?
28
- end
29
-
30
- end
data/test/schema_mock.rb DELETED
@@ -1,117 +0,0 @@
1
- class ActiveSupport::TestCase
2
- class Schema
3
-
4
- class Table
5
-
6
- class Column
7
-
8
- def initialize(name, type, options={})
9
- @name = name
10
- @type = type
11
- @options = options
12
- end
13
-
14
- def as_json
15
- {type: @type, primary_key: false, null: true, array: false}.merge(@options)
16
- end
17
- end
18
-
19
- attr_accessor :name, :options, :columns
20
-
21
- def initialize(name, options={}, &block)
22
- @name = name
23
- @options = options
24
- @columns = {}
25
- case options[:id]
26
- when false
27
- else
28
- integer('id', primary_key: true, null: false)
29
- end
30
-
31
- block.call(self)
32
- end
33
-
34
- def string(name, options={})
35
- @columns[name] = Column.new(name, :string, options)
36
- end
37
-
38
- def datetime(name, options={})
39
- @columns[name] = Column.new(name, :datetime, options)
40
- end
41
-
42
- def integer(name, options={})
43
- @columns[name] = Column.new(name, :integer, options)
44
- end
45
-
46
- def to_json
47
- json = @options.slice(:limit)
48
- json[:columns] = {}
49
- @columns.each do |name, column|
50
- json[:columns][name] = column.as_json
51
- end
52
- json.to_json
53
- end
54
-
55
- end
56
-
57
- attr_accessor :tables
58
-
59
- def initialize
60
- @tables = {}
61
- end
62
-
63
- def self.define(&block)
64
- i = new
65
- i.define(&block)
66
- i
67
- end
68
-
69
- def define(&block)
70
- instance_eval(&block)
71
- end
72
-
73
- def create_table(name, options={}, &block)
74
- @tables[name] = Table.new(name, options, &block)
75
- end
76
-
77
- end
78
-
79
- def self.schema(&block)
80
- self.class_variable_set(:@@schema, Schema.define(&block))
81
- end
82
-
83
- set_callback(:setup, :before) do
84
- if !instance_variable_defined?(:@suite_setup_run) && self.class.class_variable_defined?(:@@schema)
85
- ActiveRecord::Base.establish_connection(adapter: 'sunstone', url: 'http://example.com')
86
-
87
- req_stub = stub_request(:get, /^http:\/\/example.com/).with do |req|
88
- case req.uri.path
89
- when '/tables'
90
- true
91
- when /^\/\w+\/schema$/i
92
- true
93
- else
94
- false
95
- end
96
- end
97
-
98
- req_stub.to_return do |req|
99
- case req.uri.path
100
- when '/tables'
101
- {
102
- body: self.class.class_variable_get(:@@schema).tables.keys.to_json,
103
- headers: { 'StandardAPI-Version' => '5.0.0.5' }
104
- }
105
- when /^\/(\w+)\/schema$/i
106
- {
107
- body: self.class.class_variable_get(:@@schema).tables[$1].to_json,
108
- headers: { 'StandardAPI-Version' => '5.0.0.5' }
109
- }
110
- end
111
- end
112
-
113
- end
114
- @suite_setup_run = true
115
- end
116
-
117
- end
@@ -1,44 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Sunstone::Connection::ConfigurationTest < ActiveSupport::TestCase
4
-
5
- test "setting the url sets the api_key" do
6
- connection = Sunstone::Connection.new(url: 'http://my_api_key@localhost')
7
- assert_equal('my_api_key', connection.api_key)
8
- end
9
-
10
- test "setting the url sets the host" do
11
- connection = Sunstone::Connection.new(url: 'https://example.com')
12
- assert_equal('example.com', connection.host)
13
- end
14
-
15
- test "setting the url sets the port" do
16
- connection = Sunstone::Connection.new(url: 'http://localhost')
17
- assert_equal(80, connection.port)
18
-
19
- connection = Sunstone::Connection.new(url: 'https://localhost')
20
- assert_equal(443, connection.port)
21
-
22
- connection = Sunstone::Connection.new(url: 'https://localhost:4321')
23
- assert_equal(4321, connection.port)
24
- end
25
-
26
- test "setting the url sets the use_ssl option" do
27
- connection = Sunstone::Connection.new(url: 'http://localhost')
28
- assert_equal(false, connection.use_ssl)
29
-
30
- connection = Sunstone::Connection.new(url: 'https://localhost')
31
- assert_equal(true, connection.use_ssl)
32
- end
33
-
34
- test "setting the user_agent appends it to the User-Agent" do
35
- connection = Sunstone::Connection.new(url: 'http://localhost')
36
- assert_equal("Sunstone/#{Sunstone::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_PLATFORM}", connection.user_agent)
37
-
38
- connection = Sunstone::Connection.new(url: 'http://localhost', user_agent: "MyGem/3.14")
39
- assert_equal("MyGem/3.14 Sunstone/#{Sunstone::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_PLATFORM}", connection.user_agent)
40
- end
41
-
42
- end
43
-
44
-
@@ -1,37 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Sunstone::Connection::CookieStoreTest < ActiveSupport::TestCase
4
-
5
- test '#send_request(#<Net::HTTPRequest) adds cookies to the cookie store if present' do
6
- store = CookieStore::HashStore.new
7
- connection = Sunstone::Connection.new(url: "http://testhost.com")
8
- stub_request(:get, "http://testhost.com/test").to_return(:body => 'get', :headers => {'Set-Cookie' => 'foo=bar; Max-Age=3600'})
9
-
10
- Sunstone::Connection.with_cookie_store(store) { connection.get('/test') }
11
-
12
- assert_equal 1, store.instance_variable_get(:@domains).size
13
- assert_equal 1, store.instance_variable_get(:@domains)['testhost.com'].size
14
- assert_equal 1, store.instance_variable_get(:@domains)['testhost.com']['/test'].size
15
- assert_equal 'bar', store.instance_variable_get(:@domains)['testhost.com']['/test']['foo'].value
16
- end
17
-
18
- test '#send_request(#<Net::HTTPRequest) sends cookie header if cookie store is present' do
19
- store = CookieStore::HashStore.new
20
- connection = Sunstone::Connection.new(url: "http://testhost.com")
21
- stub_request(:get, "http://testhost.com/test").to_return(
22
- headers: {
23
- 'Set-Cookie' => 'foo=bar; Path="/" Max-Age=3600'
24
- },
25
- body: 'get'
26
- )
27
- cookie_stub = stub_request(:get, "http://testhost.com/verify").with { |req|
28
- req.headers['Cookie'] == 'foo=bar'
29
- }.to_return(body: 'verify')
30
-
31
- Sunstone::Connection.with_cookie_store(store) { connection.get('/test') }
32
- Sunstone::Connection.with_cookie_store(store) { connection.get('/verify') }
33
-
34
- assert_requested(cookie_stub)
35
- end
36
-
37
- end
@@ -1,105 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Sunstone::Connection::RequestHelpersTest < ActiveSupport::TestCase
4
-
5
- # Sunstone.get ==============================================================
6
-
7
- test '#get(path)' do
8
- connection = Sunstone::Connection.new(url: "http://testhost.com")
9
- stub_request(:get, "http://testhost.com/test").to_return(:body => "get")
10
-
11
- assert_equal('get', connection.get('/test').body)
12
- end
13
-
14
- test '#get(path, params) with params as string' do
15
- connection = Sunstone::Connection.new(url: "http://testhost.com")
16
- stub_request(:get, "http://testhost.com/test").with(:query => {'key' => 'value'}).to_return(:body => "get")
17
-
18
- assert_equal 'get', connection.get('/test', 'key=value').body
19
- end
20
-
21
- test '#get(path, params) with params as hash' do
22
- connection = Sunstone::Connection.new(url: "http://testhost.com")
23
- stub_request(:get, "http://testhost.com/test").with(:query => {'key' => 'value'}).to_return(:body => "get")
24
-
25
- assert_equal 'get', connection.get('/test', {:key => 'value'}).body
26
- end
27
-
28
- test '#get(path, &block)' do
29
- connection = Sunstone::Connection.new(url: "http://testhost.com")
30
- stub_request(:get, "http://testhost.com/test").to_return(:body => 'get')
31
-
32
- connection.get('/test') do |response|
33
- assert_equal 'get', response.body
34
- end
35
- end
36
-
37
- # Sunstone.post =============================================================
38
-
39
- test '#post(path)' do
40
- connection = Sunstone::Connection.new(url: "http://testhost.com")
41
- stub_request(:post, "http://testhost.com/test").to_return(:body => "post")
42
-
43
- assert_equal('post', connection.post('/test').body)
44
- end
45
-
46
- test '#post(path, body)' do
47
- connection = Sunstone::Connection.new(url: "http://testhost.com")
48
- stub_request(:post, "http://testhost.com/test").with(:body => 'body').to_return(:body => "post")
49
-
50
- assert_equal('post', connection.post('/test', 'body').body)
51
- end
52
-
53
- test '#post(path, &block)' do
54
- connection = Sunstone::Connection.new(url: "http://testhost.com")
55
- stub_request(:post, "http://testhost.com/test").to_return(:body => 'post')
56
-
57
- connection.post('/test') do |response|
58
- assert_equal 'post', response.body
59
- end
60
- end
61
-
62
- # Sunstone.put ==============================================================
63
-
64
- test '#put(path)' do
65
- connection = Sunstone::Connection.new(url: "http://testhost.com")
66
- stub_request(:put, "http://testhost.com/test").to_return(:body => "put")
67
-
68
- assert_equal('put', connection.put('/test').body)
69
- end
70
-
71
- test '#put(path, body)' do
72
- connection = Sunstone::Connection.new(url: "http://testhost.com")
73
- stub_request(:put, "http://testhost.com/test").with(:body => 'body').to_return(:body => "put")
74
-
75
- assert_equal('put', connection.put('/test', 'body').body)
76
- end
77
-
78
- test '#put(path, &block)' do
79
- connection = Sunstone::Connection.new(url: "http://testhost.com")
80
- stub_request(:put, "http://testhost.com/test").to_return(:body => 'put')
81
-
82
- connection.put('/test') do |response|
83
- assert_equal 'put', response.body
84
- end
85
- end
86
-
87
- # Sunstone.delete ===========================================================
88
-
89
- test '#delete' do
90
- connection = Sunstone::Connection.new(url: "http://testhost.com")
91
- stub_request(:delete, "http://testhost.com/test").to_return(:body => "delete")
92
-
93
- assert_equal('delete', connection.delete('/test').body)
94
- end
95
-
96
- test '#delete(path, &block)' do
97
- connection = Sunstone::Connection.new(url: "http://testhost.com")
98
- stub_request(:delete, "http://testhost.com/test").to_return(:body => 'delete')
99
-
100
- connection.delete('/test') do |response|
101
- assert_equal 'delete', response.body
102
- end
103
- end
104
-
105
- end
@@ -1,164 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Sunstone::Connection::SendRequestTest < ActiveSupport::TestCase
4
-
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")
7
-
8
- test_stub = stub_request(:get, "http://example.com/verify").with { |req|
9
- req.headers['Api-Key'] == 'my_api_key'
10
- }
11
- connection.get('/verify')
12
- assert_requested(test_stub)
13
- end
14
-
15
- test '#send_request(#<Net::HTTPRequest>) includes the user_agent' do
16
- connection = Sunstone::Connection.new(url: "http://example.com")
17
-
18
- test_stub = stub_request(:get, "http://example.com/verify").with { |req|
19
- req.headers['User-Agent'] =~ /Sunstone\/\S+ Ruby\/\S+ \S+/
20
- }
21
- connection.get('/verify')
22
- assert_requested(test_stub)
23
-
24
- # Custom Agent
25
- connection = Sunstone::Connection.new(url: "http://example.com", user_agent: "MyClient/2")
26
-
27
- test_stub = stub_request(:get, "http://example.com/verify").with { |req|
28
- req.headers['User-Agent'] =~ /MyClient\/2 Sunstone\/\S+ Ruby\/\S+ \S+/
29
- }
30
- connection.get('/verify')
31
- assert_requested(test_stub)
32
- end
33
-
34
- test '#send_request(#<Net::HTTPRequest>)' do
35
- stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
36
-
37
- connection = Sunstone::Connection.new(url: "http://testhost.com")
38
- assert_equal('get', connection.send_request(Net::HTTP::Get.new('/test')).body)
39
- end
40
-
41
- test '#send_request(#<Net::HTTPRequest>, body) with string body' do
42
- stub_request(:post, "http://testhost.com/test").with(
43
- body: '{"key":"value"}'
44
- ).to_return(
45
- body: "post"
46
- )
47
-
48
- connection = Sunstone::Connection.new(url: "http://testhost.com")
49
- assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), '{"key":"value"}').body)
50
- end
51
-
52
- test '#send_request(#<Net::HTTPRequest>, body) with IO body' do
53
- stub_request(:post, "http://testhost.com/test").with { |request|
54
- request.headers['Transfer-Encoding'] == "chunked" && request.body == '{"key":"value"}'
55
- }.to_return(:body => "post")
56
-
57
- rd, wr = IO.pipe
58
- wr.write('{"key":"value"}')
59
- wr.close
60
-
61
- connection = Sunstone::Connection.new(url: "http://testhost.com")
62
- assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), rd).body)
63
- end
64
-
65
- test '#send_request(#<Net::HTTPRequest>, body) with Ruby Object body' do
66
- stub_request(:post, "http://testhost.com/test").with(body: '{"key":"value"}').to_return(body: "post")
67
-
68
- connection = Sunstone::Connection.new(url: "http://testhost.com")
69
- assert_equal('post', connection.send_request(Net::HTTP::Post.new('/test'), {:key => 'value'}).body)
70
- end
71
-
72
- test '#send_request(#<Net::HTTPRequest>) raises Sunstone::Exceptions on non-200 responses' do
73
- stub_request(:get, "http://testhost.com/400").to_return(status: 400)
74
- stub_request(:get, "http://testhost.com/401").to_return(status: 401)
75
- stub_request(:get, "http://testhost.com/403").to_return(status: 403)
76
- stub_request(:get, "http://testhost.com/404").to_return(status: 404)
77
- stub_request(:get, "http://testhost.com/410").to_return(status: 410)
78
- stub_request(:get, "http://testhost.com/422").to_return(status: 422)
79
- stub_request(:get, "http://testhost.com/450").to_return(status: 450)
80
- stub_request(:get, "http://testhost.com/503").to_return(status: 503)
81
- stub_request(:get, "http://testhost.com/550").to_return(status: 550)
82
-
83
- connection = Sunstone::Connection.new(url: "http://testhost.com")
84
- assert_raises(Sunstone::Exception::BadRequest) { connection.send_request(Net::HTTP::Get.new('/400')) }
85
- assert_raises(Sunstone::Exception::Unauthorized) { connection.send_request(Net::HTTP::Get.new('/401')) }
86
- assert_raises(Sunstone::Exception::Forbidden) { connection.send_request(Net::HTTP::Get.new('/403')) }
87
- assert_raises(Sunstone::Exception::NotFound) { connection.send_request(Net::HTTP::Get.new('/404')) }
88
- assert_raises(Sunstone::Exception::Gone) { connection.send_request(Net::HTTP::Get.new('/410')) }
89
- assert_raises(Sunstone::Exception::ApiVersionUnsupported) { connection.send_request(Net::HTTP::Get.new('/422')) }
90
- assert_raises(Sunstone::Exception) { connection.send_request(Net::HTTP::Get.new('/450')) }
91
- assert_raises(Sunstone::Exception::ServiceUnavailable) { connection.send_request(Net::HTTP::Get.new('/503')) }
92
- assert_raises(Sunstone::ServerError) { connection.send_request(Net::HTTP::Get.new('/550')) }
93
- end
94
-
95
- test '#send_request(#<Net::HTTPRequest>, &block) returns value returned from &block' do
96
- stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
97
-
98
- connection = Sunstone::Connection.new(url: "http://testhost.com")
99
- value = connection.send_request(Net::HTTP::Get.new('/test')) do |response|
100
- 3215
101
- end
102
-
103
- assert_equal 3215, value
104
- end
105
-
106
- test '#send_request(#<Net::HTTPRequest>, &block)' do
107
- connection = Sunstone::Connection.new(url: "http://testhost.com")
108
- stub_request(:get, "http://testhost.com/test").to_return(body: 'get')
109
-
110
- connection.send_request(Net::HTTP::Get.new('/test')) do |response|
111
- assert_equal 'get', response.body
112
- end
113
-
114
- # make sure block is not called when not in valid_response_codes
115
- stub_request(:get, "http://testhost.com/test").to_return(status: 401, body: 'get')
116
-
117
- assert_raises(Sunstone::Exception::Unauthorized) {
118
- connection.send_request(Net::HTTP::Get.new('/test')) do |response|
119
- raise Sunstone::Exception, 'Should not get here'
120
- end
121
- }
122
- end
123
-
124
- test '#send_request(#<Net::HTTPRequest>, &block) with block reading chunks' do
125
- connection = Sunstone::Connection.new(url: "http://testhost.com")
126
-
127
- rd, wr = IO.pipe
128
- rd = Net::BufferedIO.new(rd)
129
- wr.write(<<-DATA.gsub(/^ +/, '').gsub(/\n/, "\r\n"))
130
- HTTP/1.1 200 OK
131
- Content-Length: 5
132
-
133
- hello
134
- DATA
135
-
136
- res = Net::HTTPResponse.read_new(rd)
137
- mock_connection = mock('connection')
138
- mock_connection.stubs(:request).yields(res)
139
- connection.instance_variable_set(:@connection, mock_connection)
140
-
141
- res.reading_body(rd, true) do
142
- connection.send_request(Net::HTTP::Get.new('/test')) do |response|
143
- response.read_body do |chunk|
144
- assert_equal('hello', chunk)
145
- end
146
- end
147
- end
148
- end
149
-
150
- # TODO: support multple depreaction-notice headers
151
- test 'deprecation warning printed when deprecation header returned' do
152
- connection = Sunstone::Connection.new(url: "http://testhost.com")
153
-
154
- stub_request(:get, "http://testhost.com/test").to_return(
155
- body: 'get',
156
- headers: { 'Deprecation-Notice': 'my deprecation message' }
157
- )
158
-
159
- ActiveSupport::Deprecation.expects(:warn).with('my deprecation message')
160
-
161
- connection.send_request(Net::HTTP::Get.new('/test'))
162
- end
163
-
164
- end