sqlcached_client 0.0.1 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f642ec5bff84d1fb7738aff7fedad4d695e8224
4
- data.tar.gz: 0168729e04f2d4eca81b5159e09efaa8c0cedd5f
3
+ metadata.gz: 76ca46c57afc585a8a3ba673e64992b765534fde
4
+ data.tar.gz: 2be70c7d54517dd4a3d3bedb833572592b3bfea0
5
5
  SHA512:
6
- metadata.gz: 5a96a6163594e8a34a86e93b503552d453bd67b0ff96ef4da4b97386da954fdf767504acf3876b1903bf06e18e3e519bc940ca60b3ded5f63fc2bbc34e813361
7
- data.tar.gz: d494b4126fa2e8fb60ddfa7562675b48e6f94e9fd9474f2712d51631a11117905c3d9934fe2250b1f1ea4f9bfed498916697d672ec065c8bcbfd632e442f8097
6
+ metadata.gz: 6f797a555a1f56561da3a56c535ddd8f0822e6636cfa5d3b2bc648cff9e99f51cc0d8e215c1aca398ba381e5ed87b5f24f64b5cebd59ddec6b688fa475aef895
7
+ data.tar.gz: cfa1fa922a25c58a327361e0561b7fd5d4391562f4f125ac32cd16bb1a7de6252b2db9655767843847ae448f6550567152f74fea1000e498b6dba11776bae0a1
@@ -17,14 +17,19 @@ module SqlcachedClient
17
17
  class << self
18
18
  attr_reader :query_id
19
19
 
20
+ # Sets the name of this entity
20
21
  def entity_name(value)
21
22
  @query_id = value
22
23
  end
23
24
 
25
+ # Sets the query of this entity if a parameter is provided, otherwise
26
+ # returns the value previously set.
24
27
  def query(sql_string = nil)
25
28
  sql_string.nil? ? @query : @query = sql_string.strip
26
29
  end
27
30
 
31
+ # Configures the server of this entity if a parameter is provided,
32
+ # otherwise returns the server object previously set.
28
33
  def server(config = nil)
29
34
  if config.nil?
30
35
  @server ||
@@ -43,17 +48,40 @@ module SqlcachedClient
43
48
  end
44
49
  end
45
50
 
51
+ # Gets a session from the server and yields the passed block
52
+ def server_session(&block)
53
+ server.session(&block)
54
+ end
55
+
56
+ # Runs the entity query with the provided parameters
57
+ # @return [Resultset]
46
58
  def where(params, dry_run = false)
47
59
  request = server.format_request(query_id, query, params)
48
60
  if dry_run
49
61
  request
50
62
  else
51
- data = server.run_query(server.build_request_body([request]))
63
+ data =
64
+ server.session do |server, session|
65
+ server.run_query(session, server.build_request_body([request]))
66
+ end
52
67
  data = data[0] if data.is_a?(Array)
53
68
  Resultset.new(self, data)
54
69
  end
55
70
  end
56
71
 
72
+ # Defines a 'has_many' relationship. Available options are
73
+ # [class_name]
74
+ # Specifies the class of the associated objects, if not given it's
75
+ # inferred from the accessor_name (singularized + camelized).
76
+ # [where]
77
+ # Specifies how to fill the query template for the associated objects.
78
+ # It's an hash where each key is a foreign parameter that will be
79
+ # set to the value provided. A special case occours when the value is
80
+ # a Symbol, in this case it represents the value of the attribute named
81
+ # as the symbol.
82
+ # For example, <tt>where: { id: :user_id }</tt> fills the parameter
83
+ # <tt>id</tt> of the foreign entity with the value of
84
+ # <tt>self.user_id</tt>.
57
85
  def has_many(accessor_name, options)
58
86
  foreign_class_name =
59
87
  if options[:class_name].present?
@@ -100,6 +128,8 @@ module SqlcachedClient
100
128
  register_association(accessor_name)
101
129
  end
102
130
 
131
+ # Defines a 'has_one' relationship. See 'has_many' for the available
132
+ # options
103
133
  def has_one(accessor_name, options)
104
134
  plural_accessor_name = "s_#{accessor_name}".to_s.pluralize
105
135
  class_name = accessor_name.to_s.camelize
