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.
- checksums.yaml +4 -4
- data/.gitmodules +0 -3
- data/CHANGELOG.md +4 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +6 -2
- data/lib/jets/application.rb +4 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -0
- data/lib/jets/db.rb +11 -5
- data/lib/jets/resource/lambda/function.rb +7 -1
- data/lib/jets/version.rb +1 -1
- data/lib/jets.rb +0 -7
- data/vendor/jets-gems/lib/jets/gems/check.rb +2 -2
- metadata +2 -41
- data/vendor/dynomite/CHANGELOG.md +0 -45
- data/vendor/dynomite/Gemfile +0 -6
- data/vendor/dynomite/Gemfile.lock +0 -61
- data/vendor/dynomite/README.md +0 -141
- data/vendor/dynomite/Rakefile +0 -2
- data/vendor/dynomite/bin/console +0 -14
- data/vendor/dynomite/bin/setup +0 -8
- data/vendor/dynomite/docs/migrations/long-example.rb +0 -123
- data/vendor/dynomite/docs/migrations/short-example.rb +0 -40
- data/vendor/dynomite/dynomite.gemspec +0 -29
- data/vendor/dynomite/lib/dynomite/core.rb +0 -25
- data/vendor/dynomite/lib/dynomite/db_config.rb +0 -107
- data/vendor/dynomite/lib/dynomite/erb.rb +0 -53
- data/vendor/dynomite/lib/dynomite/item.rb +0 -292
- data/vendor/dynomite/lib/dynomite/log.rb +0 -15
- data/vendor/dynomite/lib/dynomite/migration/common.rb +0 -86
- data/vendor/dynomite/lib/dynomite/migration/dsl/base_secondary_index.rb +0 -73
- data/vendor/dynomite/lib/dynomite/migration/dsl/global_secondary_index.rb +0 -4
- data/vendor/dynomite/lib/dynomite/migration/dsl/local_secondary_index.rb +0 -8
- data/vendor/dynomite/lib/dynomite/migration/dsl.rb +0 -194
- data/vendor/dynomite/lib/dynomite/migration/executor.rb +0 -38
- data/vendor/dynomite/lib/dynomite/migration/generator.rb +0 -68
- data/vendor/dynomite/lib/dynomite/migration/templates/create_table.rb +0 -32
- data/vendor/dynomite/lib/dynomite/migration/templates/update_table.rb +0 -26
- data/vendor/dynomite/lib/dynomite/migration.rb +0 -27
- data/vendor/dynomite/lib/dynomite/version.rb +0 -3
- data/vendor/dynomite/lib/dynomite.rb +0 -23
- data/vendor/dynomite/pkg/dynomite-1.0.8.gem +0 -0
- data/vendor/dynomite/pkg/dynomite-1.0.9.gem +0 -0
- data/vendor/dynomite/pkg/dynomite-1.1.0.gem +0 -0
- data/vendor/dynomite/spec/fixtures/app_root/config/dynamodb.yml +0 -7
- data/vendor/dynomite/spec/fixtures/dynamodb/migrate/20190108061826-comments_migration.rb +0 -30
- data/vendor/dynomite/spec/lib/dynomite/item_spec.rb +0 -102
- data/vendor/dynomite/spec/lib/dynomite/migration/dsl/global_secondary_index_spec.rb +0 -106
- data/vendor/dynomite/spec/lib/dynomite/migration/dsl/local_secondary_index_spec.rb +0 -71
- data/vendor/dynomite/spec/lib/dynomite/migration/dsl_spec.rb +0 -76
- data/vendor/dynomite/spec/lib/dynomite/migration/generator_spec.rb +0 -23
- data/vendor/dynomite/spec/lib/dynomite/migration_spec.rb +0 -60
- data/vendor/dynomite/spec/spec_helper.rb +0 -110
@@ -1,73 +0,0 @@
|
|
1
|
-
# Base class for LocalSecondaryIndex and GlobalSecondaryIndex
|
2
|
-
class Dynomite::Migration::Dsl
|
3
|
-
class BaseSecondaryIndex
|
4
|
-
include Common
|
5
|
-
|
6
|
-
attr_accessor :action, :key_schema, :attribute_definitions
|
7
|
-
attr_accessor :index_name
|
8
|
-
def initialize(action, index_name=nil, &block)
|
9
|
-
@action = action.to_sym
|
10
|
-
# for gsi action can be: :create, :update, :delete
|
11
|
-
# for lsi action is always: :create
|
12
|
-
@index_name = index_name
|
13
|
-
@block = block
|
14
|
-
|
15
|
-
# Dsl fills these atttributes in as methods are called within
|
16
|
-
# the block
|
17
|
-
@key_schema = []
|
18
|
-
@attribute_definitions = []
|
19
|
-
# default provisioned_throughput
|
20
|
-
@provisioned_throughput = {
|
21
|
-
read_capacity_units: 5,
|
22
|
-
write_capacity_units: 5
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
def index_name
|
27
|
-
@index_name || conventional_index_name
|
28
|
-
end
|
29
|
-
|
30
|
-
def conventional_index_name
|
31
|
-
# @partition_key_identifier and @sort_key_identifier are set as immediately
|
32
|
-
# when the partition_key and sort_key methods are called in the dsl block.
|
33
|
-
# Usually look like this:
|
34
|
-
#
|
35
|
-
# @partition_key_identifier: post_id:string
|
36
|
-
# @sort_key_identifier: updated_at:string
|
37
|
-
#
|
38
|
-
# We strip the :string portion in case it is provided
|
39
|
-
#
|
40
|
-
partition_key = @partition_key_identifier.split(':').first
|
41
|
-
sort_key = @sort_key_identifier.split(':').first if @sort_key_identifier
|
42
|
-
[partition_key, sort_key, "index"].compact.join('-')
|
43
|
-
end
|
44
|
-
|
45
|
-
def evaluate
|
46
|
-
return if @evaluated
|
47
|
-
@block.call(self) if @block
|
48
|
-
@evaluated = true
|
49
|
-
end
|
50
|
-
|
51
|
-
def params
|
52
|
-
evaluate # lazy evaluation: wait until as long as possible before evaluating code block
|
53
|
-
|
54
|
-
params = { index_name: index_name } # required for all actions
|
55
|
-
|
56
|
-
if @action == :create
|
57
|
-
params[:key_schema] = @key_schema # required for create action
|
58
|
-
# hardcode to ALL for now
|
59
|
-
params[:projection] = { # required
|
60
|
-
projection_type: "ALL", # accepts ALL, KEYS_ONLY, INCLUDE
|
61
|
-
# non_key_attributes: ["NonKeyAttributeName"],
|
62
|
-
}
|
63
|
-
end
|
64
|
-
|
65
|
-
if self.is_a?(GlobalSecondaryIndex) && [:create, :update].include?(@action)
|
66
|
-
# provisioned_throughput is required for gsi index definition
|
67
|
-
params[:provisioned_throughput] = @provisioned_throughput
|
68
|
-
end
|
69
|
-
|
70
|
-
params
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,194 +0,0 @@
|
|
1
|
-
class Dynomite::Migration
|
2
|
-
class Dsl
|
3
|
-
autoload :Common, "dynomite/migration/common"
|
4
|
-
autoload :BaseSecondaryIndex, "dynomite/migration/dsl/base_secondary_index"
|
5
|
-
autoload :LocalSecondaryIndex, "dynomite/migration/dsl/local_secondary_index"
|
6
|
-
autoload :GlobalSecondaryIndex, "dynomite/migration/dsl/global_secondary_index"
|
7
|
-
|
8
|
-
include Dynomite::DbConfig
|
9
|
-
include Common
|
10
|
-
|
11
|
-
attr_accessor :key_schema, :attribute_definitions
|
12
|
-
attr_accessor :table_name
|
13
|
-
def initialize(method_name, table_name, &block)
|
14
|
-
@method_name = method_name
|
15
|
-
@table_name = table_name
|
16
|
-
@block = block
|
17
|
-
|
18
|
-
# Dsl fills in atttributes in as methods are called within the block.
|
19
|
-
# Attributes for both create_table and updated_table:
|
20
|
-
@attribute_definitions = []
|
21
|
-
@provisioned_throughput = {
|
22
|
-
read_capacity_units: 5,
|
23
|
-
write_capacity_units: 5
|
24
|
-
}
|
25
|
-
|
26
|
-
# Attributes for create_table only:
|
27
|
-
@key_schema = []
|
28
|
-
|
29
|
-
# Attributes for update_table only:
|
30
|
-
@gsi_indexes = []
|
31
|
-
@lsi_indexes = []
|
32
|
-
end
|
33
|
-
|
34
|
-
# t.gsi(:create) do |i|
|
35
|
-
# i.partition_key = "category:string"
|
36
|
-
# i.sort_key = "created_at:string" # optional
|
37
|
-
# end
|
38
|
-
def gsi(action=:create, index_name=nil, &block)
|
39
|
-
gsi_index = GlobalSecondaryIndex.new(action, index_name, &block)
|
40
|
-
@gsi_indexes << gsi_index # store @gsi_index for the parent Dsl to use
|
41
|
-
end
|
42
|
-
alias_method :global_secondary_index, :gsi
|
43
|
-
|
44
|
-
# t.lsi(:create) do |i|
|
45
|
-
# i.partition_key = "category:string"
|
46
|
-
# i.sort_key = "created_at:string" # optional
|
47
|
-
# end
|
48
|
-
def lsi(action=:create, index_name=nil, &block)
|
49
|
-
# dont need action create but have it to keep the lsi and gsi method consistent
|
50
|
-
lsi_index = LocalSecondaryIndex.new(index_name, &block)
|
51
|
-
@lsi_indexes << lsi_index # store @lsi_index for the parent Dsl to use
|
52
|
-
end
|
53
|
-
alias_method :local_secondary_index, :lsi
|
54
|
-
|
55
|
-
def evaluate
|
56
|
-
return if @evaluated
|
57
|
-
@block.call(self) if @block
|
58
|
-
@evaluated = true
|
59
|
-
end
|
60
|
-
|
61
|
-
# http://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/dynamo-example-create-table.html
|
62
|
-
# build the params up from dsl in memory and provides params to the
|
63
|
-
# executor
|
64
|
-
def params
|
65
|
-
evaluate # lazy evaluation: wait until as long as possible before evaluating code block
|
66
|
-
|
67
|
-
# Not using send because think its clearer in this case
|
68
|
-
case @method_name
|
69
|
-
when :create_table
|
70
|
-
params_create_table
|
71
|
-
when :update_table
|
72
|
-
params_update_table
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def params_create_table
|
77
|
-
merge_lsi_attribute_definitions!
|
78
|
-
merge_gsi_attribute_definitions!
|
79
|
-
|
80
|
-
params = {
|
81
|
-
table_name: namespaced_table_name,
|
82
|
-
key_schema: @key_schema,
|
83
|
-
attribute_definitions: @attribute_definitions,
|
84
|
-
provisioned_throughput: @provisioned_throughput
|
85
|
-
}
|
86
|
-
|
87
|
-
params[:local_secondary_indexes] = lsi_secondary_index_creates unless @lsi_indexes.empty?
|
88
|
-
params[:global_secondary_indexes] = gsi_secondary_index_creates unless @gsi_indexes.empty?
|
89
|
-
params
|
90
|
-
end
|
91
|
-
|
92
|
-
def params_update_table
|
93
|
-
merge_gsi_attribute_definitions!
|
94
|
-
|
95
|
-
params = {
|
96
|
-
table_name: namespaced_table_name,
|
97
|
-
attribute_definitions: @attribute_definitions,
|
98
|
-
# update table take values only some values for the "parent" table
|
99
|
-
# no key_schema, update_table does not handle key_schema for the "parent" table
|
100
|
-
}
|
101
|
-
# only set "parent" table provisioned_throughput if user actually invoked
|
102
|
-
# it in the dsl
|
103
|
-
params[:provisioned_throughput] = @provisioned_throughput if @provisioned_throughput_set_called
|
104
|
-
params[:global_secondary_index_updates] = global_secondary_index_updates
|
105
|
-
params
|
106
|
-
end
|
107
|
-
|
108
|
-
# Goes thorugh all the lsi_indexes that have been built up in memory.
|
109
|
-
# Find the lsi object that creates an index and then grab the
|
110
|
-
# attribute_definitions from it.
|
111
|
-
def merge_lsi_attribute_definitions!
|
112
|
-
lsi = @lsi_indexes.first # DynamoDB only supports adding one index at a time anyway. The reason @lsi_indexes is an Array is because we're sharing the same class code for LSI and GSI
|
113
|
-
if lsi
|
114
|
-
lsi.evaluate # force early evaluate since we need the params to
|
115
|
-
# add: gsi_attribute_definitions + lsi_attrs
|
116
|
-
lsi_attrs = lsi.attribute_definitions
|
117
|
-
end
|
118
|
-
all_attrs = if lsi_attrs
|
119
|
-
@attribute_definitions + lsi_attrs
|
120
|
-
else
|
121
|
-
@attribute_definitions
|
122
|
-
end
|
123
|
-
@attribute_definitions = all_attrs.uniq
|
124
|
-
end
|
125
|
-
|
126
|
-
# maps each lsi to the hash structure expected by dynamodb update_table
|
127
|
-
# under the global_secondary_index_updates key:
|
128
|
-
#
|
129
|
-
# { create: {...} }
|
130
|
-
# { update: {...} }
|
131
|
-
# { delete: {...} }
|
132
|
-
def lsi_secondary_index_creates
|
133
|
-
@lsi_indexes.map do |lsi|
|
134
|
-
lsi.params
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
# maps each lsi to the hash structure expected by dynamodb update_table
|
139
|
-
# under the global_secondary_index_updates key:
|
140
|
-
#
|
141
|
-
# { create: {...} }
|
142
|
-
# { update: {...} }
|
143
|
-
# { delete: {...} }
|
144
|
-
def gsi_secondary_index_creates
|
145
|
-
@gsi_indexes.map do |gsi|
|
146
|
-
gsi.params
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
# Goes thorugh all the gsi_indexes that have been built up in memory.
|
151
|
-
# Find the gsi object that creates an index and then grab the
|
152
|
-
# attribute_definitions from it.
|
153
|
-
def merge_gsi_attribute_definitions!
|
154
|
-
gsi_attrs = []
|
155
|
-
|
156
|
-
gsi = @gsi_indexes.find { |i| i.action == :create }
|
157
|
-
if gsi
|
158
|
-
gsi.evaluate # force early evaluate since we need the params to
|
159
|
-
# add: gsi_attribute_definitions + gsi_attrs
|
160
|
-
gsi_attrs = gsi.attribute_definitions
|
161
|
-
end
|
162
|
-
|
163
|
-
# Merge existing attributes for update table
|
164
|
-
all_gsi_attrs = @method_name == :update_table ?
|
165
|
-
gsi_attribute_definitions + gsi_attrs :
|
166
|
-
gsi_attrs
|
167
|
-
|
168
|
-
all_attrs = (@attribute_definitions + all_gsi_attrs).uniq
|
169
|
-
@attribute_definitions = all_attrs
|
170
|
-
end
|
171
|
-
|
172
|
-
# maps each gsi to the hash structure expected by dynamodb update_table
|
173
|
-
# under the global_secondary_index_updates key:
|
174
|
-
#
|
175
|
-
# { create: {...} }
|
176
|
-
# { update: {...} }
|
177
|
-
# { delete: {...} }
|
178
|
-
def global_secondary_index_updates
|
179
|
-
@gsi_indexes.map do |gsi|
|
180
|
-
{ gsi.action => gsi.params }
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
# >> resp = Post.db.describe_table(table_name: "demo-dev-posts")
|
185
|
-
# >> resp.table.attribute_definitions.map(&:to_h)
|
186
|
-
# => [{:attribute_name=>"id", :attribute_type=>"S"}]
|
187
|
-
def gsi_attribute_definitions
|
188
|
-
return @gsi_attribute_definitions if @gsi_attribute_definitions
|
189
|
-
|
190
|
-
resp = db.describe_table(table_name: namespaced_table_name)
|
191
|
-
@gsi_attribute_definitions = resp.table.attribute_definitions.map(&:to_h)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
class Dynomite::Migration
|
2
|
-
class Executor
|
3
|
-
include Dynomite::DbConfig
|
4
|
-
|
5
|
-
# Examples:
|
6
|
-
# Executor.new(:create_table, params) or
|
7
|
-
# Executor.new(:update_table, params)
|
8
|
-
#
|
9
|
-
# The params are generated frmo the dsl.params
|
10
|
-
attr_accessor :table_name
|
11
|
-
def initialize(table_name, method_name, params)
|
12
|
-
@table_name = table_name
|
13
|
-
@method_name = method_name # create_table or update_table
|
14
|
-
@params = params
|
15
|
-
end
|
16
|
-
|
17
|
-
def run
|
18
|
-
begin
|
19
|
-
# Examples:
|
20
|
-
# result = db.create_table(@params)
|
21
|
-
# result = db.update_table(@params)
|
22
|
-
|
23
|
-
# Leaving this verbose output in here until this DSL is more hardened to help debug
|
24
|
-
unless ENV['DYNOMITE_ENV'] == 'test'
|
25
|
-
puts "Calling #{@method_name} with params:"
|
26
|
-
pp @params
|
27
|
-
end
|
28
|
-
|
29
|
-
return if ENV['DYNOMITE_DRY'] # dry run flag
|
30
|
-
result = db.send(@method_name, @params)
|
31
|
-
|
32
|
-
puts "DynamoDB Table: #{@table_name} Status: #{result.table_description.table_status}"
|
33
|
-
rescue Aws::DynamoDB::Errors::ServiceError => error
|
34
|
-
puts "Unable to #{@method_name.to_s.gsub('_',' ')}: #{error.message}".colorize(:red)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require "active_support/core_ext/string"
|
2
|
-
|
3
|
-
class Dynomite::Migration
|
4
|
-
# jets dynamodb:generate posts --partition-key id:string
|
5
|
-
class Generator
|
6
|
-
include Dynomite::DbConfig
|
7
|
-
|
8
|
-
attr_reader :migration_name, :table_name
|
9
|
-
def initialize(migration_name, options)
|
10
|
-
@migration_name = migration_name
|
11
|
-
@options = options
|
12
|
-
end
|
13
|
-
|
14
|
-
def generate
|
15
|
-
puts "Generating migration for #{@table_name}" unless @options[:quiet]
|
16
|
-
return if @options[:noop]
|
17
|
-
create_migration
|
18
|
-
end
|
19
|
-
|
20
|
-
def create_migration
|
21
|
-
FileUtils.mkdir_p(File.dirname(migration_path))
|
22
|
-
IO.write(migration_path, migration_code)
|
23
|
-
puts "Migration file created: #{migration_path}. \nTo run:"
|
24
|
-
puts " jets dynamodb:migrate #{migration_path}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def migration_code
|
28
|
-
path = File.expand_path("../templates/#{table_action}.rb", __FILE__)
|
29
|
-
result = Dynomite::Erb.result(path,
|
30
|
-
migration_class_name: migration_class_name,
|
31
|
-
table_name: table_name,
|
32
|
-
partition_key: @options[:partition_key],
|
33
|
-
sort_key: @options[:sort_key],
|
34
|
-
provisioned_throughput: @options[:provisioned_throughput] || 5,
|
35
|
-
)
|
36
|
-
end
|
37
|
-
|
38
|
-
def table_action
|
39
|
-
@options[:table_action] || conventional_table_action
|
40
|
-
end
|
41
|
-
|
42
|
-
def conventional_table_action
|
43
|
-
@migration_name.include?("update") ? "update_table" : "create_table"
|
44
|
-
end
|
45
|
-
|
46
|
-
def table_name
|
47
|
-
@options[:table_name] || conventional_table_name
|
48
|
-
end
|
49
|
-
|
50
|
-
# create_posts => posts
|
51
|
-
# update_posts => posts
|
52
|
-
def conventional_table_name
|
53
|
-
@migration_name.sub(/^(create|update)_/, '')
|
54
|
-
end
|
55
|
-
|
56
|
-
def migration_class_name
|
57
|
-
"#{@migration_name}_migration".classify # doesnt include timestamp
|
58
|
-
end
|
59
|
-
|
60
|
-
def migration_path
|
61
|
-
"#{Dynomite.app_root}dynamodb/migrate/#{timestamp}-#{@migration_name}_migration.rb"
|
62
|
-
end
|
63
|
-
|
64
|
-
def timestamp
|
65
|
-
@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
class <%= @migration_class_name %> < Dynomite::Migration
|
2
|
-
def up
|
3
|
-
create_table :<%= @table_name %> do |t|
|
4
|
-
t.partition_key "<%= @partition_key %>" # required
|
5
|
-
<% if @sort_key # so extra spaces are not added when generated -%>
|
6
|
-
t.sort_key "<%= @sort_key %>" # optional
|
7
|
-
<% end -%>
|
8
|
-
t.provisioned_throughput(<%= @provisioned_throughput %>) # sets both read and write, defaults to 5 when not set
|
9
|
-
|
10
|
-
# Instead of using partition_key and sort_key you can set the
|
11
|
-
# key schema directly also
|
12
|
-
# t.key_schema([
|
13
|
-
# {attribute_name: "id", :key_type=>"HASH"},
|
14
|
-
# {attribute_name: "created_at", :key_type=>"RANGE"}
|
15
|
-
# ])
|
16
|
-
# t.attribute_definitions([
|
17
|
-
# {attribute_name: "id", attribute_type: "N"},
|
18
|
-
# {attribute_name: "created_at", attribute_type: "S"}
|
19
|
-
# ])
|
20
|
-
|
21
|
-
# other ways to set provisioned_throughput
|
22
|
-
# t.provisioned_throughput(:read, 10)
|
23
|
-
# t.provisioned_throughput(:write, 10)
|
24
|
-
# t.provisioned_throughput(
|
25
|
-
# read_capacity_units: 5,
|
26
|
-
# write_capacity_units: 5
|
27
|
-
# )
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# More examples: https://github.com/tongueroo/dynomite/tree/master/docs
|
@@ -1,26 +0,0 @@
|
|
1
|
-
class <%= @migration_class_name %> < Dynomite::Migration
|
2
|
-
def up
|
3
|
-
update_table :<%= @table_name %> do |t|
|
4
|
-
t.gsi(:create) do |i|
|
5
|
-
i.partition_key "<%= @partition_key %>" # required
|
6
|
-
<% if @sort_key # so extra spaces are not added when generated -%>
|
7
|
-
t.sort_key "<%= @sort_key %>" # optional
|
8
|
-
<% end -%>
|
9
|
-
|
10
|
-
i.provisioned_throughput(5)
|
11
|
-
end
|
12
|
-
|
13
|
-
# Examples:
|
14
|
-
# t.gsi(:update, "update-me-index") do |i|
|
15
|
-
# i.provisioned_throughput(10)
|
16
|
-
# end
|
17
|
-
|
18
|
-
# t.gsi(:delete, "delete-me-index")
|
19
|
-
|
20
|
-
# Must use :create, :update, :delete one at a time in separate migration files.
|
21
|
-
# DynamoDB imposes this.
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# More examples: https://github.com/tongueroo/dynomite/tree/master/docs
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Dynomite
|
2
|
-
class Migration
|
3
|
-
autoload :Dsl, "dynomite/migration/dsl"
|
4
|
-
autoload :Generator, "dynomite/migration/generator"
|
5
|
-
autoload :Executor, "dynomite/migration/executor"
|
6
|
-
|
7
|
-
def up
|
8
|
-
puts "Should defined an up method for your migration: #{self.class.name}"
|
9
|
-
end
|
10
|
-
|
11
|
-
def create_table(table_name, &block)
|
12
|
-
execute_with_dsl_params(table_name, :create_table, &block)
|
13
|
-
end
|
14
|
-
|
15
|
-
def update_table(table_name, &block)
|
16
|
-
execute_with_dsl_params(table_name, :update_table, &block)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
def execute_with_dsl_params(table_name, method_name, &block)
|
21
|
-
dsl = Dsl.new(method_name, table_name, &block)
|
22
|
-
params = dsl.params
|
23
|
-
executor = Executor.new(table_name, method_name, params)
|
24
|
-
executor.run
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
$:.unshift(File.expand_path("../", __FILE__))
|
2
|
-
require "dynomite/version"
|
3
|
-
|
4
|
-
module Dynomite
|
5
|
-
ATTRIBUTE_TYPES = {
|
6
|
-
'string' => 'S',
|
7
|
-
'number' => 'N',
|
8
|
-
'binary' => 'B',
|
9
|
-
's' => 'S',
|
10
|
-
'n' => 'N',
|
11
|
-
'b' => 'B',
|
12
|
-
}
|
13
|
-
|
14
|
-
autoload :Migration, "dynomite/migration"
|
15
|
-
autoload :Dsl, "dynomite/dsl"
|
16
|
-
autoload :DbConfig, "dynomite/db_config"
|
17
|
-
autoload :Item, "dynomite/item"
|
18
|
-
autoload :Core, "dynomite/core"
|
19
|
-
autoload :Erb, "dynomite/erb"
|
20
|
-
autoload :Log, "dynomite/log"
|
21
|
-
|
22
|
-
extend Core
|
23
|
-
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,30 +0,0 @@
|
|
1
|
-
class CommentsMigration < 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(5) # sets both read and write, defaults to 5 when not set
|
7
|
-
|
8
|
-
# Instead of using partition_key and sort_key you can set the
|
9
|
-
# key schema directly also
|
10
|
-
# t.key_schema([
|
11
|
-
# {attribute_name: "id", :key_type=>"HASH"},
|
12
|
-
# {attribute_name: "created_at", :key_type=>"RANGE"}
|
13
|
-
# ])
|
14
|
-
# t.attribute_definitions([
|
15
|
-
# {attribute_name: "id", attribute_type: "N"},
|
16
|
-
# {attribute_name: "created_at", attribute_type: "S"}
|
17
|
-
# ])
|
18
|
-
|
19
|
-
# other ways to set provisioned_throughput
|
20
|
-
# t.provisioned_throughput(:read, 10)
|
21
|
-
# t.provisioned_throughput(:write, 10)
|
22
|
-
# t.provisioned_throughput(
|
23
|
-
# read_capacity_units: 5,
|
24
|
-
# write_capacity_units: 5
|
25
|
-
# )
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# More examples: https://github.com/tongueroo/dynomite/tree/master/docs
|
@@ -1,102 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
class Post < Dynomite::Item
|
4
|
-
end
|
5
|
-
class Comment < Dynomite::Item
|
6
|
-
partition_key "post_id" # defaults to id
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Dynomite::Item do
|
10
|
-
describe "general" do
|
11
|
-
it "loads attributes" do
|
12
|
-
post = Post.new(title: "my title", desc: "my desc")
|
13
|
-
expect(post.attrs).to eq("title" => "my title", "desc" => "my desc")
|
14
|
-
|
15
|
-
post.attrs(title: "my title2")
|
16
|
-
expect(post.attrs).to eq("title" => "my title2", "desc" => "my desc")
|
17
|
-
end
|
18
|
-
|
19
|
-
it "table_name" do
|
20
|
-
expect(Post.table_name).to eq "testnamespace-posts"
|
21
|
-
expect(Comment.table_name).to eq "testnamespace-comments"
|
22
|
-
# hack to quickly test blank and namespaces
|
23
|
-
old_namespace = Comment.instance_variable_get(:@table_namespace)
|
24
|
-
Comment.instance_variable_set(:@table_namespace, '')
|
25
|
-
expect(Comment.table_name).to eq "comments"
|
26
|
-
Comment.instance_variable_set(:@table_namespace, old_namespace)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "partition_key" do
|
30
|
-
expect(Post.partition_key).to eq "id"
|
31
|
-
expect(Comment.partition_key).to eq "post_id"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "CRUD-ish" do
|
36
|
-
before(:each) { Post.db = db }
|
37
|
-
let(:db) { double(:db) }
|
38
|
-
|
39
|
-
let(:find_resp) do
|
40
|
-
fake_attributes = {"id" => "myid", "title" => "my title"}
|
41
|
-
resp = double(:resp)
|
42
|
-
expect(resp).to receive(:item).and_return(fake_attributes)
|
43
|
-
resp
|
44
|
-
end
|
45
|
-
it "find" do
|
46
|
-
expect(Post.db).to receive(:get_item).and_return(find_resp)
|
47
|
-
|
48
|
-
post = Post.find("myid")
|
49
|
-
|
50
|
-
expect(post.attrs).to eq("id" => "myid", "title" => "my title")
|
51
|
-
end
|
52
|
-
|
53
|
-
it "replace" do
|
54
|
-
# Not returning a resp with receive because it is not useful
|
55
|
-
# Dynanmodb doesnt provide much useful info there.
|
56
|
-
expect(Post.db).to receive(:put_item)
|
57
|
-
|
58
|
-
post = Post.new(title: "my title")
|
59
|
-
post.replace
|
60
|
-
attrs = post.attrs
|
61
|
-
|
62
|
-
expect(attrs[:title]).to eq "my title"
|
63
|
-
expect(attrs[:id].size).to eq 40 # generated unique id
|
64
|
-
end
|
65
|
-
|
66
|
-
it "replace with hash" do
|
67
|
-
# Not returning a resp with receive because it is not useful
|
68
|
-
# Dynanmodb doesnt provide much useful info there.
|
69
|
-
expect(Post.db).to receive(:put_item)
|
70
|
-
|
71
|
-
post = Post.new(title: "my title")
|
72
|
-
post.replace(title: "my title 2")
|
73
|
-
attrs = post.attrs
|
74
|
-
|
75
|
-
expect(attrs[:title]).to eq "my title 2"
|
76
|
-
expect(attrs[:id].size).to eq 40 # generated unique id
|
77
|
-
end
|
78
|
-
|
79
|
-
it "delete" do
|
80
|
-
allow(Post.db).to receive(:delete_item)
|
81
|
-
|
82
|
-
Post.delete("myid")
|
83
|
-
|
84
|
-
expect(Post.db).to have_received(:delete_item)
|
85
|
-
end
|
86
|
-
|
87
|
-
let(:scan_resp) do
|
88
|
-
fake_attributes = [{"id" => "myid", "title" => "my title"}]
|
89
|
-
resp = double(:resp)
|
90
|
-
expect(resp).to receive(:items).and_return(fake_attributes)
|
91
|
-
resp
|
92
|
-
end
|
93
|
-
it "scan" do
|
94
|
-
allow(Post.db).to receive(:scan).and_return(scan_resp)
|
95
|
-
|
96
|
-
post = Post.scan
|
97
|
-
|
98
|
-
expect(Post.db).to have_received(:scan)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|