dymos 0.1.4 → 0.2.0

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -2
  3. data/lib/dymos/client.rb +16 -0
  4. data/lib/dymos/config.rb +34 -0
  5. data/lib/dymos/model.rb +109 -26
  6. data/lib/dymos/persistence.rb +75 -16
  7. data/lib/dymos/query/base.rb +23 -0
  8. data/lib/dymos/query/create_table.rb +72 -0
  9. data/lib/dymos/query/delete_item.rb +60 -32
  10. data/lib/dymos/query/describe.rb +3 -5
  11. data/lib/dymos/query/get_item.rb +30 -9
  12. data/lib/dymos/query/put_item.rb +67 -41
  13. data/lib/dymos/query/query.rb +112 -26
  14. data/lib/dymos/query/scan.rb +85 -12
  15. data/lib/dymos/query/update_item.rb +97 -50
  16. data/lib/dymos/version.rb +1 -1
  17. data/lib/dymos.rb +6 -4
  18. data/spec/lib/dymos/client_spec.rb +4 -0
  19. data/spec/lib/dymos/config_spec.rb +11 -0
  20. data/spec/lib/dymos/data.yml +154 -0
  21. data/spec/lib/dymos/model_spec.rb +23 -29
  22. data/spec/lib/dymos/query/create_table_spec.rb +56 -0
  23. data/spec/lib/dymos/query/delete_item_spec.rb +22 -79
  24. data/spec/lib/dymos/query/describe_spec.rb +6 -40
  25. data/spec/lib/dymos/query/get_item_spec.rb +8 -47
  26. data/spec/lib/dymos/query/put_item_spec.rb +45 -301
  27. data/spec/lib/dymos/query/query_spec.rb +45 -95
  28. data/spec/lib/dymos/query/scan_spec.rb +49 -43
  29. data/spec/lib/dymos/query/update_item_spec.rb +36 -113
  30. data/spec/lib/dymos/query_spec.rb +150 -0
  31. data/spec/spec_helper.rb +33 -0
  32. metadata +16 -12
  33. data/lib/dymos/command.rb +0 -36
  34. data/lib/dymos/query/attribute.rb +0 -14
  35. data/lib/dymos/query/builder.rb +0 -79
  36. data/lib/dymos/query/expect.rb +0 -65
  37. data/spec/lib/dymos/query/attribute_spec.rb +0 -15
  38. data/spec/lib/dymos/query/builder_spec.rb +0 -23
  39. data/spec/lib/dymos/query/expect_spec.rb +0 -5
@@ -1,18 +1,39 @@
1
1
  module Dymos
2
2
  module Query
3
- class GetItem < ::Dymos::Query::Builder
3
+ class GetItem < Base
4
4
 
5
- def key(params)
6
- @key = params
5
+ def command
6
+ 'get_item'
7
+ end
8
+
9
+ def key(value)
10
+ @query[:key] = value.deep_stringify_keys
11
+ self
12
+ end
13
+
14
+ def attributes(*value)
15
+ @query[:attributes_to_get] = value
16
+ self
17
+ end
18
+
19
+ def consistent_read(value)
20
+ @query[:consistent_read] = value
7
21
  self
8
22
  end
9
23
 
10
- def query
11
- {
12
- table_name: @table_name.to_s,
13
- key: @key,
14
- consistent_read: true,
15
- }
24
+ def return_consumed_capacity(value)
25
+ @query[:return_consumed_capacity] = value.to_s.upcase
26
+ self
27
+ end
28
+
29
+ def projection_expression(value)
30
+ @query[:projection_expression] = value
31
+ self
32
+ end
33
+
34
+ def expression_attribute_names(value)
35
+ @query[:expression_attribute_names] = value.deep_stringify_keys
36
+ self
16
37
  end
17
38
  end
18
39
  end
@@ -1,48 +1,74 @@
1
1
  module Dymos
2
2
  module Query
