jets 1.4.10 → 1.4.11

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +6 -2
  6. data/lib/jets/application.rb +4 -0
  7. data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -0
  8. data/lib/jets/db.rb +11 -5
  9. data/lib/jets/resource/lambda/function.rb +7 -1
  10. data/lib/jets/version.rb +1 -1
  11. data/lib/jets.rb +0 -7
  12. data/vendor/jets-gems/lib/jets/gems/check.rb +2 -2
  13. metadata +2 -41
  14. data/vendor/dynomite/CHANGELOG.md +0 -45
  15. data/vendor/dynomite/Gemfile +0 -6
  16. data/vendor/dynomite/Gemfile.lock +0 -61
  17. data/vendor/dynomite/README.md +0 -141
  18. data/vendor/dynomite/Rakefile +0 -2
  19. data/vendor/dynomite/bin/console +0 -14
  20. data/vendor/dynomite/bin/setup +0 -8
  21. data/vendor/dynomite/docs/migrations/long-example.rb +0 -123
  22. data/vendor/dynomite/docs/migrations/short-example.rb +0 -40
  23. data/vendor/dynomite/dynomite.gemspec +0 -29
  24. data/vendor/dynomite/lib/dynomite/core.rb +0 -25
  25. data/vendor/dynomite/lib/dynomite/db_config.rb +0 -107
  26. data/vendor/dynomite/lib/dynomite/erb.rb +0 -53
  27. data/vendor/dynomite/lib/dynomite/item.rb +0 -292
  28. data/vendor/dynomite/lib/dynomite/log.rb +0 -15
  29. data/vendor/dynomite/lib/dynomite/migration/common.rb +0 -86
  30. data/vendor/dynomite/lib/dynomite/migration/dsl/base_secondary_index.rb +0 -73
  31. data/vendor/dynomite/lib/dynomite/migration/dsl/global_secondary_index.rb +0 -4
  32. data/vendor/dynomite/lib/dynomite/migration/dsl/local_secondary_index.rb +0 -8
  33. data/vendor/dynomite/lib/dynomite/migration/dsl.rb +0 -194
  34. data/vendor/dynomite/lib/dynomite/migration/executor.rb +0 -38
  35. data/vendor/dynomite/lib/dynomite/migration/generator.rb +0 -68
  36. data/vendor/dynomite/lib/dynomite/migration/templates/create_table.rb +0 -32
  37. data/vendor/dynomite/lib/dynomite/migration/templates/update_table.rb +0 -26
  38. data/vendor/dynomite/lib/dynomite/migration.rb +0 -27
  39. data/vendor/dynomite/lib/dynomite/version.rb +0 -3
  40. data/vendor/dynomite/lib/dynomite.rb +0 -23
  41. data/vendor/dynomite/pkg/dynomite-1.0.8.gem +0 -0
  42. data/vendor/dynomite/pkg/dynomite-1.0.9.gem +0 -0
  43. data/vendor/dynomite/pkg/dynomite-1.1.0.gem +0 -0
  44. data/vendor/dynomite/spec/fixtures/app_root/config/dynamodb.yml +0 -7
  45. data/vendor/dynomite/spec/fixtures/dynamodb/migrate/20190108061826-comments_migration.rb +0 -30
  46. data/vendor/dynomite/spec/lib/dynomite/item_spec.rb +0 -102
  47. data/vendor/dynomite/spec/lib/dynomite/migration/dsl/global_secondary_index_spec.rb +0 -106
  48. data/vendor/dynomite/spec/lib/dynomite/migration/dsl/local_secondary_index_spec.rb +0 -71
  49. data/vendor/dynomite/spec/lib/dynomite/migration/dsl_spec.rb +0 -76
  50. data/vendor/dynomite/spec/lib/dynomite/migration/generator_spec.rb +0 -23
  51. data/vendor/dynomite/spec/lib/dynomite/migration_spec.rb +0 -60
  52. data/vendor/dynomite/spec/spec_helper.rb +0 -110
