dymos 0.2.2 → 0.2.3

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
  SHA1:
3
- metadata.gz: 4c246a1228f4ef98b4e464d5d96baed0110d1ba1
4
- data.tar.gz: 91a67b4c79e361b7691db2c397e3249767024413
3
+ metadata.gz: 222758f7001cee301006fcd83d6b59a1583347f2
4
+ data.tar.gz: 491976f1b67ffd4ea5a5450dc196f5a340b67086
5
5
  SHA512:
6
- metadata.gz: 5c117aa6a02e90ec45e10e55abd146c1a0535ccd12250c356136f24a3c661a89e64ffd05958cb231e766387f81b49df24f80ac21724e402e9db7b116c818a8ca
7
- data.tar.gz: 6c81c795420bc400f3b18faa74a485f6b6bbf8ce4a3f1bde63de0170025f7709f76ddd01db51041236fcc8d09e5a44e582b973815727f2a3a93bc3b3f1a103c0
6
+ metadata.gz: 2c86c507f99c19486796c40f4457bb75312786e6448b7c6e494aca27dedb1b9846ad6e9d4be114c1e9c45af9c2dd5a57782d248e5bb38361623d8d987f733488
7
+ data.tar.gz: d9486f95ff6ea81b7195b278decd4a757fab1062b808bf572c5ab96fab1d8d6779d3a507adf9f83c8ffa7329e616beab11c44babfe8384efc15846a98bdc7dd7
@@ -1,6 +1,7 @@
1
1
  require 'active_support/all'
2
2
 
3
3
  require "dymos/config"
4
+ require "dymos/query/parameter/filter_expression"
4
5
  require "dymos/query/base"
5
6
  require "dymos/query/put_item"
6
7
  require "dymos/query/update_item"
@@ -17,6 +18,19 @@ require "dymos/client"
17
18
  require "dymos/version"
18
19
 
19
20
  module Dymos
21
+ def self.model_query_methods
22
+ @model_query_methods ||= ::Dymos::Query::Query.instance_methods(false)+
23
+ ::Dymos::Query::GetItem.instance_methods(false)+
24
+ ::Dymos::Query::Scan.instance_methods(false)+
25
+ ::Dymos::Query::Parameter::FilterExpression.instance_methods(false)
26
+
27
+ end
28
+
29
+ def self.model_update_query_methods
30
+ @model_update_query_methods ||= ::Dymos::Query::UpdateItem.instance_methods(false)+
31
+ ::Dymos::Query::PutItem.instance_methods(false)+
32
+ ::Dymos::Query::DeleteItem.instance_methods(false)
33
+ end
20
34
  end
21
35
 
22
36
  #Timeオブジェクト扱いたいのでアラウンドエイリアスで先に捕まえる
@@ -27,8 +41,6 @@ module Aws
27
41
  alias :orig_format :format
28
42
  def format(obj)
29
43
  case obj
30
- when TrueClass then { n:"1" }
31
- when FalseClass then { n:"0" }
32
44
  when Time then { s: obj.iso8601 }
33
45
  else
34
46
  orig_format obj
@@ -21,10 +21,7 @@ module Dymos
21
21
  attr_accessor :last_execute_query
22
22
 
23
23
  def method_missing(name, *args, &block)
24
- methods ||= ::Dymos::Query::Query.instance_methods(false)+
25
- ::Dymos::Query::GetItem.instance_methods(false)+
26
- ::Dymos::Query::Scan.instance_methods(false)
27
- if methods.include? name
24
+ if Dymos.model_query_methods.include? name
28
25
  @query||={}
29
26
  @query[name]=args
30
27
  self
@@ -35,10 +32,8 @@ module Dymos
35
32
  end
36
33
 
37
34
  def method_missing(name, *args, &block)
38
- methods ||= ::Dymos::Query::UpdateItem.instance_methods(false)+
39
- ::Dymos::Query::PutItem.instance_methods(false)+
40
- ::Dymos::Query::DeleteItem.instance_methods(false)
41
- if methods.include? name
35
+
36
+ if Dymos.model_update_query_methods.include? name
42
37
  @query||={}
