dynomite 1.2.7 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -2
  3. data/CHANGELOG.md +21 -0
  4. data/Gemfile +1 -5
  5. data/LICENSE.txt +22 -0
  6. data/README.md +6 -190
  7. data/Rakefile +13 -1
  8. data/dynomite.gemspec +9 -2
  9. data/exe/dynomite +14 -0
  10. data/lib/dynomite/associations/association.rb +126 -0
  11. data/lib/dynomite/associations/belongs_to.rb +35 -0
  12. data/lib/dynomite/associations/has_and_belongs_to_many.rb +19 -0
  13. data/lib/dynomite/associations/has_many.rb +19 -0
  14. data/lib/dynomite/associations/has_one.rb +19 -0
  15. data/lib/dynomite/associations/many_association.rb +257 -0
  16. data/lib/dynomite/associations/single_association.rb +157 -0
  17. data/lib/dynomite/associations.rb +248 -0
  18. data/lib/dynomite/autoloader.rb +25 -0
  19. data/lib/dynomite/cli.rb +48 -0
  20. data/lib/dynomite/client.rb +118 -0
  21. data/lib/dynomite/command.rb +89 -0
  22. data/lib/dynomite/completer/script.rb +6 -0
  23. data/lib/dynomite/completer/script.sh +10 -0
  24. data/lib/dynomite/completer.rb +159 -0
  25. data/lib/dynomite/config.rb +39 -0
  26. data/lib/dynomite/core.rb +18 -19
  27. data/lib/dynomite/engine.rb +15 -0
  28. data/lib/dynomite/erb.rb +5 -3
  29. data/lib/dynomite/error.rb +12 -0
  30. data/lib/dynomite/help/completion.md +20 -0
  31. data/lib/dynomite/help/completion_script.md +3 -0
  32. data/lib/dynomite/help/migrate.md +3 -0
  33. data/lib/dynomite/help.rb +9 -0
  34. data/lib/dynomite/install.rb +4 -0
  35. data/lib/dynomite/item/abstract.rb +15 -0
  36. data/lib/dynomite/item/components.rb +33 -0
  37. data/lib/dynomite/item/dsl.rb +101 -0
  38. data/lib/dynomite/item/id.rb +41 -0
  39. data/lib/dynomite/item/indexes/finder.rb +58 -0
  40. data/lib/dynomite/item/indexes/index.rb +21 -0
  41. data/lib/dynomite/item/indexes/primary_index.rb +18 -0
  42. data/lib/dynomite/item/indexes.rb +25 -0
  43. data/lib/dynomite/item/locking.rb +53 -0
  44. data/lib/dynomite/item/magic_fields.rb +66 -0
  45. data/lib/dynomite/item/primary_key.rb +85 -0
  46. data/lib/dynomite/item/query/delegates.rb +28 -0
  47. data/lib/dynomite/item/query/params/base.rb +42 -0
  48. data/lib/dynomite/item/query/params/expression_attribute.rb +79 -0
  49. data/lib/dynomite/item/query/params/filter.rb +41 -0
  50. data/lib/dynomite/item/query/params/function/attribute_exists.rb +21 -0
  51. data/lib/dynomite/item/query/params/function/attribute_type.rb +30 -0
  52. data/lib/dynomite/item/query/params/function/base.rb +33 -0
  53. data/lib/dynomite/item/query/params/function/begins_with.rb +32 -0
  54. data/lib/dynomite/item/query/params/function/contains.rb +7 -0
  55. data/lib/dynomite/item/query/params/function/size_fn.rb +37 -0
  56. data/lib/dynomite/item/query/params/helpers.rb +94 -0
  57. data/lib/dynomite/item/query/params/key_condition.rb +34 -0
  58. data/lib/dynomite/item/query/params.rb +115 -0
  59. data/lib/dynomite/item/query/partiql/executer.rb +72 -0
  60. data/lib/dynomite/item/query/partiql.rb +67 -0
  61. data/lib/dynomite/item/query/relation/chain.rb +125 -0
  62. data/lib/dynomite/item/query/relation/comparision_expression.rb +21 -0
  63. data/lib/dynomite/item/query/relation/comparision_map.rb +19 -0
  64. data/lib/dynomite/item/query/relation/delete.rb +38 -0
  65. data/lib/dynomite/item/query/relation/ids.rb +21 -0
  66. data/lib/dynomite/item/query/relation/math.rb +19 -0
  67. data/lib/dynomite/item/query/relation/where_field.rb +32 -0
  68. data/lib/dynomite/item/query/relation/where_group.rb +78 -0
  69. data/lib/dynomite/item/query/relation.rb +127 -0
  70. data/lib/dynomite/item/query.rb +7 -0
  71. data/lib/dynomite/item/read/find.rb +196 -0
  72. data/lib/dynomite/item/read/find_with_event.rb +42 -0
  73. data/lib/dynomite/item/read.rb +90 -0
  74. data/lib/dynomite/item/sti.rb +43 -0
  75. data/lib/dynomite/item/table_namespace.rb +43 -0
  76. data/lib/dynomite/item/typecaster.rb +106 -0
  77. data/lib/dynomite/item/waiter_methods.rb +18 -0
  78. data/lib/dynomite/item/write/base.rb +15 -0
  79. data/lib/dynomite/item/write/delete_item.rb +14 -0
  80. data/lib/dynomite/item/write/put_item.rb +99 -0
  81. data/lib/dynomite/item/write/update_item.rb +73 -0
  82. data/lib/dynomite/item/write.rb +204 -0
  83. data/lib/dynomite/item.rb +113 -286
  84. data/lib/dynomite/migration/dsl/accessor.rb +19 -0
  85. data/lib/dynomite/migration/dsl/index/base.rb +42 -0
  86. data/lib/dynomite/migration/dsl/index/gsi.rb +59 -0
  87. data/lib/dynomite/migration/dsl/index/lsi.rb +27 -0
  88. data/lib/dynomite/migration/dsl/index.rb +72 -0
  89. data/lib/dynomite/migration/dsl/primary_key.rb +62 -0
  90. data/lib/dynomite/migration/dsl/provisioned_throughput.rb +38 -0
  91. data/lib/dynomite/migration/dsl.rb +89 -142
  92. data/lib/dynomite/migration/file_info.rb +28 -0
  93. data/lib/dynomite/migration/generator.rb +30 -16
  94. data/lib/dynomite/migration/helpers.rb +7 -0
  95. data/lib/dynomite/migration/internal/migrate/create_schema_migrations.rb +17 -0
  96. data/lib/dynomite/migration/internal/models/schema_migration.rb +6 -0
  97. data/lib/dynomite/migration/runner.rb +179 -0
  98. data/lib/dynomite/migration/templates/create_table.rb +7 -23
  99. data/lib/dynomite/migration/templates/delete_table.rb +7 -0
  100. data/lib/dynomite/migration/templates/update_table.rb +3 -18
  101. data/lib/dynomite/migration.rb +53 -10
  102. data/lib/dynomite/reserved_words.rb +13 -3
  103. data/lib/dynomite/seed.rb +13 -0
  104. data/lib/dynomite/types.rb +22 -0
  105. data/lib/dynomite/version.rb +1 -1
  106. data/lib/dynomite/waiter.rb +40 -0
  107. data/lib/dynomite.rb +11 -17
  108. data/lib/generators/application_item/application_item_generator.rb +30 -0
  109. data/lib/generators/application_item/templates/application_item.rb.tt +4 -0
  110. data/lib/jets/commands/dynamodb_command.rb +29 -0
  111. data/lib/jets/commands/help/generate.md +33 -0
  112. data/lib/jets/commands/help/migrate.md +3 -0
  113. metadata +201 -17
  114. data/docs/migrations/long-example.rb +0 -127
  115. data/docs/migrations/short-example.rb +0 -40
  116. data/lib/dynomite/db_config.rb +0 -121
  117. data/lib/dynomite/errors.rb +0 -15
  118. data/lib/dynomite/log.rb +0 -15
  119. data/lib/dynomite/migration/common.rb +0 -86
  120. data/lib/dynomite/migration/dsl/base_secondary_index.rb +0 -73
  121. data/lib/dynomite/migration/dsl/global_secondary_index.rb +0 -4
  122. data/lib/dynomite/migration/dsl/local_secondary_index.rb +0 -8
  123. data/lib/dynomite/migration/executor.rb +0 -38
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynomite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-12 00:00:00.000000000 Z
11
+ date: 2023-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activesupport
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: memoist
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rainbow
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,34 @@ dependencies:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: zeitwerk
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
55
111
  - !ruby/object:Gem::Dependency
