dynamodb-api 0.4.2 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3497adfb9b42e61ab127deb44c26834aff181ebe8a12e2842a49f4548f87b844
4
- data.tar.gz: 9bdbb77d400193f402ae5e02502d2cd02ef39eee12f0455325b1f0bd1673c930
3
+ metadata.gz: 1176f23f9b8202950b14fb9f093a89a0e8a71408b07d1eee64e1cfa2f4771f68
4
+ data.tar.gz: '018fe530f3c0df9d3f025154569dd1958b476e1d84051b01091c4dd7f5337c9b'
5
5
  SHA512:
6
- metadata.gz: ab22702e4ee21d4471a499a743bd99f15e9a2e231adbce737db77feb1c405e18ceed4ab833f602b135051a7fede6f5b1bd85ca7caba736bc5b88cb031e827999
7
- data.tar.gz: 070f875b3e41688a0840ec506a3f12b04127e59d0dec90d2102e50abad14cdd742a6fccc7b274813065b9226330dc13f176d02c7144d586a57603c9df2c9d4a6
6
+ metadata.gz: c4da7e234eeff907f7382187281794ae788c57312b3e5d35c2ee9f7b4c2c686153d7111fa8b3633012c5dc6248c7cd41abb5e93ebf094e9d23dfd71a7cd5f270
7
+ data.tar.gz: 2a3e960e5d73b46d989ae006f18ecf8c4d5837b1e52d478f0b64c55ea608a04a5e7e3ccb9857e3839525629c9a6b906dc070f9ddcbb307638c5a64a421cd8aa3
data/.gitignore CHANGED
@@ -10,3 +10,15 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+
14
+ .DS_Store
15
+ .ruby-version
16
+ Gemfile.lock
17
+
18
+ # For Ctags
19
+ tags
20
+
21
+ # For Appraisals
22
+ gemfiles/*.gemfile.lock
23
+ gemfiles/.bundle/*
24
+ gemfiles/vendor/*
data/.travis.yml CHANGED
@@ -4,6 +4,10 @@ rvm:
4
4
  - 2.3
5
5
  - 2.4
6
6
  - 2.5
7
+ gemfile:
8
+ - gemfiles/aws_sdk_2.gemfile
9
+ - gemfiles/aws_sdk_3.gemfile
10
+
7
11
  before_install: gem install bundler -v 1.16.2
8
12
 
9
13
  before_script:
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise "aws-sdk-2" do
2
+ gem "aws-sdk", "~> 2"
3
+ end
4
+
5
+ appraise "aws-sdk-3" do
6
+ gem "aws-sdk", "~> 3"
7
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.5.0] - 2018-09-30
8
+ ### Added
9
+ - [#21](https://github.com/walkersumida/dynamodb-api/pull/21) Automatically add Expression Attribute Names
10
+
11
+ ### Removed
12
+ - [#21](https://github.com/walkersumida/dynamodb-api/pull/21) `ex_attr` method
data/README.md CHANGED
@@ -50,12 +50,12 @@ e.g.
50
50
 
51
51
  cars table.
52
52
 
53
- | maker_id(Partition key) | model | release_date(Sort key) |
54
- |:---|:---|:---|
55
- |1 |Accord |0.19760508e8 |
56
- |2 |CROWN |0.19550101e8 |
57
- |3 |Model S |0.20120601e8 |
58
- |1 |S2000 |0.19980101e8 |
53
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
54
+ |:---|:---|:---|:---|
55
+ |1 |Accord |0.19760508e8 |0 |
56
+ |2 |CROWN |0.19550101e8 |0 |
57
+ |3 |Model S |0.20120601e8 |0 |
58
+ |1 |S2000 |0.19980101e8 |1 |
59
59
 
60
60
  ### Query
61
61
  https://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#query-instance_method
@@ -69,10 +69,10 @@ query.from('cars').index('index_maker_id_release_date').
69
69
  items = query.all.items
70
70
  ```
71
71
 
72
- | maker_id | model | release_date |
73
- |:---|:---|:---|
74
- |1 |S2000 |0.19980101e8 |
75
- |1 |Accord |0.19760508e8 |
72
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
73
+ |:---|:---|:---|:---|
74
+ |1 |S2000 |0.19980101e8 |1 |
75
+ |1 |Accord |0.19760508e8 |0 |
76
76
 
77
77
  #### Partition key and Sort(Range) key
78
78
 
@@ -83,9 +83,9 @@ query.from('cars').index('index_maker_id_release_date').
83
83
  items = query.all.items
84
84
  ```
85
85
 
86
- | maker_id | model | release_date |
87
- |:---|:---|:---|
88
- |1 |S2000 |0.19980101e8 |
86
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
87
+ |:---|:---|:---|:---|
88
+ |1 |S2000 |0.19980101e8 |1 |
89
89
 
90
90
  #### Sorting
91
91
 
@@ -97,10 +97,10 @@ query.from('cars').index('index_maker_id_release_date').
97
97
  items = query.all.items
98
98
  ```
99
99
 
100
- | maker_id | model | release_date |
101
- |:---|:---|:---|
102
- |1 |Accord |0.19760508e8 |
103
- |1 |S2000 |0.19980101e8 |
100
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
101
+ |:---|:---|:---|:---|
102
+ |1 |Accord |0.19760508e8 |0 |
103
+ |1 |S2000 |0.19980101e8 |1 |
104
104
 
105
105
  #### Filter
106
106
 
@@ -112,9 +112,9 @@ query.from('cars').index('index_maker_id_release_date').
112
112
  items = query.all.items
113
113
  ```
114
114
 
115
- | maker_id | model | release_date |
116
- |:---|:---|:---|
117
- |1 |S2000 |0.19980101e8 |
115
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
116
+ |:---|:---|:---|:---|
117
+ |1 |S2000 |0.19980101e8 |1 |
118
118
 
119
119
  #### Limit
120
120
 
@@ -127,15 +127,38 @@ query.from('cars').index('index_maker_id_release_date').
127
127
  items = query.all.items
128
128
  ```
129
129
 
130
- | maker_id | model | release_date |
131
- |:---|:---|:---|
132
- |1 |Accord |0.19760508e8 |
130
+ | maker_id(Partition key) | model | release_date(Sort key) | status |
131
+ |:---|:---|:---|:---|
132
+ |1 |Accord |0.19760508e8 |0 |
133
+
134
+ #### Expression Attribute Names
135
+
136
+ Words reserved in DynamoDB can not be used without special processing.
137
+ In `dynamodb-api` , you can omit the special processing by putting `#` at the beginning of the word.
138
+ Refer to the list of reserved words from [here](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html).
139
+
140
+ ```ruby
141
+ query = Dynamodb::Api::Query.new
142
+ query.from('cars').index('index_maker_id_release_date').
143
+ where(['maker_id', '=', 1]).
144
+ filter('#status = :status', ':status': 1)
145
+ items = query.all.items
146
+ ```
147
+
148
+ | maker_id | model | release_date | status |
149
+ |:---|:---|:---|:---|
150
+ |1 |S2000 |0.19980101e8 |1 |
151
+
152
+ If you don't add `#` to a reserved word, the following error will occur:
153
+
154
+ Aws::DynamoDB::Errors::ValidationException:
155
+ Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: [reserved word]
133
156
 
134
157
  ## Development
135
158
 
136
159
  - Run `docker-compose up` to run the dynamodb_local.
137
160
  - After checking out the repo, run `bin/setup` to install dependencies.
138
- - Run `rake spec` to run the tests.
161
+ - Run `bundle exec rake spec` to run the tests. Or run `bundle exec appraisal aws-sdk-* rake spec` to run the tests. Replase `*` with aws sdk major version.
139
162
  - You can also run `bin/console` for an interactive prompt that will allow you to experiment.
140
163
 
141
164
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
data/dynamodb-api.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_runtime_dependency 'aws-sdk', '~> 2'
25
+ spec.add_runtime_dependency 'aws-sdk', '>= 2'
26
26
  spec.add_runtime_dependency('activesupport', '>= 4')
27
27
 
28
28
  spec.add_development_dependency 'bundler', '~> 1.16'
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'rspec', '~> 3.0'
31
31
  spec.add_development_dependency 'pry'
32
32
  spec.add_development_dependency 'rubocop-airbnb'
33
+ spec.add_development_dependency 'appraisal'
33
34
  end
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "pry-byebug", platforms: :ruby
6
+ gem "aws-sdk", "~> 2"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "pry-byebug", platforms: :ruby
6
+ gem "aws-sdk", "~> 3"
7
+
8
+ gemspec path: "../"
data/lib/dynamodb/api.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'aws-sdk'
2
2
  require 'active_support'
3
+ require 'active_support/core_ext'
3
4
 
4
5
  require 'dynamodb/api/version'
5
6
  require 'dynamodb/api/config'
@@ -14,20 +14,22 @@ module Dynamodb
14
14
  private
15
15
 
16
16
  def build_query
17
- build_params = {
18
- table_name: from_clause.name,
19
- index_name: index_clause.name,
20
- key_conditions: where_clause.key_conditions,
21
- }.merge(build_filter_clause)
17
+ build_params = base_params.merge(build_filter_clause)
22
18
  build_params[:scan_index_forward] = order_direct(order_clause)
23
19
  build_params[:select] = select_name(select_clause)
24
- if expression_attribute&.names
25
- build_params[:expression_attribute_names] = expression_attribute.names
26
- end
20
+ build_expression_attribute_names(build_params)
27
21
  build_params[:limit] = limit_clause.number if limit_clause&.number
28
22
  build_params
29
23
  end
30
24
 
25
+ def base_params
26
+ {
27
+ table_name: from_clause.name,
28
+ index_name: index_clause.name,
29
+ key_conditions: where_clause.key_conditions,
30
+ }
31
+ end
32
+
31
33
  def order_direct(clause)
32
34
  clause&.direct ? clause.direct : OrderClause.new.direct
33
35
  end
@@ -37,12 +39,21 @@ module Dynamodb
37
39
  end
38
40
 
39
41
  def build_filter_clause
40
- return {} unless filter_clause&.expression
42
+ return {} if filter_clause&.expression.blank?
41
43
  {
42
44
  filter_expression: filter_clause.expression,
43
45
  expression_attribute_values: filter_clause.values,
44
46
  }
45
47
  end
48
+
49
+ def build_expression_attribute_names(params)
50
+ if filter_clause&.reserved_words.present?
51
+ expression_attribute.add(filter_clause.reserved_words)
52
+ end
53
+ if expression_attribute.names.present?
54
+ params[:expression_attribute_names] = expression_attribute.names
55
+ end
56
+ end
46
57
  end
47
58
  end
48
59
  end
@@ -12,8 +12,16 @@ module Dynamodb
12
12
  attr_accessor :order_clause
13
13
  attr_accessor :where_clause
14
14
  attr_accessor :filter_clause
15
- attr_accessor :expression_attribute
15
+ attr_accessor :attr_expression_attribute
16
16
  attr_accessor :limit_clause
17
+
18
+ def expression_attribute
19
+ if attr_expression_attribute.nil?
20
+ self.attr_expression_attribute = Relation::ExpressionAttributeNames.new
21
+ else
22
+ attr_expression_attribute
23
+ end
24
+ end
17
25
  end
18
26
  end
19
27
  end
@@ -4,10 +4,43 @@ module Dynamodb
4
4
  module Api
5
5
  module Relation
6
6
  class ExpressionAttributeNames
7
- attr_reader :names
7
+ attr_accessor :names
8
8
 
9
- def initialize(names)
10
- @names = names
9
+ def initialize(names = {})
10
+ self.names = {}
11
+
12
+ case names.class.to_s
13
+ when 'String'
14
+ add(names)
15
+ when 'Array'
16
+ names.each do |name|
17
+ add(name)
18
+ end
19
+ when 'Hash'
20
+ self.names = names
21
+ else
22
+ raise "#{names.class} is not support"
23
+ end
24
+ end
25
+
26
+ def add(names)
27
+ _names = formatting(names)
28
+ self.names.merge!(_names)
29
+ end
30
+
31
+ private
32
+
33
+ def formatting(names)
34
+ _names = names.is_a?(Array) ? names : [names]
35
+ _names.each_with_object({}) do |name, hash|
36
+ next hash[name.to_sym] = remove_hash_tag(name) if name.is_a?(String)
37
+ next hash.merge!(name) if name.is_a?(Hash)
38
+ raise "#{name.class} is not support"
39
+ end
40
+ end
41
+
42
+ def remove_hash_tag(name)
43
+ name.gsub(/\#/, '')
11
44
  end
12
45
  end
13
46
  end
@@ -6,10 +6,18 @@ module Dynamodb
6
6
  class FilterClause # :nodoc:
7
7
  attr_reader :expression
8
8
  attr_reader :values
9
+ attr_reader :reserved_words
9
10
 
10
11
  def initialize(expression, values)
11
12
  @expression = expression
12
13
  @values = values
14
+ @reserved_words = extract_reserved_words(@expression)
15
+ end
16
+
17
+ private
18
+
19
+ def extract_reserved_words(expression)
20
+ expression.scan(/\#\w+/)
13
21
  end
14
22
  end
15
23
  end
@@ -34,11 +34,6 @@ module Dynamodb
34
34
  self
35
35
  end
36
36
 
37
- def ex_attr(names)
38
- self.expression_attribute = Relation::ExpressionAttributeNames.new(names)
39
- self
40
- end
41
-
42
37
  def limit(value)
43
38
  self.limit_clause = Relation::LimitClause.new(value)
44
39
  self
@@ -1,5 +1,5 @@
1
1
  module Dynamodb
2
2
  module Api
3
- VERSION = '0.4.2'.freeze
3
+ VERSION = '0.5.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamodb-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - WalkerSumida
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-15 00:00:00.000000000 Z
11
+ date: 2018-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
27
  - !ruby/object:Gem::Dependency
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: appraisal
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  description: aws dynamodb api
112
126
  email:
113
127
  - walkersumida@gmail.com
@@ -121,9 +135,10 @@ files:
121
135
  - ".rubocop.yml"
122
136
  - ".rubocop_todo.yml"
123
137
  - ".travis.yml"
138
+ - Appraisals
139
+ - CHANGELOG.md
124
140
  - CODE_OF_CONDUCT.md
125
141
  - Gemfile
126
- - Gemfile.lock
127
142
  - LICENSE.txt
128
143
  - README.md
129
144
  - Rakefile
@@ -131,6 +146,8 @@ files:
131
146
  - bin/setup
132
147
  - docker-compose.yml
133
148
  - dynamodb-api.gemspec
149
+ - gemfiles/aws_sdk_2.gemfile
150
+ - gemfiles/aws_sdk_3.gemfile
134
151
  - lib/dynamodb/api.rb
135
152
  - lib/dynamodb/api/adapter.rb
136
153
  - lib/dynamodb/api/config.rb
data/Gemfile.lock DELETED
@@ -1,92 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- dynamodb-api (0.4.2)
5
- activesupport (>= 4)
6
- aws-sdk (~> 2)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- activesupport (5.2.0)
12
- concurrent-ruby (~> 1.0, >= 1.0.2)
13
- i18n (>= 0.7, < 2)
14
- minitest (~> 5.1)
15
- tzinfo (~> 1.1)
16
- ast (2.4.0)
17
- aws-sdk (2.11.93)
18
- aws-sdk-resources (= 2.11.93)
19
- aws-sdk-core (2.11.93)
20
- aws-sigv4 (~> 1.0)
21
- jmespath (~> 1.0)
22
- aws-sdk-resources (2.11.93)
23
- aws-sdk-core (= 2.11.93)
24
- aws-sigv4 (1.0.3)
25
- byebug (10.0.2)
26
- coderay (1.1.2)
27
- concurrent-ruby (1.0.5)
28
- diff-lcs (1.3)
29
- i18n (1.0.1)
30
- concurrent-ruby (~> 1.0)
31
- jaro_winkler (1.5.1)
32
- jmespath (1.4.0)
33
- method_source (0.9.0)
34
- minitest (5.11.3)
35
- parallel (1.12.1)
36
- parser (2.5.1.2)
37
- ast (~> 2.4.0)
38
- powerpack (0.1.2)
39
- pry (0.11.3)
40
- coderay (~> 1.1.0)
41
- method_source (~> 0.9.0)
42
- pry-byebug (3.6.0)
43
- byebug (~> 10.0)
44
- pry (~> 0.10)
45
- rainbow (3.0.0)
46
- rake (10.5.0)
47
- rspec (3.7.0)
48
- rspec-core (~> 3.7.0)
49
- rspec-expectations (~> 3.7.0)
50
- rspec-mocks (~> 3.7.0)
51
- rspec-core (3.7.1)
52
- rspec-support (~> 3.7.0)
53
- rspec-expectations (3.7.0)
54
- diff-lcs (>= 1.2.0, < 2.0)
55
- rspec-support (~> 3.7.0)
56
- rspec-mocks (3.7.0)
57
- diff-lcs (>= 1.2.0, < 2.0)
58
- rspec-support (~> 3.7.0)
59
- rspec-support (3.7.1)
60
- rubocop (0.57.2)
61
- jaro_winkler (~> 1.5.1)
62
- parallel (~> 1.10)
63
- parser (>= 2.5)
64
- powerpack (~> 0.1)
65
- rainbow (>= 2.2.2, < 4.0)
66
- ruby-progressbar (~> 1.7)
67
- unicode-display_width (~> 1.0, >= 1.0.1)
68
- rubocop-airbnb (1.5.0)
69
- rubocop (= 0.57.2)
70
- rubocop-rspec (= 1.27.0)
71
- rubocop-rspec (1.27.0)
72
- rubocop (>= 0.56.0)
73
- ruby-progressbar (1.10.0)
74
- thread_safe (0.3.6)
75
- tzinfo (1.2.5)
76
- thread_safe (~> 0.1)
77
- unicode-display_width (1.4.0)
78
-
79
- PLATFORMS
80
- ruby
81
-
82
- DEPENDENCIES
83
- bundler (~> 1.16)
84
- dynamodb-api!
85
- pry
86
- pry-byebug
87
- rake (~> 10.0)
88
- rspec (~> 3.0)
89
- rubocop-airbnb
90
-
91
- BUNDLED WITH
92
- 1.16.2