dynomite 1.2.7 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +17 -2
- data/CHANGELOG.md +18 -0
- data/Gemfile +1 -5
- data/LICENSE.txt +22 -0
- data/README.md +6 -190
- data/Rakefile +13 -1
- data/dynomite.gemspec +9 -2
- data/exe/dynomite +14 -0
- data/lib/dynomite/associations/association.rb +126 -0
- data/lib/dynomite/associations/belongs_to.rb +35 -0
- data/lib/dynomite/associations/has_and_belongs_to_many.rb +19 -0
- data/lib/dynomite/associations/has_many.rb +19 -0
- data/lib/dynomite/associations/has_one.rb +19 -0
- data/lib/dynomite/associations/many_association.rb +257 -0
- data/lib/dynomite/associations/single_association.rb +157 -0
- data/lib/dynomite/associations.rb +248 -0
- data/lib/dynomite/autoloader.rb +25 -0
- data/lib/dynomite/cli.rb +48 -0
- data/lib/dynomite/client.rb +118 -0
- data/lib/dynomite/command.rb +89 -0
- data/lib/dynomite/completer/script.rb +6 -0
- data/lib/dynomite/completer/script.sh +10 -0
- data/lib/dynomite/completer.rb +159 -0
- data/lib/dynomite/config.rb +39 -0
- data/lib/dynomite/core.rb +18 -19
- data/lib/dynomite/engine.rb +45 -0
- data/lib/dynomite/erb.rb +5 -3
- data/lib/dynomite/error.rb +12 -0
- data/lib/dynomite/help/completion.md +20 -0
- data/lib/dynomite/help/completion_script.md +3 -0
- data/lib/dynomite/help/migrate.md +3 -0
- data/lib/dynomite/help.rb +9 -0
- data/lib/dynomite/install.rb +4 -0
- data/lib/dynomite/item/abstract.rb +15 -0
- data/lib/dynomite/item/components.rb +33 -0
- data/lib/dynomite/item/dsl.rb +101 -0
- data/lib/dynomite/item/id.rb +41 -0
- data/lib/dynomite/item/indexes/finder.rb +58 -0
- data/lib/dynomite/item/indexes/index.rb +21 -0
- data/lib/dynomite/item/indexes/primary_index.rb +18 -0
- data/lib/dynomite/item/indexes.rb +25 -0
- data/lib/dynomite/item/locking.rb +53 -0
- data/lib/dynomite/item/magic_fields.rb +66 -0
- data/lib/dynomite/item/primary_key.rb +85 -0
- data/lib/dynomite/item/query/delegates.rb +28 -0
- data/lib/dynomite/item/query/params/base.rb +42 -0
- data/lib/dynomite/item/query/params/expression_attribute.rb +79 -0
- data/lib/dynomite/item/query/params/filter.rb +41 -0
- data/lib/dynomite/item/query/params/function/attribute_exists.rb +21 -0
- data/lib/dynomite/item/query/params/function/attribute_type.rb +30 -0
- data/lib/dynomite/item/query/params/function/base.rb +33 -0
- data/lib/dynomite/item/query/params/function/begins_with.rb +32 -0
- data/lib/dynomite/item/query/params/function/contains.rb +7 -0
- data/lib/dynomite/item/query/params/function/size_fn.rb +37 -0
- data/lib/dynomite/item/query/params/helpers.rb +94 -0
- data/lib/dynomite/item/query/params/key_condition.rb +34 -0
- data/lib/dynomite/item/query/params.rb +115 -0
- data/lib/dynomite/item/query/partiql/executer.rb +72 -0
- data/lib/dynomite/item/query/partiql.rb +67 -0
- data/lib/dynomite/item/query/relation/chain.rb +125 -0
- data/lib/dynomite/item/query/relation/comparision_expression.rb +21 -0
- data/lib/dynomite/item/query/relation/comparision_map.rb +19 -0
- data/lib/dynomite/item/query/relation/delete.rb +38 -0
- data/lib/dynomite/item/query/relation/ids.rb +21 -0
- data/lib/dynomite/item/query/relation/math.rb +19 -0
- data/lib/dynomite/item/query/relation/where_field.rb +32 -0
- data/lib/dynomite/item/query/relation/where_group.rb +78 -0
- data/lib/dynomite/item/query/relation.rb +127 -0
- data/lib/dynomite/item/query.rb +7 -0
- data/lib/dynomite/item/read/find.rb +196 -0
- data/lib/dynomite/item/read/find_with_event.rb +42 -0
- data/lib/dynomite/item/read.rb +90 -0
- data/lib/dynomite/item/sti.rb +43 -0
- data/lib/dynomite/item/table_namespace.rb +43 -0
- data/lib/dynomite/item/typecaster.rb +106 -0
- data/lib/dynomite/item/waiter_methods.rb +18 -0
- data/lib/dynomite/item/write/base.rb +15 -0
- data/lib/dynomite/item/write/delete_item.rb +14 -0
- data/lib/dynomite/item/write/put_item.rb +99 -0
- data/lib/dynomite/item/write/update_item.rb +73 -0
- data/lib/dynomite/item/write.rb +204 -0
- data/lib/dynomite/item.rb +113 -286
- data/lib/dynomite/migration/dsl/accessor.rb +19 -0
- data/lib/dynomite/migration/dsl/index/base.rb +42 -0
- data/lib/dynomite/migration/dsl/index/gsi.rb +59 -0
- data/lib/dynomite/migration/dsl/index/lsi.rb +27 -0
- data/lib/dynomite/migration/dsl/index.rb +72 -0
- data/lib/dynomite/migration/dsl/primary_key.rb +62 -0
- data/lib/dynomite/migration/dsl/provisioned_throughput.rb +38 -0
- data/lib/dynomite/migration/dsl.rb +89 -142
- data/lib/dynomite/migration/file_info.rb +28 -0
- data/lib/dynomite/migration/generator.rb +30 -16
- data/lib/dynomite/migration/helpers.rb +7 -0
- data/lib/dynomite/migration/internal/migrate/create_schema_migrations.rb +17 -0
- data/lib/dynomite/migration/internal/models/schema_migration.rb +6 -0
- data/lib/dynomite/migration/runner.rb +178 -0
- data/lib/dynomite/migration/templates/create_table.rb +7 -23
- data/lib/dynomite/migration/templates/delete_table.rb +7 -0
- data/lib/dynomite/migration/templates/update_table.rb +3 -18
- data/lib/dynomite/migration.rb +53 -10
- data/lib/dynomite/reserved_words.rb +13 -3
- data/lib/dynomite/seed.rb +12 -0
- data/lib/dynomite/types.rb +22 -0
- data/lib/dynomite/version.rb +1 -1
- data/lib/dynomite/waiter.rb +40 -0
- data/lib/dynomite.rb +11 -17
- data/lib/generators/application_item/application_item_generator.rb +30 -0
- data/lib/generators/application_item/templates/application_item.rb.tt +4 -0
- data/lib/jets/commands/dynamodb_command.rb +29 -0
- data/lib/jets/commands/help/generate.md +33 -0
- data/lib/jets/commands/help/migrate.md +3 -0
- metadata +201 -17
- data/docs/migrations/long-example.rb +0 -127
- data/docs/migrations/short-example.rb +0 -40
- data/lib/dynomite/db_config.rb +0 -121
- data/lib/dynomite/errors.rb +0 -15
- data/lib/dynomite/log.rb +0 -15
- data/lib/dynomite/migration/common.rb +0 -86
- data/lib/dynomite/migration/dsl/base_secondary_index.rb +0 -73
- data/lib/dynomite/migration/dsl/global_secondary_index.rb +0 -4
- data/lib/dynomite/migration/dsl/local_secondary_index.rb +0 -8
- data/lib/dynomite/migration/executor.rb +0 -38
@@ -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
|
@@ -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,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}".color(:red)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|