56
112
  name: bundler
57
113
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +122,48 @@ dependencies:
66
122
  - - ">="
67
123
  - !ruby/object:Gem::Version
68
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: byebug
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: cli_markdown
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: nokogiri
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
69
167
  - !ruby/object:Gem::Dependency
70
168
  name: rake
71
169
  requirement: !ruby/object:Gem::Requirement
@@ -94,10 +192,11 @@ dependencies:
94
192
  - - ">="
95
193
  - !ruby/object:Gem::Version
96
194
  version: '0'
97
- description: ActiveRecord-ish Dynamodb Model
195
+ description:
98
196
  email:
99
197
  - tongueroo@gmail.com
100
- executables: []
198
+ executables:
199
+ - dynomite
101
200
  extensions: []
102
201
  extra_rdoc_files: []
103
202
  files:
@@ -105,35 +204,120 @@ files:
105
204
  - ".rspec"
106
205
  - CHANGELOG.md
107
206
  - Gemfile
207
+ - LICENSE.txt
108
208
  - README.md
109
209
  - Rakefile
110
210
  - bin/console
111
211
  - bin/setup
112
- - docs/migrations/long-example.rb
113
- - docs/migrations/short-example.rb
114
212
  - dynomite.gemspec
213
+ - exe/dynomite
115
214
  - lib/dynomite.rb