43
38
  @query[name]=args
44
39
  self
@@ -49,7 +44,7 @@ module Dymos
49
44
 
50
45
  def self.field(attr, type, default: nil, desc: nil)
51
46
  fail StandardError('attribute name is invalid') if attr =~ /[\!\?]$/
52
- fail StandardError('require "default" option') if (type == :bool && default.nil?)
47
+ fail StandardError('require "default" option') if (type == :boolean && default.nil?)
53
48
 
54
49
  @fields ||= {}
55
50
  @fields[attr]={
@@ -65,7 +60,7 @@ module Dymos
65
60
  val = read_attribute(attr) || default
66
61
  return val if raw || !val.present?
67
62
  case type
68
- when :bool
63
+ when :boolean
69
64
  to_b(val)
70
65
  when :time
71
66
  Time.parse val
@@ -83,7 +78,7 @@ module Dymos
83
78
  define_method("#{attr}_desc") { desc }
84
79
  define_method("#{attr}?") do
85
80
  val = self.send attr
86
- if type == :bool
81
+ if type == :boolean
87
82
  val
88
83
  else
89
84
  !val.nil?
@@ -18,6 +18,21 @@ module Dymos
18
18
  value = ::Dymos::Config.default[command.to_sym].merge value
19
19
  @query.merge value
20
20
  end
21
+
22
+ protected
23
+ def parse_condition(*values)
24
+ if values[1].class == Symbol
25
+ if values.count == 2
26
+ column, operator, value = values[0], values[1], nil
27
+ else
28
+ column, operator, value = values
29
+ end
30
+ else
31
+ column, operator, value = values[0], :eq, values[1]
32
+ end
33
+
34
+ [column, operator, value]
35
+ end
21
36
  end
22
37
  end
23
38
  end
@@ -15,12 +15,8 @@ module Dymos
15
15
  self
16
16
  end
17
17
 
18
- def add_expected(*value)
19
- if value.count == 2
20
- column, operator, value = value[0], :eq, value[1]
21
- else
22
- column, operator, value = value
23
- end
18
+ def add_expected(*values)
19
+ column, operator, value = parse_condition(*values)
24
20
  @query[:expected] ||= {}
25
21
  @query[:expected].store(*_add_expected(column, operator, value))
26
22
  self
@@ -0,0 +1,35 @@
1
+ module Dymos
2
+ module Query
3
+ module Parameter
4
+ module FilterExpression
5
+ def filter_expression(value)
6
+ @query[:filter_expression] = value
7
+ self
8
+ end
9
+
10
+ def expression_attribute_names(value)
11
+ names = value.deep_stringify_keys.map do |k, v|
12
+ k="##{k}" unless k[0] == "#"
13
+ [k, v]
14
+ end
15
+ @query[:expression_attribute_names] = Hash[*names.flatten]
16
+ self
17
+ end
18
+
19
+ def expression_attribute_values(value)
20
+ values = value.deep_stringify_keys.map do |k, v|
21
+ k=":#{k}" unless k[0] == ":"
22
+ [k, v]
23
+ end
24
+ @query[:expression_attribute_values] = Hash[*values.flatten]
25
+ self
26
+ end
27
+
28
+ alias :expression :filter_expression
29
+ alias :bind_names :expression_attribute_names
30
+ alias :bind_values :expression_attribute_values
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -15,12 +15,8 @@ module Dymos
15
15
  self
16
16
  end
17
17
 
18
- def add_expected(*value)
19
- if value.count == 2
20
- column, operator, value = value[0], :eq, value[1]
21
- else
22
- column, operator, value = value
23
- end
18
+ def add_expected(*values)
19
+ column, operator, value = parse_condition(*values)
24
20
  @query[:expected] ||= {}
25
21
  @query[:expected].store(*_add_expected(column, operator, value))
26
22
  self
@@ -1,6 +1,7 @@
1
1
  module Dymos
2
2
  module Query
3
3
  class Query < Base
4
+ include Parameter::FilterExpression
4
5
 
5
6
  def command
6
7
  'query'
@@ -40,18 +41,13 @@ module Dymos
40
41
  self
41
42
  end
42
43
 
43
- def add_conditions(*value)
44
- if value.count == 2
45
- column, operator, value = value[0], :eq, value[1]
46
- else
47
- column, operator, value = value
48
- end
44
+ def add_conditions(*values)
45
+ column, operator, value = parse_condition(*values)
49
46
  @query[:key_conditions] ||= {}
50
47
  @query[:key_conditions].store(*_add_filter(column, operator, value))
51
48
  self
52
49
  end
53
50
 
54
-
55
51
  def comparison_operator(value)
56
52
  @query[:comparison_operator] = value.to_s.upcase
57
53
  self
@@ -63,12 +59,8 @@ module Dymos
63
59
  self
64
60
  end
65
61
 
66
- def add_filter(*value)
67
- if value.count == 2
68
- column, operator, value = value[0], :eq, value[1]
69
- else
70
- column, operator, value = value
71
- end
62
+ def add_filter(*values)
63
+ column, operator, value = parse_condition(*values)
72
64
  @query[:query_filter] ||= {}
73
65
  @query[:query_filter].store(*_add_filter(column, operator, value))
74
66
  filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:query_filter].count > 1