3
- class PutItem < ::Dymos::Query::Builder
4
-
5
- def item(params)
6
- @item = params
7
- self
8
- end
9
-
10
- def expected(params)
11
- @expected = Hash[params.map do |name, expression|
12
- operator, values = expression.split(' ', 2)
13
- if values.nil?
14
- value1 = operator
15
- [name, ::Dymos::Query::Expect.new.condition(operator, nil).data]
16
- else
17
- value1, value2 = values.split(' ')
18
- if value2.present?
19
- [name, ::Dymos::Query::Expect.new.condition(operator, values).data]
20
- else
21
- [name, ::Dymos::Query::Expect.new.condition(operator, value1).data]
22
- end
23
- end
24
-
25
- end]
26
- self
27
- end
28
-
29
- def query
30
- data = {
31
- table_name: @table_name.to_s,
32
- item: @item,
33
- return_values: @return_values || 'ALL_OLD',
34
- # return_consumed_capacity: @return_consumed_capacity || 'TOTAL',
35
- # return_item_collection_metrics: @return_item_collection_metrics || 'SIZE',
36
- }
37
-
38
- if @expected.present?
39
- data[:expected] = @expected
40
- if @expected.size > 1
41
- data[:conditional_operator] = @conditional_operator || 'AND'
42
- end
3
+ class PutItem < Base
4
+ def command
5
+ 'put_item'
6
+ end
7
+
8
+ def item(value)
9
+ @query[:item] = value.deep_stringify_keys
10
+ self
11
+ end
12
+
13
+ def expected(value)
14
+ value.map { |v| add_expected(*v) }
15
+ self
16
+ end
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
43
23
  end
44
- data
24
+ @query[:expected] ||= {}
25
+ @query[:expected].store(*_add_expected(column, operator, value))
26
+ self
27
+ end
28
+
29
+ def _add_expected(column, operator, value)
30
+ [column.to_s, {
31
+ attribute_value_list: ([:BETWEEN, :IN].include? operator) ? [*value] : [value],
32
+ comparison_operator: operator.to_s.upcase
33
+ }
34
+ ]
35
+ end
36
+
37
+ def return_values(value)
38
+ @query[:return_values] = value.to_s.upcase
39
+ self
40
+ end
41
+
42
+ def return_consumed_capacity(value)
43
+ @query[:return_consumed_capacity] = value.to_s.upcase
44
+ self
45
45
  end
46
+
47
+ def return_item_collection_metrics(value)
48
+ @query[:return_item_collection_metrics] = value.to_s.upcase
49
+ self
50
+ end
51
+
52
+ def conditional_operator(value)
53
+ @query[:conditional_operator] = value.to_s.upcase
54
+ self
55
+ end
56
+
57
+ def condition_expression(value)
58
+ @query[:condition_expression] = value
59
+ self
60
+ end
61
+
62
+ def expression_attribute_names(value)
63
+ @query[:expression_attribute_names] = value.deep_stringify_keys
64
+ self
65
+ end
66
+
67
+ def expression_attribute_values(value)
68
+ @query[:expression_attribute_values] = value.deep_stringify_keys
69
+ self
70
+ end
71
+
46
72
  end
47
73
  end
48
74
  end
@@ -1,40 +1,126 @@
1
1
  module Dymos
2
2
  module Query
3
- class Query < ::Dymos::Query::Builder
3
+ class Query < Base
4
4
 