215
+ - lib/dynomite/associations.rb
216
+ - lib/dynomite/associations/association.rb
217
+ - lib/dynomite/associations/belongs_to.rb
218
+ - lib/dynomite/associations/has_and_belongs_to_many.rb
219
+ - lib/dynomite/associations/has_many.rb
220
+ - lib/dynomite/associations/has_one.rb
221
+ - lib/dynomite/associations/many_association.rb
222
+ - lib/dynomite/associations/single_association.rb
223
+ - lib/dynomite/autoloader.rb
224
+ - lib/dynomite/cli.rb
225
+ - lib/dynomite/client.rb
226
+ - lib/dynomite/command.rb
227
+ - lib/dynomite/completer.rb
228
+ - lib/dynomite/completer/script.rb
229
+ - lib/dynomite/completer/script.sh
230
+ - lib/dynomite/config.rb
116
231
  - lib/dynomite/core.rb
117
- - lib/dynomite/db_config.rb
232
+ - lib/dynomite/engine.rb
118
233
  - lib/dynomite/erb.rb
119
- - lib/dynomite/errors.rb
234
+ - lib/dynomite/error.rb
235
+ - lib/dynomite/help.rb
236
+ - lib/dynomite/help/completion.md
237
+ - lib/dynomite/help/completion_script.md
238
+ - lib/dynomite/help/migrate.md
239
+ - lib/dynomite/install.rb
120
240
  - lib/dynomite/item.rb