@@ -113,15 +105,6 @@ module Dymos
113
105
  self
114
106
  end
115
107
 
116
- def projection_expression(value)
117
- @query[:projection_expression] = value
118
- self
119
- end
120
-
121
- def expression_attribute_names(value)
122
- @query[:expression_attribute_names] = value.deep_stringify_keys
123
- self
124
- end
125
108
  end
126
109
  end
127
110
  end
@@ -1,6 +1,8 @@
1
1
  module Dymos
2
2
  module Query
3
3
  class Scan < Base
4
+ include Parameter::FilterExpression
5
+
4
6
  def command
5
7
  'scan'
6
8
  end
@@ -26,12 +28,9 @@ module Dymos
26
28
  self
27
29
  end
28
30
 
29
- def add_filter(*value)
30
- if value.count == 2
31
- column, operator, value = value[0], :eq, value[1]
32
- else
33
- column, operator, value = value
34
- end
31
+ def add_filter(*values)
32
+ column, operator, value = parse_condition(*values)
33
+
35
34
  @query[:scan_filter] ||= {}
36
35
  @query[:scan_filter].store(*_add_filter(column, operator, value))
37
36
  filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:scan_filter].count > 1
@@ -39,11 +38,11 @@ module Dymos
39
38
  end
40
39
 
41
40
  def _add_filter(column, operator, value)
42
- [column.to_s, {
43
- attribute_value_list: [*value],
44
- comparison_operator: operator.to_s.upcase
45
- }
46
- ]
41
+ hash = {
42
+ comparison_operator: operator.to_s.upcase
43
+ }
44
+ hash[:attribute_value_list]=[*value] if value.present?
45
+ [column.to_s, hash]
47
46
  end
48
47
 
49
48
  def filter_operator(value)
@@ -73,26 +72,6 @@ module Dymos
73
72
  self
74
73
  end
75
74
 
76
- def projection_expression(value)
77
- @query[:projection_expression] = value
78
- self
79
- end
80
-
81
- def filter_expression(value)
82
- @query[:filter_expression] = value
83
- self
84
- end
85
-
86
- def expression_attribute_names(value)
87
- @query[:expression_attribute_names] = value.deep_stringify_keys
88
- self
89
- end
90
-
91
- def expression_attribute_values(value)
92
- @query[:expression_attribute_values] = value.deep_stringify_keys
93
- self
94
- end
95
-
96
75
  end
97
76
  end
98
77
  end
@@ -30,12 +30,8 @@ module Dymos
30
30
  self
31
31
  end
32
32
 
33
- def add_attribute_updates(*value)
34
- if value.count == 2
35
- column, operator, value = value[0], :put, value[1]
36
- else
37
- column, operator, value = value
38
- end
33
+ def add_attribute_updates(*values)
34
+ column, operator, value = parse_condition(*values)
39
35
  @query[:attribute_updates] ||= {}