5
- def key_conditions(params)
6
- @key = Hash[params.map do |name, expression|
7
- operator, values = expression.split(' ', 2)
8
- if values.nil?
9
- [name, ::Dymos::Query::Expect.new.condition(operator, nil).data(true)]
10
- else
11
- value1, value2 = values.split(' ')
12
- if value2.present?
13
- [name, ::Dymos::Query::Expect.new.condition(operator, values).data(true)]
14
- else
15
- [name, ::Dymos::Query::Expect.new.condition(operator, value1).data(true)]
16
- end
17
- end
5
+ def command
6
+ 'query'
7
+ end
8
+
9
+ def index(value)
10
+ @query[:index_name] = value.to_s
11
+ self
12
+ end
13
+
14
+ def attributes(*value)
15
+ @query[:attributes_to_get] = value
16
+ self
17
+ end
18
+
19
+ def limit(value)
20
+ @query[:limit] = value
21
+ self
22
+ end
23
+
24
+ def consistent_read(value)
25
+ @query[:consistent_read] = value
26
+ self
27
+ end
18
28
 
19
- end]
29
+ def where(*value)
30
+ if value.count == 1 && value[0].is_a?(Hash)
31
+ value[0].each { |k, v| add_conditions(k, :eq, v) }
32
+ else
33
+ value.each { |v| add_conditions(*v) }
34
+ end
20
35
  self
21
36
  end
22
37
 
23
- def index_name(name)
24
- @index_name =name
38
+ def conditions(value)
39
+ value.map { |v| add_conditions(*v) }
25
40
  self
26
41
  end
27
42
 
28
- def query
29
- data = {
30
- table_name: @table_name.to_s,
31
- key_conditions: @key,
32
- consistent_read: false
33
- }
34
- if @index_name.present?
35
- data[:index_name] = @index_name.to_s
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
36
48
  end
37
- data
49
+ @query[:key_conditions] ||= {}
50
+ @query[:key_conditions].store(*_add_filter(column, operator, value))
51
+ self
52
+ end
53
+
54
+
55
+ def comparison_operator(value)
56
+ @query[:comparison_operator] = value.to_s.upcase
57
+ self
58
+ end
59
+
60
+ def filter(value, operator='AND')
61
+ value.map { |v| add_filter(*v) }
62
+ filter_operator operator.to_s.upcase if value.count > 1
63
+ self
64
+ end
65
+
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
72
+ @query[:query_filter] ||= {}
73
+ @query[:query_filter].store(*_add_filter(column, operator, value))
74
+ filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:query_filter].count > 1
75
+ self
76
+ end
77
+
78
+ def _add_filter(column, operator, value)
79
+ [column.to_s, {
80
+ attribute_value_list: [*value],
81
+ comparison_operator: operator.to_s.upcase
82
+ }
83
+ ]
84
+ end
85
+
86
+ def filter_operator(value)
87
+ @query[:conditional_operator] = value.to_s.upcase
88
+ self
89
+ end
90
+
91
+ def asc
92
+ scan_index_forward true
93
+ end
94
+
95
+ def desc
96
+ scan_index_forward false
97
+ end
98
+
99
+ def scan_index_forward(value)
100
+ @query[:scan_index_forward] = value
101
+ self
102
+ end
103
+
104
+ def exclusive_start_key(value)
105
+ @query[:exclusive_start_key] = value.deep_stringify_keys
106
+ self
107
+ end
108
+
109
+ alias :start_key :exclusive_start_key
110
+
111
+ def return_consumed_capacity(value)
112
+ @query[:return_consumed_capacity] = value.to_s.upcase
113
+ self
114
+ end
115
+
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
38
124
  end
39
125
  end
40
126
  end
@@ -1,25 +1,98 @@
1
1
  module Dymos
2
2
  module Query
3
- class Scan < ::Dymos::Query::Builder
3
+ class Scan < Base
4
+ def command
5
+ 'scan'
6
+ end
7
+
8
+ def attributes(*value)
9
+ @query[:attributes_to_get] = value
10
+ self
11
+ end
12
+
13
+ def limit(value)
14
+ @query[:limit] = value
15
+ self
16
+ end
17
+
18
+ def select(value)
19
+ @query[:select] = value
20
+ self
21
+ end
4
22
 
5
- def limit(params)
6
- @limit = params
23
+ def filter(value, operator='AND')
24
+ value.map { |v| add_filter(*v) }
25
+ filter_operator operator.to_s.upcase if value.count > 1
7
26
  self
8
27
  end