121
- - lib/dynomite/log.rb
241
+ - lib/dynomite/item/abstract.rb
242
+ - lib/dynomite/item/components.rb
243
+ - lib/dynomite/item/dsl.rb
244
+ - lib/dynomite/item/id.rb
245
+ - lib/dynomite/item/indexes.rb
246
+ - lib/dynomite/item/indexes/finder.rb
247
+ - lib/dynomite/item/indexes/index.rb
248
+ - lib/dynomite/item/indexes/primary_index.rb
249
+ - lib/dynomite/item/locking.rb
250
+ - lib/dynomite/item/magic_fields.rb
251
+ - lib/dynomite/item/primary_key.rb
252
+ - lib/dynomite/item/query.rb
253
+ - lib/dynomite/item/query/delegates.rb
254
+ - lib/dynomite/item/query/params.rb
255
+ - lib/dynomite/item/query/params/base.rb
256
+ - lib/dynomite/item/query/params/expression_attribute.rb
257
+ - lib/dynomite/item/query/params/filter.rb
258
+ - lib/dynomite/item/query/params/function/attribute_exists.rb
259
+ - lib/dynomite/item/query/params/function/attribute_type.rb
260
+ - lib/dynomite/item/query/params/function/base.rb
261
+ - lib/dynomite/item/query/params/function/begins_with.rb
262
+ - lib/dynomite/item/query/params/function/contains.rb
263
+ - lib/dynomite/item/query/params/function/size_fn.rb
264
+ - lib/dynomite/item/query/params/helpers.rb
265
+ - lib/dynomite/item/query/params/key_condition.rb
266
+ - lib/dynomite/item/query/partiql.rb
267
+ - lib/dynomite/item/query/partiql/executer.rb
268
+ - lib/dynomite/item/query/relation.rb
269
+ - lib/dynomite/item/query/relation/chain.rb
270
+ - lib/dynomite/item/query/relation/comparision_expression.rb
271
+ - lib/dynomite/item/query/relation/comparision_map.rb
272
+ - lib/dynomite/item/query/relation/delete.rb
273
+ - lib/dynomite/item/query/relation/ids.rb
274
+ - lib/dynomite/item/query/relation/math.rb
275
+ - lib/dynomite/item/query/relation/where_field.rb
276
+ - lib/dynomite/item/query/relation/where_group.rb
277
+ - lib/dynomite/item/read.rb
278
+ - lib/dynomite/item/read/find.rb
279
+ - lib/dynomite/item/read/find_with_event.rb
280
+ - lib/dynomite/item/sti.rb
281
+ - lib/dynomite/item/table_namespace.rb
282
+ - lib/dynomite/item/typecaster.rb
283
+ - lib/dynomite/item/waiter_methods.rb
284
+ - lib/dynomite/item/write.rb
285
+ - lib/dynomite/item/write/base.rb
286
+ - lib/dynomite/item/write/delete_item.rb
287
+ - lib/dynomite/item/write/put_item.rb
288
+ - lib/dynomite/item/write/update_item.rb
122
289
  - lib/dynomite/migration.rb
123
- - lib/dynomite/migration/common.rb
124
290
  - lib/dynomite/migration/dsl.rb
125
- - lib/dynomite/migration/dsl/base_secondary_index.rb
126
- - lib/dynomite/migration/dsl/global_secondary_index.rb
127
- - lib/dynomite/migration/dsl/local_secondary_index.rb
128
- - lib/dynomite/migration/executor.rb
291
+ - lib/dynomite/migration/dsl/accessor.rb
292
+ - lib/dynomite/migration/dsl/index.rb
293
+ - lib/dynomite/migration/dsl/index/base.rb
294
+ - lib/dynomite/migration/dsl/index/gsi.rb
295
+ - lib/dynomite/migration/dsl/index/lsi.rb
296
+ - lib/dynomite/migration/dsl/primary_key.rb
297
+ - lib/dynomite/migration/dsl/provisioned_throughput.rb
298
+ - lib/dynomite/migration/file_info.rb
129
299
  - lib/dynomite/migration/generator.rb
300
+ - lib/dynomite/migration/helpers.rb
301
+ - lib/dynomite/migration/internal/migrate/create_schema_migrations.rb
302
+ - lib/dynomite/migration/internal/models/schema_migration.rb
303
+ - lib/dynomite/migration/runner.rb
130
304
  - lib/dynomite/migration/templates/create_table.rb
305
+ - lib/dynomite/migration/templates/delete_table.rb
131
306
  - lib/dynomite/migration/templates/update_table.rb
132
307
  - lib/dynomite/query.rb
133
308
  - lib/dynomite/reserved_words.rb
309
+ - lib/dynomite/seed.rb
310
+ - lib/dynomite/types.rb
134
311
  - lib/dynomite/version.rb
312
+ - lib/dynomite/waiter.rb
313
+ - lib/generators/application_item/application_item_generator.rb
314
+ - lib/generators/application_item/templates/application_item.rb.tt
315
+ - lib/jets/commands/dynamodb_command.rb
316
+ - lib/jets/commands/help/generate.md
317
+ - lib/jets/commands/help/migrate.md
135
318
  homepage: https://github.com/tongueroo/dynomite