@@ -1,40 +0,0 @@
1
- class CreateCommentsMigration < Dynomite::Migration
2
- def up
3
- create_table :comments do |t|
4
- t.partition_key "post_id:string" # required
5
- t.sort_key "created_at:string" # optional
6
- t.provisioned_throughput(1) # sets both read and write, defaults to 5 when not set
7
-
8
- t.lsi do |i|
9
- i.partition_key "post_id:string"
10
- i.sort_key "updated_at:string" # required for lsi
11
- i.provisioned_throughput(2)
12
- end
13
-
14
- # t.gsi do |i|
15
- # i.partition_key "post_id:string"
16
- # i.sort_key "deleted_at:string" # optional for gsi
17
- # i.provisioned_throughput(2)
18
- # end
19
- end
20
- end
21
- end
22
-
23
- class UpdateCommentsMigration < Dynomite::Migration
24
- def up
25
- update_table :comments do |t|
26
- t.gsi(:create) do |i|
27
- i.partition_key "post_id:string"
28
- i.sort_key "flagged_at:string" # optional for gsi
29
- i.provisioned_throughput(3)
30
- end
31
-
32
- t.gsi(:update, "update-me-index") do |i|
33
- i.provisioned_throughput(5)
34
- end
35
-
36
- t.gsi(:delete, "delete-me-index")
37
- end
38
- end
39
- end
40
-
@@ -1,29 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "dynomite/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "dynomite"
8
- spec.version = Dynomite::VERSION
9
- spec.authors = ["Tung Nguyen"]
10
- spec.email = ["tongueroo@gmail.com"]
11
-
12
- spec.summary = %q{ActiveRecord-ish Dynamodb Model}
13
- spec.description = %q{ActiveRecord-ish Dynamodb Model}
14
- spec.homepage = "https://github.com/tongueroo/dynomite"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.match(%r{^(test|spec|features)/})
18
- end
19
- spec.bindir = "exe"
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
-
23
- spec.add_dependency "activesupport"
24
- spec.add_dependency "aws-sdk-dynamodb"
25
-
26
- spec.add_development_dependency "bundler"
27
- spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rspec"
29
- end
@@ -1,25 +0,0 @@
1
- require 'logger'
2
-
3
- module Dynomite::Core
4
- # Ensures trailing slash
5
- # Useful for appending a './' in front of a path or leaving it alone.
6
- # Returns: '/path/with/trailing/slash/' or './'
7
- @@app_root = nil
8
- def app_root
9
- return @@app_root if @@app_root
10
- @@app_root = ENV['APP_ROOT'] || ENV['JETS_ROOT'] || ENV['RAILS_ROOT']
11
- @@app_root = '.' if @@app_root.nil? || @app_root == ''
12
- @@app_root = "#{@@app_root}/" unless @@app_root.ends_with?('/')
13
- @@app_root
14
- end
15
-
16
- @@logger = nil
17
- def logger
18
- return @@logger if @@logger
19
- @@logger = Logger.new($stderr)
20
- end
21
-
22
- def logger=(value)
23
- @@logger = value
24
- end
25
- end
@@ -1,107 +0,0 @@
1
- require "aws-sdk-dynamodb"
2
- require 'fileutils'
3
- require 'erb'
4
- require 'yaml'
5
-
6
- module Dynomite::DbConfig
7
- def self.included(base)
8
- base.extend(ClassMethods)
9
- end
10
-
11
- def db
12
- self.class.db
13
- end
14
-
15
- # NOTE: Class including Dynomite::DbConfig is required to have table_name method defined
16
- def namespaced_table_name
17
- [self.class.table_namespace, table_name].reject {|s| s.nil? || s.empty?}.join('-')
18
- end
19
-
20
- module ClassMethods
21
- @@db = nil
22
- def db
23
- return @@db if @@db
24
-
25
- config = db_config
26
- endpoint = ENV['DYNAMODB_ENDPOINT'] || config['endpoint']
27
- check_dynamodb_local!(endpoint)
28
-
29
- # Normally, do not set the endpoint to use the current configured region.
30
- # Probably want to stay in the same region anyway for db connections.
31
- #
32
- # List of regional endpoints: https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region
33
- # Example:
34
- # endpoint: https://dynamodb.us-east-1.amazonaws.com
35
- options = endpoint ? { endpoint: endpoint } : {}
36
- @@db ||= Aws::DynamoDB::Client.new(options)
37
- end
38
-
39
- # When endoint has been configured to point at dynamodb local: localhost:8000
40
- # check if port 8000 is listening and timeout quickly. Or else it takes a
41
- # for DynamoDB local to time out, about 10 seconds...
42
- # This wastes less of the users time.
43
- def check_dynamodb_local!(endpoint)
44
- return unless endpoint && endpoint.include?("8000")
45
-
46
- open = port_open?("127.0.0.1", 8000, 0.2)
47
- unless open
48
- raise "You have configured your app to use DynamoDB local, but it is not running. Please start DynamoDB local. Example: brew cask install dynamodb-local && dynamodb-local"
49
- end
50
- end
51
-
52
- # Thanks: https://gist.github.com/ashrithr/5305786
53
- def port_open?(ip, port, seconds=1)
54
- # => checks if a port is open or not
55
- Timeout::timeout(seconds) do
56
- begin
57
- TCPSocket.new(ip, port).close
58
- true
59
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
60
- false
61
- end
62
- end
63
- rescue Timeout::Error
64
- false
65
- end
66
-
67
- # useful for specs
68
- def db=(db)
69
- @@db = db
70
- end
71
-
72
- def db_config
73
- return @db_config if @db_config
74
-
75
- if defined?(Jets)
76
- config_path = "#{Jets.root}config/dynamodb.yml"
77
- env = Jets.env
78
- else
79
- config_path = ENV['DYNOMITE_CONFIG'] || "./config/dynamodb.yml"
80
- env = ENV['DYNOMITE_ENV'] || "development"
81
- end
82
-
83
- config = YAML.load(Dynomite::Erb.result(config_path))
84
- @db_config ||= config[env] || {}
85
- end
86
-
87
- def table_namespace(*args)
88
- case args.size
89
- when 0
90
- get_table_namespace
91
- when 1
92
- set_table_namespace(args[0])
93
- end
94
- end
95
-
96
- def get_table_namespace
97
- return @table_namespace if defined?(@table_namespace)
98
-
99
- config = db_config
100
- @table_namespace = config['table_namespace']
101
- end
102
-
103
- def set_table_namespace(value)
104
- @table_namespace = value
105
- end
106
- end
107
- end
@@ -1,53 +0,0 @@
1
- require 'erb'
2
-
3
- # Renders Erb and provide better backtrace where there's an error
4
- #
5
- # Usage:
6
- #
7
- # result = Dynomite::Erb.result(path, key1: "val1", key2: "val2")
8
- #
9
- class Dynomite::Erb
10
- include Dynomite::Log
11
-
12
- class << self
13
- def result(path, variables={})
14
- set_template_variables(variables)
15
- template = IO.read(path)
16
- begin
17
- ERB.new(template, nil, "-").result(binding)
18
- rescue Exception => e
19
- log(e)
20
- log(e.backtrace) if ENV['DEBUG']
21
-
22
- # how to know where ERB stopped? - https://www.ruby-forum.com/topic/182051
23
- # syntax errors have the (erb):xxx info in e.message
24
- # undefined variables have (erb):xxx info in e.backtrac
25
- error_info = e.message.split("\n").grep(/\(erb\)/)[0]
26
- error_info ||= e.backtrace.grep(/\(erb\)/)[0]
27
- raise unless error_info # unable to find the (erb):xxx: error line
28
- line = error_info.split(':')[1].to_i
29
- log "Error evaluating ERB template on line #{line.to_s.colorize(:red)} of: #{path.sub(/^\.\//, '').colorize(:green)}"
30
-
31
- template_lines = template.split("\n")
32
- context = 5 # lines of context
33
- top, bottom = [line-context-1, 0].max, line+context-1
34
- spacing = template_lines.size.to_s.size
35
- template_lines[top..bottom].each_with_index do |line_content, index|
36
- line_number = top+index+1
37
- if line_number == line
38
- printf("%#{spacing}d %s\n".colorize(:red), line_number, line_content)
39
- else
40
- printf("%#{spacing}d %s\n", line_number, line_content)
41
- end
42
- end
43
- exit 1 unless ENV['TEST']
44
- end
45
- end
46
-
47
- def set_template_variables(variables)
48
- variables.each do |key, value|
49
- instance_variable_set(:"@#{key}", value)
50
- end
51
- end
52
- end
53
- end
@@ -1,292 +0,0 @@
1
- require "active_support/core_ext/hash"
2
- require "aws-sdk-dynamodb"
3
- require "digest"
4
- require "yaml"
5
-
6
- # The modeling is ActiveRecord-ish but not exactly because DynamoDB is a
7
- # different type of database.
8
- #
9
- # Examples:
10
- #
11
- # post = MyModel.new
12
- # post = post.replace(title: "test title")
13
- #
14
- # post.attrs[:id] now contain a generaetd unique partition_key id.
15
- # Usually the partition_key is 'id'. You can set your own unique id also:
16
- #
17
- # post = MyModel.new(id: "myid", title: "my title")
18
- # post.replace
19
- #
20
- # Note that the replace method replaces the entire item, so you
21
- # need to merge the attributes if you want to keep the other attributes.
22
- #
23
- # post = MyModel.find("myid")
24
- # post.attrs = post.attrs.deep_merge("desc": "my desc") # keeps title field
25
- # post.replace
26
- #
27
- # The convenience `attrs` method performs a deep_merge:
28
- #
29
- # post = MyModel.find("myid")
30
- # post.attrs("desc": "my desc") # <= does a deep_merge
31
- # post.replace
32
- #
33
- # Note, a race condition edge case can exist when several concurrent replace
34
- # calls are happening. This is why the interface is called replace to
35
- # emphasis that possibility.
36
- # TODO: implement post.update with db.update_item in a Ruby-ish way.
37
- #
38
- module Dynomite
39
- class Item
40
- include Log
41
- include DbConfig
42
-
43
- def initialize(attrs={})
44
- @attrs = attrs
45
- end
46
-
47
- # Defining our own reader so we can do a deep merge if user passes in attrs
48
- def attrs(*args)
49
- case args.size
50
- when 0
51
- ActiveSupport::HashWithIndifferentAccess.new(@attrs)
52
- when 1
53
- attributes = args[0] # Hash
54
- if attributes.empty?
55
- ActiveSupport::HashWithIndifferentAccess.new
56
- else
57
- @attrs = attrs.deep_merge!(attributes)
58
- end
59
- end
60
- end
61
-
62
- # Not using method_missing to allow usage of dot notation and assign
63
- # @attrs because it might hide actual missing methods errors.
64
- # DynamoDB attrs can go many levels deep so it makes less make sense to
65
- # use to dot notation.
66
-
67
- # The method is named replace to clearly indicate that the item is
68
- # fully replaced.
69
- def replace(hash={})
70
- attrs = self.class.replace(@attrs.deep_merge(hash))
71
- @attrs = attrs # refresh attrs because it now has the id
72
- end
73
-
74
- def find(id)
75
- self.class.find(id)
76
- end
77
-
78
- def delete
79
- self.class.delete(@attrs[:id]) if @attrs[:id]
80
- end
81
-
82
- def table_name
83
- self.class.table_name
84
- end
85
-
86
- def partition_key
87
- self.class.partition_key
88
- end
89
-
90
- # For render json: item
91
- def as_json(options={})
92
- @attrs
93
- end
94
-
95
- # Longer hand methods for completeness.
96
- # Internallly encourage the shorter attrs method.
97
- def attributes=(attributes)
98
- @attributes = attributes
99
- end
100
-
101
- def attributes
102
- @attributes
103
- end
104
-
105
- # Adds very little wrapper logic to scan.
106
- #
107
- # * Automatically add table_name to options for convenience.
108
- # * Decorates return value. Returns Array of [MyModel.new] instead of the
109
- # dynamodb client response.
110
- #
111
- # Other than that, usage is same was using the dynamodb client scan method
112
- # directly. Example:
113
- #
114
- # MyModel.scan(
115
- # expression_attribute_names: {"#updated_at"=>"updated_at"},
116
- # filter_expression: "#updated_at between :start_time and :end_time",
117
- # expression_attribute_values: {
118
- # ":start_time" => "2010-01-01T00:00:00",
119
- # ":end_time" => "2020-01-01T00:00:00"
120
- # }
121
- # )
122
- #
123
- # AWS Docs examples: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Ruby.04.html
124
- def self.scan(params={})
125
- log("It's recommended to not use scan for production. It can be slow and expensive. You can a LSI or GSI and query the index instead.")
126
- log("Scanning table: #{table_name}")
127
- params = { table_name: table_name }.merge(params)
128
- resp = db.scan(params)
129
- resp.items.map {|i| self.new(i) }
130
- end
131
-
132
- # Adds very little wrapper logic to query.
133
- #
134
- # * Automatically add table_name to options for convenience.
135
- # * Decorates return value. Returns Array of [MyModel.new] instead of the
136
- # dynamodb client response.
137
- #
138
- # Other than that, usage is same was using the dynamodb client query method
139
- # directly. Example:
140
- #
141
- # MyModel.query(
142
- # index_name: 'category-index',
143
- # expression_attribute_names: { "#category_name" => "category" },
144
- # expression_attribute_values: { ":category_value" => "Entertainment" },
145
- # key_condition_expression: "#category_name = :category_value",
146
- # )
147
- #
148
- # AWS Docs examples: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Ruby.04.html
149
- def self.query(params={})
150
- params = { table_name: table_name }.merge(params)
151
- resp = db.query(params)
152
- resp.items.map {|i| self.new(i) }
153
- end
154
-
155
- # Translates simple query searches:
156
- #
157
- # Post.where({category: "Drama"}, index_name: "category-index")
158
- #
159
- # translates to
160
- #
161
- # resp = db.query(
162
- # table_name: "demo-dev-post",
163
- # index_name: 'category-index',
164
- # expression_attribute_names: { "#category_name" => "category" },
165
- # expression_attribute_values: { ":category_value" => category },
166
- # key_condition_expression: "#category_name = :category_value",
167
- # )
168
- #
169
- # TODO: Implement nicer where syntax with index_name as a chained method.
170
- #
171
- # Post.where({category: "Drama"}, {index_name: "category-index"})
172
- # VS
173
- # Post.where(category: "Drama").index_name("category-index")
174
- def self.where(attributes, options={})
175
- raise "attributes.size == 1 only supported for now" if attributes.size != 1
176
-
177
- attr_name = attributes.keys.first
178
- attr_value = attributes[attr_name]
179
-
180
- # params = {
181
- # expression_attribute_names: { "#category_name" => "category" },
182
- # expression_attribute_values: { ":category_value" => "Entertainment" },
183
- # key_condition_expression: "#category_name = :category_value",
184
- # }
185
- name_key, value_key = "##{attr_name}_name", ":#{attr_name}_value"
186
- params = {
187
- expression_attribute_names: { name_key => attr_name },
188
- expression_attribute_values: { value_key => attr_value },
189
- key_condition_expression: "#{name_key} = #{value_key}",
190
- }
191
- # Allow direct access to override params passed to dynamodb query options.
192
- # This is is how index_name is passed:
193
- params = params.merge(options)
194
-
195
- query(params)
196
- end
197
-
198
- def self.replace(attrs)
199
- # Automatically adds some attributes:
200
- # partition key unique id
201
- # created_at and updated_at timestamps. Timestamp format from AWS docs: http://amzn.to/2z98Bdc
202
- defaults = {
203
- partition_key => Digest::SHA1.hexdigest([Time.now, rand].join)
204
- }
205
- item = defaults.merge(attrs)
206
- item["created_at"] ||= Time.now.utc.strftime('%Y-%m-%dT%TZ')
207
- item["updated_at"] = Time.now.utc.strftime('%Y-%m-%dT%TZ')
208
-
209
- # put_item full replaces the item
210
- resp = db.put_item(
211
- table_name: table_name,
212
- item: item
213
- )
214
-
215
- # The resp does not contain the attrs. So might as well return
216
- # the original item with the generated partition_key value
217
- item
218
- end
219
-
220
- def self.find(id)
221
- resp = db.get_item(
222
- table_name: table_name,
223
- key: {partition_key => id}
224
- )
225
- attributes = resp.item # unwraps the item's attributes
226
- self.new(attributes) if attributes
227
- end
228
-
229
- # Two ways to use the delete method:
230
- #
231
- # 1. Specify the key as a String. In this case the key will is the partition_key
232
- # set on the model.
233
- # MyModel.delete("728e7b5df40b93c3ea6407da8ac3e520e00d7351")
234
- #
235
- # 2. Specify the key as a Hash, you can arbitrarily specific the key structure this way
236
- # MyModel.delete("728e7b5df40b93c3ea6407da8ac3e520e00d7351")
237
- #
238
- # options is provided in case you want to specific condition_expression or
239
- # expression_attribute_values.
240
- def self.delete(key_object, options={})
241
- if key_object.is_a?(String)
242
- key = {
243
- partition_key => key_object
244
- }
245
- else # it should be a Hash
246
- key = key_object
247
- end
248
-
249
- params = {
250
- table_name: table_name,
251
- key: key
252
- }
253
- # In case you want to specify condition_expression or expression_attribute_values
254
- params = params.merge(options)
255
-
256
- resp = db.delete_item(params)
257
- end
258
-
259
- # When called with an argument we'll set the internal @partition_key value
260
- # When called without an argument just retun it.
261
- # class Comment < Dynomite::Item
262
- # partition_key "post_id"
263
- # end
264
- def self.partition_key(*args)
265
- case args.size
266
- when 0
267
- @partition_key || "id" # defaults to id
268
- when 1
269
- @partition_key = args[0].to_s
270
- end
271
- end
272
-
273
- def self.table_name(*args)
274
- case args.size
275
- when 0
276
- get_table_name
277
- when 1
278
- set_table_name(args[0])
279
- end
280
- end
281
-
282
- def self.get_table_name
283
- @table_name ||= self.name.pluralize.underscore
284
- [table_namespace, @table_name].reject {|s| s.nil? || s.empty?}.join('-')
285
- end
286
-
287
- def self.set_table_name(value)
288
- @table_name = value
289
- end
290
-
291
- end
292
- end
@@ -1,15 +0,0 @@
1
- module Dynomite::Log
2
- def self.included(base)
3
- base.extend(ClassMethods)
4
- end
5
-
6
- def log(msg)
7
- self.class.log(msg)
8
- end
9
-
10
- module ClassMethods
11
- def log(msg)
12
- Dynomite.logger.info(msg)
13
- end
14
- end
15
- end
@@ -1,86 +0,0 @@
1
- # Common methods to the *SecondaryIndex classes that handle gsi and lsi methods
2
- # as well a the Dsl class that handles create_table and update_table methods.
3
- class Dynomite::Migration::Dsl
4
- module Common
5
- # http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Types/KeySchemaElement.html
6
- # partition_key is required
7
- def partition_key(identifier)
8
- @partition_key_identifier = identifier # for later use. useful for conventional_index_name
9
- adjust_schema_and_attributes(identifier, "hash")
10
- end
11
-
12
- # sort_key is optional
13
- def sort_key(identifier)
14
- @sort_key_identifier = identifier # for later use. useful for conventional_index_name
15
- adjust_schema_and_attributes(identifier, "range")
16
- end
17
-
18
- # Parameters:
19
- # identifier: "id:string" or "id"
20
- # key_type: "hash" or "range"
21
- #
22
- # Adjusts the parameters for create_table to add the
23
- # partition_key and sort_key
24
- def adjust_schema_and_attributes(identifier, key_type)
25
- name, attribute_type = identifier.split(':')
26
- attribute_type = "string" if attribute_type.nil?
27
-
28
- partition_key = {
29
- attribute_name: name,
30
- key_type: key_type.upcase
31
- }
32
- @key_schema << partition_key
33
-
34
- attribute_definition = {
35
- attribute_name: name,
36
- attribute_type: Dynomite::ATTRIBUTE_TYPES[attribute_type]
37
- }
38
- @attribute_definitions << attribute_definition
39
- end
40
-
41
- # t.provisioned_throughput(5) # both
42
- # t.provisioned_throughput(:read, 5)
43
- # t.provisioned_throughput(:write, 5)
44
- # t.provisioned_throughput(:both, 5)
45
- def provisioned_throughput(*params)
46
- case params.size
47
- when 0 # reader method
48
- return @provisioned_throughput # early return
49
- when 1
50
- # @provisioned_throughput_set_called useful for update_table
51
- # only provide a provisioned_throughput settings if explicitly called for update_table
52
- @provisioned_throughput_set_called = true
53
- arg = params[0]
54
- if arg.is_a?(Hash)
55
- # Case:
56
- # provisioned_throughput(
57
- # read_capacity_units: 10,
58
- # write_capacity_units: 10
59
- # )
60
- @provisioned_throughput = arg # set directly
61
- return # early return
62
- else # assume parameter is an Integer
63
- # Case: provisioned_throughput(10)
64
- capacity_type = :both
65
- capacity_units = arg
66
- end
67
- when 2
68
- @provisioned_throughput_set_called = true
69
- # Case: provisioned_throughput(:read, 5)
70
- capacity_type, capacity_units = params
71
- end
72
-
73
- map = {
74
- read: :read_capacity_units,
75
- write: :write_capacity_units,
76
- }
77
-
78
- if capacity_type == :both
79
- @provisioned_throughput[map[:read]] = capacity_units
80
- @provisioned_throughput[map[:write]] = capacity_units
81
- else
82
- @provisioned_throughput[capacity_type] = capacity_units
83
- end
84
- end
85
- end
86
- end