9
28
 
10
- def exclusive_start_key(params)
11
- @exclusive_start_key = params
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
35
+ @query[:scan_filter] ||= {}
36
+ @query[:scan_filter].store(*_add_filter(column, operator, value))
37
+ filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:scan_filter].count > 1
12
38
  self
13
39
  end
14
40
 
15
- def query
16
- data = {
17
- table_name: @table_name.to_s,
18
- }
19
- data[:limit] = @limit if @limit.present?
20
- data[:exclusive_start_key] = @exclusive_start_key if @exclusive_start_key.present?
21
- data
41
+ def _add_filter(column, operator, value)
42
+ [column.to_s, {
43
+ attribute_value_list: [*value],
44
+ comparison_operator: operator.to_s.upcase
45
+ }
46
+ ]
47
+ end
48
+
49
+ def filter_operator(value)
50
+ @query[:conditional_operator] = value.to_s.upcase
51
+ self
52
+ end
53
+
54
+ def exclusive_start_key(value)
55
+ @query[:exclusive_start_key] = value.deep_stringify_keys
56
+ self
57
+ end
58
+
59
+ alias :start_key :exclusive_start_key
60
+
61
+ def return_consumed_capacity(value)
62
+ @query[:return_consumed_capacity] = value.to_s.upcase
63
+ self
22
64
  end
65
+
66
+ def total_segments(value)
67
+ @query[:total_segments] = value
68
+ self
69
+ end
70
+
71
+ def segment(value)
72
+ @query[:segment] = value
73
+ self
74
+ end
75
+
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
+
23
96
  end
24
97
  end
25
98
  end
@@ -1,72 +1,119 @@
1
1
  module Dymos
2
2
  module Query
3
- class UpdateItem < ::Dymos::Query::Builder
3
+ class UpdateItem < Base
4
+ def command
5
+ 'update_item'
6
+ end
4
7
 
5
- # @param [String] name
6
- # @return [self]
7
- def key(name)
8
- @key = name
8
+ def key(value)
9
+ @query[:key] = value.deep_stringify_keys
9
10
  self
10
11
  end
11
12
 
12
- # @param [Hash] param
13
- # @param [String] action
14
- # @return [self]
15
- def attribute_updates(param, action="put")
16
- @attribute_updates||={}
17
- param.each { |key, value|
18
- @attribute_updates[key] = {
19
- value: value,
20
- action: action.upcase
21
- }
22
- }
13
+ def add(column, value)
14
+ add_attribute_updates(column, :add, value)
23
15
  self
24
16
  end
25
17
 
26
- # @param [Hash] params
27
- # @return [self]
28
- def expected(params)
29
- @expected = Hash[params.map do |name, expression|
30
- operator, values = expression.split(' ', 2)
31
- if values.nil?
32
- [name, ::Dymos::Query::Expect.new.condition(operator, nil).data]
33
- else
34
- value1, value2 = values.split(' ')
35
- if value2.present?
36
- [name, ::Dymos::Query::Expect.new.condition(operator, values).data]
37
- else
38
- [name, ::Dymos::Query::Expect.new.condition(operator, value1).data]
39
- end
40
- end
18
+ def put(column, value)
19
+ add_attribute_updates(column, :put, value)
20
+ self
21
+ end
41
22
 
42
- end]
23
+ def delete(column, value)
24
+ add_attribute_updates(column, :delete, value)
43
25
  self
44
26
  end
45
27
 
46
- # @param [String] value
47
- # @return [self]
48
- def return_values(value)
49
- @return_values = value.upcase
28
+ def attribute_updates(*value)
29
+ value.map { |v| add_attribute_updates(*v) }
50
30
  self
51
31
  end
52
32
 