@@ -22,12 +22,13 @@ module SqlcachedClient
22
22
 
23
23
  class << self
24
24
 
25
- def build_associations(resultsets, server, max_depth, current_depth = 0)
25
+ def build_associations(resultsets, server, session, max_depth, current_depth = 0)
26
26
  if resultsets.any?
27
27
  batch = resultsets.map { |r| r._get_entities_association_requests }
28
28
  if batch.flatten.any?
29
29
  next_batch =
30
30
  server.run_query(
31
+ session,
31
32
  server.build_request_body(
32
33
  batch
33
34
  )
@@ -35,7 +36,8 @@ module SqlcachedClient
35
36
  resultsets[i]._fill_associations(resultset_data)
36
37
  end.flatten!
37
38
  if !max_depth || current_depth < max_depth
38
- build_associations(next_batch, server, max_depth, current_depth + 1)
39
+ build_associations(next_batch, server, session, max_depth,
40
+ current_depth + 1)
39
41
  end
40
42
  end
41
43
  end
@@ -55,7 +57,9 @@ module SqlcachedClient
55
57
  end
56
58
 
57
59
  def build_associations(max_depth = false)
58
- self.class.build_associations([self], entity_class.server, max_depth)
60
+ entity_class.server_session do |server, session|
61
+ self.class.build_associations([self], server, session, max_depth)
62
+ end
59
63
  end
60
64
 
61
65
  def _fill_associations(data)
@@ -12,23 +12,20 @@ module SqlcachedClient
12
12
  end
13
13
 
14
14
 
15
- def run_query(http_req_body)
16
- url = server_url
17
- Net::HTTP.start(url.host, url.port) do |http|
18
- req = Net::HTTP::Post.new(data_batch_url)
19
- req.set_content_type('application/json')
20
- req.body = http_req_body.to_json
21
- resp = http.request(req)
22
- if 'application/json' == resp['Content-Type']
23
- resp_body = parse_response_body(JSON.parse(resp.body))
24
- else
25
- resp_body = resp.body
26
- end
27
- if 200 == resp.code.to_i
28
- resp_body
29
- else
30
- raise "Got http response #{resp.code} from server - #{resp_body.inspect}"
31
- end
15
+ def run_query(session, http_req_body)
16
+ req = Net::HTTP::Post.new(data_batch_url)
17
+ req.set_content_type('application/json')
18
+ req.body = http_req_body.to_json
19
+ resp = session.request(req)
20
+ if 'application/json' == resp['Content-Type']
21
+ resp_body = parse_response_body(JSON.parse(resp.body))
22
+ else
23
+ resp_body = resp.body
24
+ end
25
+ if 200 == resp.code.to_i
26
+ resp_body
27
+ else
28
+ raise "Got http response #{resp.code} from server - #{resp_body.inspect}"
32
29
  end
33
30
  end
34
31
 
@@ -61,6 +58,20 @@ module SqlcachedClient
61
58
  }
62
59
  end
63
60
 
61
+
62
+ def get_session
63
+ url = server_url
64
+ Net::HTTP.start(url.host, url.port)
65
+ end
66
+
67
+
68
+ def session
69
+ s = get_session
70
+ ret_value = yield(self, s) if block_given?
71
+ s.finish
72
+ ret_value
73
+ end
74
+
64
75
  private
65
76
 
66
77
  def server_url
