dymos 0.2.2 → 0.2.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.
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