dynomite 1.2.7 → 2.0.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.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -2
  3. data/CHANGELOG.md +18 -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 +45 -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 +178 -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 +12 -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
@@ -0,0 +1,29 @@
1
+ require "dynomite"
2
+
3
+ module Jets::Command
4
+ class Dynamodb < Base
5
+ desc "migrate", "Runs migrations"
6
+ long_desc Help.text('dynamodb:migrate')
7
+ def migrate
8
+ Jets.boot
9
+ Dynomite::Migration::Runner.new(options).run
10
+ end
11
+
12
+ desc "generate NAME", "Creates a migration for a DynamoDB table"
13
+ long_desc Help.text('dynamodb:generate')
14
+ option :action, desc: "create_table, update_table, delete_table. Defaults to convention based on the name of the migration."
15
+ option :partition_key, default: "id", desc: "table's partition key"
16
+ option :sort_key, default: nil, desc: "table's sort key"
17
+ option :table_name, desc: "override the the conventional table name"
18
+ def generate(name)
19
+ Dynomite::Migration::Generator.new(name, options).generate
20
+ end
21
+
22
+ desc "seed", "Seed data"
23
+ long_desc Help.text('dynamodb:seed')
24
+ def seed
25
+ Jets.boot
26
+ Dynomite::Seed.new(options).run
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ ## Examples
2
+
3
+ jets dynamodb:generate create_products --partition-key category --sort-key product_id:number
4
+ jets dynamodb:generate create_comments --partition-key post_id:string --sort-key created_at:string
5
+ jets dynamodb:generate create_posts --partition-key id # default attribute type is string
6
+ jets dynamodb:generate create_posts --partition-key id:number # attribute type will be number
7
+
8
+ ## Running migrations
9
+
10
+ $ jets dynamodb:migrate
11
+
12
+ To add global secondary indexes:
13
+
14
+ $ jets dynamodb:generate update_comments --partition-key user_id:string --sort-key created_at:string
15
+
16
+ To run:
17
+
18
+ $ jets dynamodb:migrate
19
+
20
+ ## Conventions
21
+
22
+ A create_table or update_table migration file is generated based name you provide. If `update` is included in the name then an update_table migration table is generated. If `create` is included in the name then a create_table migration table is generated.
23
+
24
+ The table_name is also inferred from the migration name you provide. Examples:
25
+
26
+ $ jets dynamodb:generate create_posts # table_name: posts
27
+ $ jets dynamodb:generate update_comments # table_name: comments
28
+
29
+ You can override both of these conventions:
30
+
31
+ $ jets dynamodb:generate create_my_posts --table-name posts
32
+ $ jets dynamodb:generate my_posts --action create_table --table-name posts
33
+ $ jets dynamodb:generate my_posts --action update_table --table-name posts
@@ -0,0 +1,3 @@
1
+ ## Examples
2
+
3
+ jets dynamodb:migrate
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.0
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-03 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