@@ -1,3 +1,3 @@
1
1
  module SqlcachedClient
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,150 @@
1
+ require 'sqlcached_client/entity'
2
+ require 'sqlcached_client/server'
3
+
4
+ describe SqlcachedClient::Entity do
5
+
6
+ describe :initialize do
7
+ it "should record the attribute names" do
8
+ e = SqlcachedClient::Entity.new({ foo: 'bar', baz: 'biz' })
9
+ expect(e.attribute_names).to eq([:foo, :baz])
10
+ end
11
+ end
12
+
13
+
14
+ describe :entity_name do
15
+ it "should set query_id" do
16
+ entity_class = Class.new(SqlcachedClient::Entity) do
17
+ entity_name("foo")
18
+ end
19
+ expect(entity_class.query_id).to eq("foo")
20
+ end
21
+ end
22
+
23
+
24
+ describe :query do
25
+ context "if a parameter is provided" do
26
+ it "should set @query and strip spaces" do
27
+ entity_class = Class.new(SqlcachedClient::Entity) do
28
+ query(" foo \n ")
29
+ end
30
+ expect(entity_class.instance_variable_get(:@query)).to eq("foo")
31
+ end
32
+ end
33
+
34
+ context "if no parameter is provided" do
35
+ it "should return the value previously stored" do
36
+ entity_class = Class.new(SqlcachedClient::Entity) do
37
+ query(" foo \n ")
38
+ end
39
+ expect(entity_class.query).to eq("foo")
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ describe :server do
46
+ context "if a parameter is provided" do
47
+ it "should set @server" do
48
+ entity_class = Class.new(SqlcachedClient::Entity) do
49
+ server("foo")
50
+ end
51
+ expect(entity_class.instance_variable_get(:@server)).to eq("foo")
52
+ end
53
+
54
+ context "if the parameter is an hash" do
55
+ it "should instantiate a new Server" do
56
+ entity_class = Class.new(SqlcachedClient::Entity) do
57
+ server(foo: "bar")
58
+ end
59
+ expect(entity_class.server).to be_instance_of(SqlcachedClient::Server)
60
+ end
61
+ end
62
+ end
63
+
64
+ context "if no parameter is provided" do
65
+ it "should return the value previously stored" do
66
+ entity_class = Class.new(SqlcachedClient::Entity) do
67
+ server("foo")
68
+ end
69
+ expect(entity_class.server).to eq("foo")
70
+ end
71
+
72
+ context "if no server was configured for the class" do
73
+ it "should use the value from the first ancestor" do
74
+ entity_class0 = Class.new(SqlcachedClient::Entity) do
75
+ server("foo")
76
+ end
77
+ entity_class1 = Class.new(entity_class0)
78
+ expect(entity_class1.server).to eq("foo")
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+
85
+ describe :where do
86
+ let(:entity_class) do
87
+ Class.new(SqlcachedClient::Entity) do
88
+ entity_name 'foo'
89
+ query 'bar'
90
+ end
91
+ end
92
+
93
+ context "if dry_run" do
94
+ it "should return the request that would be sent to the server" do
95
+ entity_class.server(double(format_request: "this is the request"))
96
+ expect(entity_class.server).to receive(:format_request).with("foo", "bar", { baz: "biz" })
97
+ expect(entity_class.where({ baz: "biz" }, true)).to eq("this is the request")
98
+ end
99
+ end
100
+
101
+ context "if not dry_run" do
102
+ it "should create a new ResultSet" do
103
+ entity_class.server(double(
104
+ format_request: "this is the request",
105
+ build_request_body: "request body",
106
+ session: [[{ key: "value" }], 2, 3]
107
+ ))
108
+ expect(entity_class.server).to receive(:format_request).with(
109
+ "foo", "bar", { baz: "biz" })
110
+ expect(entity_class.where({ baz: "biz" })).to be_instance_of(
111
+ SqlcachedClient::Resultset)
112
+ end
113
+ end
114
+ end
115
+
116
+
117
+ describe :has_many do
118
+ pending
119
+ end
120
+
121
+
122
+ describe :has_one do
123
+ pending
124
+ end
125
+
126
+
127
+ describe :get_association_requests do
128
+ pending
129
+ end
130
+
131
+
132
+ describe :set_associations_data do
133
+ pending
134
+ end
135
+
136
+
137
+ describe :get_associations do
138
+ pending
139
+ end
140
+
141
+
142
+ describe :build_associations do
143
+ pending
144
+ end
145
+
146
+
147
+ describe :to_h do
148
+ pending
149
+ end
150
+ end
@@ -0,0 +1,43 @@
1
+ require 'sqlcached_client/resultset'
2
+ require 'sqlcached_client/hash_struct'
3
+
4
+ describe SqlcachedClient::Resultset do
5
+
6
+ describe :initialize do
7
+
8
+ it "should set count" do
9
+ r = SqlcachedClient::Resultset.new(Object, [Object.new] * 3)
10
+ expect(r.count).to eq(3)
11
+ end
12
+
13
+ context "when passed entities are hashes" do
14
+ it "should map them to instances of the entity class provided" do
15
+ r = SqlcachedClient::Resultset.new(SqlcachedClient::HashStruct,
16
+ [{ foo: 'bar' }] * 3)
17
+ expect(r.entities[0]).to be_instance_of(SqlcachedClient::HashStruct)
18
+ end
19
+ end
20
+
21
+ context "when passing entities that are instances of the class" do
22
+ it "should set them without do anything" do
23
+ entities = [Object.new] * 3
24
+ r = SqlcachedClient::Resultset.new(Object, entities)
25
+ expect(r.entities).to eq(entities)
26
+ end
27
+ end
28
+ end
29
+
30
+
31
+ describe :build_associations do
32
+ pending
33
+ end
34
+
35
+
36
+ describe :[] do
37
+ it "should be entities[i]" do
38
+ entities = [Object.new] * 3
39
+ r = SqlcachedClient::Resultset.new(Object, entities)
40
+ 3.times { |i| expect(r[i]).to eq(entities[i]) }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,62 @@
1
+ require 'sqlcached_client/server'
2
+
3
+ describe SqlcachedClient::Server do
4
+
5
+ let(:server) { SqlcachedClient::Server.new({}) }
6
+
7
+ describe :initialize do
8
+ it "should set host and port" do
9
+ server = SqlcachedClient::Server.new(host: "localhost", port: 80)
10
+ expect(server.host).to eq("localhost")
11
+ expect(server.port).to eq(80)
12
+ end
13
+ end
14
+
15
+
16
+ describe :build_request_body do
17
+ it "should put the passed value into an hash" do
18
+ expect(server.build_request_body("foo")).to eq({ batch: "foo" })
19
+ end
20
+ end
21
+
22
+
23
+ describe :format_request do
24
+ it "should be an hash with id, template, params keys" do
25
+ expect(server.format_request("foo", "bar", "baz")).to eq({
26
+ queryId: "foo",
27
+ queryTemplate: "bar",
28
+ queryParams: "baz"
29
+ })
30
+ end
31
+ end
32
+
33
+
34
+ describe :parse_response_body do
35
+ context "if body is an array" do
36
+ it "should parse each item recoursively" do
37
+ expect(server.parse_response_body([[1, 2, [3, 4]], 5])).to eq(
38
+ [[1, 2, [3, 4]], 5])
39
+ end
40
+ end
41
+
42
+ context "if body is an hash" do
43
+ it "should return the value corresponding to the key 'resultset'" do
44
+ expect(server.parse_response_body({ 'resultset' => 1 })).to eq(1)
45
+ end
46
+
47
+ context "if key 'resultset' is not present" do
48
+ it "should be nil" do
49
+ expect(server.parse_response_body({ foo: 'bar' })).to be_nil
50
+ end
51
+ end
52
+
53
+ context "if resultset is a string" do
54
+ it "should be parsed as json" do
55
+ expect(server.parse_response_body({
56
+ 'resultset' => "{ \"foo\": \"bar\", \"baz\": 1 }" })).to eq({
57
+ "foo" => "bar", "baz" => 1 })
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlcached_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roberto Maestroni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-28 00:00:00.000000000 Z
11
+ date: 2015-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -84,7 +84,10 @@ files:
84
84
  - lib/sqlcached_client/resultset.rb
85
85
  - lib/sqlcached_client/server.rb
86
86
  - lib/sqlcached_client/version.rb
87
+ - spec/sqlcached_client/entity_spec.rb
87
88
  - spec/sqlcached_client/hash_struct_spec.rb
89
+ - spec/sqlcached_client/resultset_spec.rb
90
+ - spec/sqlcached_client/server_spec.rb
88
91
  - sqlcached_client.gemspec
89
92
  homepage: https://github.com/rmaestroni/sqlcached_client
90
93
  licenses:
@@ -111,4 +114,7 @@ signing_key:
111
114
  specification_version: 4
112
115
  summary: A Ruby client for sqlcached
113
116
  test_files:
117
+ - spec/sqlcached_client/entity_spec.rb
114
118
  - spec/sqlcached_client/hash_struct_spec.rb
119
+ - spec/sqlcached_client/resultset_spec.rb
120
+ - spec/sqlcached_client/server_spec.rb