40
36
  @query[:attribute_updates].store(*_attribute_updates(column, operator, value))
41
37
  self
@@ -54,12 +50,8 @@ module Dymos
54
50
  self
55
51
  end
56
52
 
57
- def add_expected(*value)
58
- if value.count == 2
59
- column, operator, value = value[0], :eq, value[1]
60
- else
61
- column, operator, value = value
62
- end
53
+ def add_expected(*values)
54
+ column, operator, value = parse_condition(*values)
63
55
  @query[:expected] ||= {}
64
56
  @query[:expected].store(*_add_expected(column, operator, value))
65
57
  self
@@ -1,3 +1,3 @@
1
1
  module Dymos
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -103,6 +103,7 @@ Thread:
103
103
  Replies: 0
104
104
  Answered: 0
105
105
  Tags: [ "index", "primarykey", "table" ]
106
+ Option:
106
107
  LastPostDateTime: "2012-01-03T00:40:57.165Z"
107
108
  -
108
109
  ForumName: "DynamoDB"
@@ -113,6 +114,7 @@ Thread:
113
114
  Replies: 0
114
115
  Answered: 0
115
116
  Tags: [ "index", "primarykey", "rangekey" ]
117
+ Option:
116
118
  LastPostDateTime: "2012-01-03T00:40:57.165Z"
117
119
  -
118
120
  ForumName: "Amazon S3"
@@ -123,6 +125,7 @@ Thread:
123
125
  Replies: 0
124
126
  Answered: 0
125
127
  Tags: [ "largeobject", "multipart upload" ]
128
+ Option: "private"
126
129
  LastPostDateTime: "2012-01-03T00:40:57.165Z"
127
130
 
128
131
  Reply:
@@ -7,7 +7,7 @@ describe Dymos::Model do
7
7
  end
8
8
  it "type:boolには初期値が必須" do
9
9
  expect { Class.new(Dymos::Model) do
10
- field "hoge", :bool
10
+ field "hoge", :boolean
11
11
  end }.to raise_error
12
12
  end
13
13
  end
@@ -18,7 +18,7 @@ describe Dymos::Model do
18
18
  field :email, :string
19
19
  field :list, :string_set
20
20
  field :count, :integer
21
- field :enable, :bool, default: false
21
+ field :enable, :boolean, default: false
22
22
 
23
23
  field :created_at, :time
24
24
  field :updated_at, :time
@@ -58,8 +58,8 @@ describe Dymos::Model do
58
58
  @client.put_item(table_name: 'dummy', item: {id: 'fuga', name: '次郎'})
59
59
  @client.put_item(table_name: 'dummy', item: {id: 'piyo', name: '三郎'})
60
60
  @client.put_item(table_name: 'dummy', item: {id: 'musashi', name: '巴'}) #削除用
61
- @client.put_item(table_name: 'dummy', item: {id: 'enable_id', name: 'enable', enable: 1})
62
- @client.put_item(table_name: 'dummy', item: {id: 'disable_id', name: 'disable', enable: 0})
61
+ @client.put_item(table_name: 'dummy', item: {id: 'enable_id', name: 'enable', enable: true})
62
+ @client.put_item(table_name: 'dummy', item: {id: 'disable_id', name: 'disable', enable: false})
63
63
 
64
64
  @client.delete_table(table_name: 'post') if @client.list_tables[:table_names].include?('post')