53
- # @return [Hash]
54
- def query
55
- data = {
56
- table_name: @table_name.to_s,
57
- key: @key,
58
- attribute_updates: @attribute_updates,
59
- return_values: @return_values || 'ALL_NEW',
60
- }
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
39
+ @query[:attribute_updates] ||= {}
40
+ @query[:attribute_updates].store(*_attribute_updates(column, operator, value))
41
+ self
42
+ end
43
+
44
+ def _attribute_updates(column, action, value)
45
+ [column.to_s, {
46
+ value: value,
47
+ action: action.to_s.upcase
48
+ }
49
+ ]
50
+ end
61
51
 
62
- if @expected.present?
63
- data[:expected] = @expected
64
- if @expected.size > 1
65
- data[:conditional_operator] = @conditional_operator || 'AND'
66
- end
52
+ def expected(value)
53
+ value.map { |v| add_expected(*v) }
54
+ self
55
+ end
56
+
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
67
62
  end
68
- data
63
+ @query[:expected] ||= {}
64
+ @query[:expected].store(*_add_expected(column, operator, value))
65
+ self
66
+ end
67
+
68
+ def _add_expected(column, operator, value)
69
+ [column.to_s, {
70
+ attribute_value_list: ([:BETWEEN, :IN].include? operator) ? [*value] : [value],
71
+ comparison_operator: operator.to_s.upcase
72
+ }
73
+ ]
74
+ end
75
+
76
+ def conditional_operator(value)
77
+ @query[:conditional_operator] = value.to_s.upcase
78
+ self
79
+ end
80
+
81
+
82
+ def return_values(value)
83
+ @query[:return_values] = value.to_s.upcase
84
+ self
85
+ end
86
+
87
+ def return_consumed_capacity(value)
88
+ @query[:return_consumed_capacity] = value.to_s.upcase
89
+ self
90
+ end
91
+
92
+ def return_item_collection_metrics(value)
93
+ @query[:return_item_collection_metrics] = value.to_s.upcase
94
+ self
95
+ end
96
+
97
+ def update_expression(value)
98
+ @query[:update_expression] = value
99
+ self
69
100
  end
101
+
102
+ def condition_expression(value)
103
+ @query[:condition_expression] = value
104
+ self
105
+ end
106
+
107
+ def expression_attribute_names(value)
108
+ @query[:expression_attribute_names] = value.deep_stringify_keys
109
+ self
110
+ end
111
+
112
+ def expression_attribute_values(value)
113
+ @query[:expression_attribute_values] = value.deep_stringify_keys
114
+ self
115
+ end
116
+
70
117
  end
71
118
  end
72
119
  end
data/lib/dymos/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dymos
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/dymos.rb CHANGED
@@ -1,6 +1,7 @@
1
- require "dymos/query/attribute"
2
- require "dymos/query/expect"
3
- require "dymos/query/builder"
1
+ require 'active_support/all'
2
+
3
+ require "dymos/config"
4
+ require "dymos/query/base"
4
5
  require "dymos/query/put_item"
5
6
  require "dymos/query/update_item"
6
7
  require "dymos/query/delete_item"
@@ -8,10 +9,11 @@ require "dymos/query/get_item"
8
9
  require "dymos/query/describe"
9
10
  require "dymos/query/scan"
10
11
  require "dymos/query/query"
12
+ require "dymos/query/create_table"
11
13
  require "dymos/attribute"
12
- require "dymos/command"
13
14
  require "dymos/persistence"
14
15
  require "dymos/model"
16
+ require "dymos/client"
15
17
  require "dymos/version"
16
18
 
17
19
  module Dymos
@@ -0,0 +1,4 @@
1
+ describe Dymos::Client do
2
+
3
+ end
4
+
@@ -0,0 +1,11 @@
1
+ describe Dymos::Config do
2
+ it 'config set' do
3
+ Dymos::Config.default[:update_item]={
4
+ return_values: 'ALL_OLD'
5
+ }
6
+
7
+ expect(Dymos::Config.default[:update_item]).to eq(return_values: 'ALL_OLD')
8
+
9
+ Dymos::Config.default[:update_item]={}
10
+ end
11
+ end