136
- licenses: []
319
+ licenses:
320
+ - MIT
137
321
  metadata: {}
138
322
  post_install_message:
139
323
  rdoc_options: []
@@ -150,8 +334,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
334
  - !ruby/object:Gem::Version
151
335
  version: '0'
152
336
  requirements: []
153
- rubygems_version: 3.3.12
337
+ rubygems_version: 3.4.20
154
338
  signing_key:
155
339
  specification_version: 4
156
- summary: ActiveRecord-ish Dynamodb Model
340
+ summary: ActiveRecord-ish DynamoDB ORM
157
341
  test_files: []
@@ -1,127 +0,0 @@
1
- # Note: table name created will be namespaced based on
2
- # Dynomite::Migration.table_namespace. This can be set in
3
- # config/dynamodb.yml
4
- #
5
- # development:
6
- # table_namespace: "mynamespace"
7
- #
8
- # This results in:
9
- # create_table "posts"
10
- # Produces:
11
- # table name: "mynamespace-posts"
12
- #
13
- # When you're in a in Jets project you can set the namespace based on
14
- # Jets.config.table_namespace, which is based on the project name and
15
- # a short version of the environment. Example:
16
- #
17
- # `config/dynamodb.yml`:
18
- # development:
19
- # table_namespace: <%= Jets.config.table_namespace %>
20
- #
21
- # If your project_name is demo and environment is production:
22
- # create_table "posts" => table name: "demo-prod-posts"
23
- #
24
- # If your project_name is demo and environment is staging:
25
- # create_table "posts" => table name: "demo-stag-posts"
26
- #
27
- # If your project_name is demo and environment is development:
28
- # create_table "posts" => table name: "demo-dev-posts"
29
- #
30
- # If the table_namespace is set to a blank string or nil, then a namespace
31
- # will not be prepended at all.
32
-
33
- class CreateCommentsMigration < Dynomite::Migration
34
- def up
35
- create_table :comments do |t|
36
- t.partition_key "post_id:string" # required
37
- t.sort_key "created_at:string" # optional
38
- t.provisioned_throughput(5) # sets both read and write, defaults to 5 when not set
39
-
40
- # Instead of using partition_key and sort_key you can set the
41
- # key schema directly also
42
- # t.key_schema([
43
- # {attribute_name: "id", :key_type=>"HASH"},
44
- # {attribute_name: "created_at", :key_type=>"RANGE"}
45
- # ])
46
- # t.attribute_definitions([
47
- # {attribute_name: "id", attribute_type: "N"},
48
- # {attribute_name: "created_at", attribute_type: "S"}
49
- # ])
50
-
51
- # other ways to set provisioned_throughput
52
- # t.provisioned_throughput(:read, 10)
53
- # t.provisioned_throughput(:write, 10)
54
- # t.provisioned_throughput(
55
- # read_capacity_units: 5,
56
- # write_capacity_units: 5
57
- # )
58
-
59
- # set the billing mode to on-demand (NOTE: this overrides provisioned_throughput)
60
- # t.billing_mode(:pay_per_request)
61
- end
62
- end
63
- end
64
-
65
- class UpdateCommentsMigration < Dynomite::Migration
66
- def up
67
- update_table :comments do |t|
68
- # You can update from provisioned_throughput to on-demand pricing
69
- # t.billing_mode(:pay_per_request)
70
-
71
- # t.global_secondary_index do
72
- # t.gsi(METHOD, INDEX_NAME) do
73
-
74
- # You normally create an index like so:
75
- #
76
- # t.gsi(:create) do |i|
77
- # i.partition_key = "post_id:string" # partition_key is required
78
- # i.sort_key = "updated_at:string" # sort_key is optional
79
- # end
80
- #
81
- # The index name will be inferred from the partition_key and sort_key when
82
- # not explicitly set. Examples:
83
- #
84
- # index_name = "#{partition_key}-#{sort_key}-index"
85
- # index_name = "post_id-index" # no sort key
86
- # index_name = "post_id-updated_at-index" # has sort key
87
- #
88
- # The inference allows you to not have to worry about the index
89
- # naming scheme. You can still set the index_name explicitly like so:
90
- #
91
- # t.gsi(:create, "post_id-updated_at-index") do |i|
92
- # i.partition_key = "post_id:string" # partition_key is required
93
- # i.sort_key = "updated_at:string" # sort_key is optional
94
- # end
95
- #
96
- t.gsi(:create) do |i|
97
- i.partition_key "post_id:string"
98
- i.sort_key "updated_at:string" # optional
99
-
100
- # translates to
101
- # i.key_schema({...})
102
- # also makes sure that the schema_keys are added to the attributes_definitions
103
-
104
- # t.projected_attributes(:all) # default if not called
105
- # t.projected_attributes(:keys_only) # other ways to call
106
- # t.projected_attributes([:id, :body, :tags, :updated_at])
107
- # translates to:
108
- # Valid Values: ALL | KEYS_ONLY | INCLUDE
109
- # t.projection(
110
- # projection_type: :all, # defaults to all
111
- # )
112
- # t.projection(
113
- # projection_type: :include, # defaults to all
114
- # non_key_attributes: [:id, :body, :tags, :updated_at], # defaults to all
115
- # )
116
-
117
- i.provisioned_throughput(10)
118
- end
119
-
120
- t.gsi(:update, "category-index") do |i|
121
- i.provisioned_throughput(10)
122
- end
123
-
124
- t.gsi(:delete, "category-index")
125
- end
126
- end
127
- end
@@ -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,121 +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
- host, port = endpoint.gsub("http://", "").split(":")
47
- ip = get_endpoint_ip(host)
48
- unless ip
49
- raise "You have configured your app to use DynamoDB local, but it is not running on the host: #{host}."
50
- end
51
-
52
- open = port_open?(ip, 8000, 0.2)
53
- unless open
54
- raise "You have configured your app to use DynamoDB local, but it is not running. Please start DynamoDB local. Example: brew install --cask dynamodb-local && dynamodb-local"
55
- end
56
- end
57
-
58
- def get_endpoint_ip(host)
59
- begin
60
- IPSocket.getaddress(host)
61
- rescue SocketError
62
- false # Can return anything you want here
63
- end
64
- end
65
-
66
- # Thanks: https://gist.github.com/ashrithr/5305786
67
- def port_open?(ip, port, seconds=1)
68
- # => checks if a port is open or not
69
- Timeout::timeout(seconds) do
70
- begin
71
- TCPSocket.new(ip, port).close
72
- true
73
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
74
- false
75
- end
76
- end
77
- rescue Timeout::Error
78
- false
79
- end
80
-
81
- # useful for specs
82
- def db=(db)
83
- @@db = db
84
- end
85
-
86
- def db_config
87
- return @db_config if @db_config
88
-
89
- if defined?(Jets)
90
- config_path = "#{Jets.root}/config/dynamodb.yml"
91
- env = Jets.env
92
- else
93
- config_path = ENV['DYNOMITE_CONFIG'] || "./config/dynamodb.yml"
94
- env = ENV['DYNOMITE_ENV'] || "development"
95
- end
96
-
97
- config = YAML.load(Dynomite::Erb.result(config_path))
98
- @db_config ||= config[env] || {}
99
- end
100
-
101
- def table_namespace(*args)
102
- case args.size
103
- when 0
104
- get_table_namespace
105
- when 1
106
- set_table_namespace(args[0])
107
- end
108
- end
109
-
110
- def get_table_namespace
111
- return @table_namespace if defined?(@table_namespace)
112
-
113
- config = db_config
114
- @table_namespace = config['table_namespace']
115
- end
116
-
117
- def set_table_namespace(value)
118
- @table_namespace = value
119
- end
120
- end
121
- end
@@ -1,15 +0,0 @@
1
- module Dynomite
2
- module Errors
3
- class ValidationError < StandardError
4
- def initialize(msg)
5
- super
6
- end
7
- end
8
-
9
- class ReservedWordError < StandardError
10
- def initialize(msg)
11
- super
12
- end
13
- end
14
- end
15
- end
data/lib/dynomite/log.rb DELETED
@@ -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