65
65
  @client.create_table(
@@ -32,6 +32,7 @@ describe 'query' do
32
32
  field :Views, :integer
33
33
  field :Answered, :string
34
34
  field :Tags, :array
35
+ field :Option, :string
35
36
  field :LastPostDateTime, :time
36
37
  end
37
38
  class ReplyModel < Dymos::Model
@@ -39,7 +40,7 @@ describe 'query' do
39
40
  field :Id, :string
40
41
  field :ReplyDateTime, :time
41
42
  field :Message, :string
42
- field :ReplyDateTime, :string
43
+ field :PostedBy, :string
43
44
  end
44
45
 
45
46
  describe :find do
@@ -72,6 +73,62 @@ describe 'query' do
72
73
  where(Id: "DynamoDB#DynamoDB Thread 1", PostedBy: "User A").all
73
74
  expect(result.count).to eq(2)
74
75
  end
76
+
77
+ describe :filter_expression do
78
+ it :scan do
79
+ result =ThreadModel.expression("ForumName = :name").bind_values(name: "DynamoDB").all
80
+ expect(result.count).to eq(2)
81
+ end
82
+ it :query do
83
+ result =ThreadModel.where(ForumName: "DynamoDB").filter_expression("contains(#column, :number)")
84
+ .bind_names(column: "Subject")
85
+ .bind_values(number: "Thread 1").all
86
+ expect(result.count).to eq(1)
87
+ end
88
+ end
89
+
90
+ describe :conditions do
91
+ describe :time do
92
+ it :== do
93
+ time = Time.parse("2011-12-11T00:40:57.165Z")
94
+ result = ReplyModel.add_filter(:ReplyDateTime, :eq, time.iso8601(3)).all
95
+ expect(result.count).to eq(1)
96
+ end
97
+ it :> do
98
+ time = Time.parse("2011-12-11T00:40:57.165Z")
99
+ result = ReplyModel.add_filter(:ReplyDateTime, :gt, time.iso8601(3)).all
100
+ expect(result.count).to eq(4)
101
+ end
102
+ it :>= do
103
+ time = Time.parse("2011-12-11T00:40:57.165Z")
104
+ result = ReplyModel.add_filter(:ReplyDateTime, :ge, time.iso8601(3)).all
105
+ expect(result.count).to eq(5)
106
+ end
107
+ it :< do
108
+ time = Time.parse("2012-01-03T00:40:57.165Z")
109
+ result = ReplyModel.add_filter(:ReplyDateTime, :lt, time.iso8601(3)).all
110
+ expect(result.count).to eq(4)
111
+ end
112
+ it :<= do
113
+ time = Time.parse("2012-01-03T00:40:57.165Z")
114
+ result = ReplyModel.add_filter(:ReplyDateTime, :le, time.iso8601(3)).all
115
+ expect(result.count).to eq(5)
116
+ end
117
+ it :<= do
118
+ time = Time.parse("2012-01-03T00:40:57.165Z")
119
+ result = ReplyModel.add_filter(:ReplyDateTime, :le, time.iso8601(3)).all
120
+ expect(result.count).to eq(5)
121
+ end
122
+ it :null do
123
+ result = ThreadModel.add_filter(:Hoge, :null).all
124
+ expect(result.count).to eq(3)
125
+ end
126
+ it :not_null do
127
+ result = ThreadModel.add_filter(:Hoge, :not_null).all
128
+ expect(result.count).to eq(0)
129
+ end
130
+ end
131
+ end
75
132
  end
76
133
  it :one do
77
134
  result = ThreadModel.where(ForumName: "DynamoDB").desc.one
@@ -141,7 +198,7 @@ describe 'query' do
141
198
  describe :delete do
142
199
  it 'del' do
143
200
  model = TestModelSaveItem.find('piyo')
144
- expect(model.add_expected(:param1,:eq,103).delete.class).to eq(TestModelSaveItem)
201
+ expect(model.add_expected(:param1, :eq, 103).delete.class).to eq(TestModelSaveItem)
145
202
  expect(TestModelSaveItem.find('piyo')).to eq(nil)
146
203
  end
147
204
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dymos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - hoshina85
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-14 00:00:00.000000000 Z
11
+ date: 2014-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -148,6 +148,7 @@ files:
148
148
  - lib/dymos/query/delete_item.rb
149
149
  - lib/dymos/query/describe.rb
150
150
  - lib/dymos/query/get_item.rb
151
+ - lib/dymos/query/parameter/filter_expression.rb
151
152
  - lib/dymos/query/put_item.rb
152
153
  - lib/dymos/query/query.rb
153
154
  - lib/dymos/query/scan.rb