dynamodb_framework 0.1.4 → 1.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.
data/README.md CHANGED
@@ -25,7 +25,7 @@ To create or modify a DynamoDb instance you first need to create a migration scr
25
25
 
26
26
  **Example**
27
27
 
28
- class CreateEventTrackingTableScript < MigrationScript
28
+ class CreateEventTrackingTableScript < DynamoDbFramework::MigrationScript
29
29
 
30
30
  def initialize
31
31
  #set the timestamp for when this script was created
@@ -34,9 +34,9 @@ To create or modify a DynamoDb instance you first need to create a migration scr
34
34
 
35
35
  def apply
36
36
  #create an instance of the table manager
37
- manager = DynamoDbTableManager.new
37
+ manager = DynamoDbFramework::TableManager.new
38
38
  #create an attribute builder
39
- builder = DynamoDbAttributesBuilder.new
39
+ builder = DynamoDbFramework::AttributesBuilder.new
40
40
 
41
41
  #set the hash key attribute
42
42
  builder.add(:type, :S)
@@ -47,7 +47,7 @@ To create or modify a DynamoDb instance you first need to create a migration scr
47
47
  def undo
48
48
 
49
49
  #create an instance of the table manager
50
- manager = DynamoDbTableManager.new
50
+ manager = DynamoDbFramework::TableManager.new
51
51
 
52
52
  #drop the table
53
53
  manager.drop('event_tracking')
@@ -75,7 +75,7 @@ This method is called to connect the manager to the DynamoDb instance. If the mi
75
75
 
76
76
  **Example**
77
77
 
78
- manager = DynamoDbMigrationManager.new
78
+ manager = DynamoDbFramework::MigrationManager.new
79
79
  manager.connect
80
80
 
81
81
  ### #apply
@@ -92,7 +92,7 @@ This method is called to rollback the last migration script that was executed ag
92
92
  #rollback the last migration script
93
93
  manager.rollback
94
94
 
95
- # DynamoDbTableManager
95
+ # DynamoDbFramework::TableManager
96
96
 
97
97
  This manager object provides the following methods for managing tables within a DynamoDb instance.
98
98
 
@@ -103,7 +103,7 @@ This method is called to create a table within DynamoDb.
103
103
  **Params**
104
104
 
105
105
  - **table_name** [String] [Required] This is used to specify the name of the table to create. (Must be unique within the DynamoDb instance).
106
- - **attributes** [Hash] [Required] This is used to specify the attributes used by the keys and indexes. (Use the DynamoDbAttributesBuilder to create attributes)
106
+ - **attributes** [Hash] [Required] This is used to specify the attributes used by the keys and indexes. (Use the DynamoDbFramework::AttributesBuilder to create attributes)
107
107
  - **partition_key** [Symbol] [Required] This is the document attribute that will be used as the partition key of this table.
108
108
  - **range_key** [Symbol / nil] [Optional] This is the document attribute that will be used as the range key for this table.
109
109
  - **read_capacity** [Number] [Default=20] This is the read throughput required for this table.
@@ -115,7 +115,7 @@ This method is called to create a table within DynamoDb.
115
115
  Table with partition key, no range key and no indexes:
116
116
 
117
117
  #create an attribute builder
118
- builder = DynamoDbAttributesBuilder.new
118
+ builder = DynamoDbFramework::AttributesBuilder.new
119
119
 
120
120
  #set the partition key attribute
121
121
  builder.add(:type, :S)
@@ -126,7 +126,7 @@ Table with partition key, no range key and no indexes:
126
126
  Table with partition key, range key and no indexes:
127
127
 
128
128
  #create an attribute builder
129
- builder = DynamoDbAttributesBuilder.new
129
+ builder = DynamoDbFramework::AttributesBuilder.new
130
130
 
131
131
  #set the partition key attribute
132
132
  builder.add(:type, :S)
@@ -139,7 +139,7 @@ Table with partition key, range key and no indexes:
139
139
  Table with a global index:
140
140
 
141
141
  #create an attribute builder
142
- builder = DynamoDbAttributesBuilder.new
142
+ builder = DynamoDbFramework::AttributesBuilder.new
143
143
 
144
144
  #set the partition key attribute
145
145
  builder.add(:id, :S)
@@ -181,13 +181,13 @@ This method is called to add an index to an existing table.
181
181
  **Params**
182
182
 
183
183
  - **table_name** [String] [Required] This is the name of the index. (Must be unique within the scope of the table)
184
- - **attributes** [Hash] [Required] This is the document attributes used by the table keys and index keys. (Use the DynamoDbAttributesBuilder to create the attributes hash.)
184
+ - **attributes** [Hash] [Required] This is the document attributes used by the table keys and index keys. (Use the DynamoDbFramework::AttributesBuilder to create the attributes hash.)
185
185
  - **global_index** [Hash] [Required] This is the global index to add to the table. (Use the ***#create_global_index*** method to create the global index hash.)
186
186
 
187
187
  **Example**
188
188
 
189
189
  #build the attributes hash
190
- builder = DynamoDbAttributesBuilder.new
190
+ builder = DynamoDbFramework::AttributesBuilder.new
191
191
  #add the attribute for the tables partition key & range key (if range key required)
192
192
  builder.add(:id, :S)
193
193
  #add the attributes for the index partition key and range key (if required)
@@ -237,7 +237,7 @@ This method is called to check if an index exists on a table within the database
237
237
  => true
238
238
 
239
239
 
240
- # DynamoDbRepository
240
+ # DynamoDbFramework::Repository
241
241
 
242
242
  This is a base repository that exposes core functionality for interacting with a DynamoDb table. It is intended to be wrapped inside of a table specific repository, and is only provided to give a common way of interacting with a DynamoDb table.
243
243
 
@@ -5,7 +5,7 @@ require 'dynamodb_framework/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "dynamodb_framework"
8
- spec.version = DynamodbFramework::VERSION
8
+ spec.version = DynamoDbFramework::VERSION
9
9
  spec.authors = ["vaughanbrittonsage"]
10
10
  spec.email = ["vaughanbritton@gmail.com"]
11
11
 
@@ -1,7 +1,11 @@
1
- require "dynamodb_framework/version"
2
- require "dynamodb_framework/dynamodb_attributes_builder"
3
- require "dynamodb_framework/dynamodb_store"
4
- require "dynamodb_framework/dynamodb_table_manager"
5
- require "dynamodb_framework/dynamodb_repository"
6
- require "dynamodb_framework/dynamodb_migration_manager"
7
- require "dynamodb_framework/dynamodb_migration_script"
1
+ require_relative 'dynamodb_framework/version'
2
+ require_relative 'dynamodb_framework/dynamodb_attributes_builder'
3
+ require_relative 'dynamodb_framework/dynamodb_store'
4
+ require_relative 'dynamodb_framework/dynamodb_table_manager'
5
+ require_relative 'dynamodb_framework/dynamodb_repository'
6
+ require_relative 'dynamodb_framework/dynamodb_migration_manager'
7
+ require_relative 'dynamodb_framework/dynamodb_migration_script'
8
+ require_relative 'dynamodb_framework/dynamodb_logger'
9
+
10
+ require 'date'
11
+
@@ -1,20 +1,64 @@
1
- class DynamoDbAttributesBuilder
2
- attr_reader :attributes
1
+ module DynamoDbFramework
2
+ class AttributesBuilder
3
+ attr_reader :attributes
3
4
 
4
- def initialize
5
- @attributes = []
6
- end
5
+ def initialize
6
+ @attributes = []
7
+ end
8
+
9
+ def add_from_args(name, type, key = nil)
10
+ type_symbol = :S
11
+ if type == 'number' || type == :N || type == :number
12
+ type_symbol = :N
13
+ elsif type == 'binary' || type == :B || type == :binary
14
+ type_symbol = :B
15
+ elsif type == 'bool' || type == 'boolean' || type == :BOOL || type == :bool || type == :boolean
16
+ type_symbol = :BOOL
17
+ end
18
+
19
+ if key == 'hash' || key == :hash
20
+ key = :hash
21
+ elsif key == 'range' || key == :range
22
+ key = :range
23
+ else
24
+ key = nil
25
+ end
7
26
 
8
- def add(name, type)
9
- type_symbol = :S
10
- if type == 'number' || type == :N
11
- type_symbol = :N
12
- elsif type == 'binary' || type == :B
13
- type_symbol = :B
14
- elsif type == 'bool' || type == 'boolean' || type == :BOOL
15
- type_symbol = :BOOL
27
+ @attributes.push({ :name => name, :type => type_symbol, :key => key })
16
28
  end
17
- @attributes.push({ :name => name, :type => type_symbol })
18
- end
19
29
 
20
- end
30
+ def add_from_hash(options)
31
+ type_symbol = :S
32
+ if options[:type] == 'number' || options[:type] == :N || options[:type] == :number
33
+ type_symbol = :N
34
+ elsif options[:type] == 'binary' || options[:type] == :B || options[:type] == :binary
35
+ type_symbol = :B
36
+ elsif options[:type] == 'bool' || options[:type] == 'boolean' || options[:type] == :BOOL || options[:type] == :bool || options[:type] == :boolean
37
+ type_symbol = :BOOL
38
+ end
39
+
40
+ if options[:key] == 'hash' || options[:key] == :hash
41
+ key = :hash
42
+ elsif options[:key] == 'range' || options[:key] == :range
43
+ key = :range
44
+ else
45
+ key = nil
46
+ end
47
+
48
+ @attributes.push({ :name => options[:name], :type => type_symbol, :key => key })
49
+ end
50
+
51
+ def add(*options)
52
+
53
+ if options.length == 1 && options[0].is_a?(Hash)
54
+ add_from_hash(options[0])
55
+ elsif options.length == 3
56
+ add_from_args(options[0], options[1], options[2])
57
+ else
58
+ add_from_args(options[0], options[1])
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,7 @@
1
+ require 'logger'
2
+
3
+ module DynamoDbFramework
4
+
5
+ LOGGER = Logger.new(STDOUT)
6
+
7
+ end
@@ -1,89 +1,91 @@
1
- class DynamoDbMigrationManager
1
+ module DynamoDbFramework
2
+ class MigrationManager
2
3
 
3
- attr_reader :dynamodb_table_manager
4
- attr_reader :dynamodb_repository
4
+ attr_reader :dynamodb_table_manager
5
+ attr_reader :dynamodb_repository
5
6
 
6
- def initialize
7
- @dynamodb_repository = DynamoDbRepository.new
8
- @dynamodb_table_manager = DynamoDbTableManager.new
9
- end
10
-
11
- def connect
7
+ def initialize(store)
8
+ @dynamodb_repository = DynamoDbFramework::Repository.new(store)
9
+ @dynamodb_table_manager = DynamoDbFramework::TableManager.new(store)
10
+ end
12
11
 
13
- puts 'Connecting to DynamoDb instance.....'
12
+ def connect
14
13
 
15
- migration_table_name = 'dynamodb_migrations'
14
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Connecting to DynamoDb instance'
16
15
 
17
- #check if migration table exists
18
- if !@dynamodb_table_manager.exists?(migration_table_name)
19
- #migration table not found so create it
20
- builder = DynamoDbAttributesBuilder.new
21
- builder.add(:timestamp, :S)
22
- @dynamodb_table_manager.create(migration_table_name, builder.attributes, :timestamp)
23
- end
16
+ migration_table_name = 'dynamodb_framework_migrations'
24
17
 
25
- #set the table name for the repository
26
- @dynamodb_repository.table_name = migration_table_name
18
+ #check if migration table exists
19
+ if !@dynamodb_table_manager.exists?(migration_table_name)
20
+ #migration table not found so create it
21
+ builder = DynamoDbFramework::AttributesBuilder.new
22
+ builder.add(:timestamp, :S)
23
+ @dynamodb_table_manager.create(migration_table_name, builder.attributes, :timestamp)
24
+ end
27
25
 
28
- puts 'Connected.'
26
+ #set the table name for the repository
27
+ @dynamodb_repository.table_name = migration_table_name
29
28
 
30
- end
29
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Connected.'
31
30
 
32
- def get_executed_scripts
33
- scripts = @dynamodb_repository.all()
34
- if scripts.length > 0
35
- return scripts.sort { |a,b| b['timestamp'] <=> a['timestamp'] }.map { |i| i['timestamp'] }
36
31
  end
37
32
 
38
- return nil
39
- end
33
+ def get_executed_scripts
34
+ scripts = @dynamodb_repository.all()
35
+ if scripts.length > 0
36
+ return scripts.sort { |a,b| b['timestamp'] <=> a['timestamp'] }.map { |i| i['timestamp'] }
37
+ end
40
38
 
41
- def apply
39
+ return nil
40
+ end
42
41
 
43
- puts 'Applying migration scripts.....'
42
+ def apply
44
43
 
45
- executed_scripts = get_executed_scripts()
44
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Applying migration scripts'
46
45
 
47
- scripts = []
48
- MigrationScript.descendants.each do |ms|
49
- script = ms.new
50
- scripts.push(script)
51
- end
46
+ executed_scripts = get_executed_scripts()
52
47
 
53
- scripts.sort { |a,b| a.timestamp <=> b.timestamp }.each do |script|
54
- if executed_scripts == nil || !executed_scripts.include?(script.timestamp)
55
- puts 'Applying script: ' + script.timestamp + '.....'
56
- script.apply
57
- @dynamodb_repository.put({ :timestamp => script.timestamp })
48
+ scripts = []
49
+ DynamoDbFramework::MigrationScript.descendants.each do |ms|
50
+ script = ms.new
51
+ scripts.push(script)
58
52
  end
59
- end
60
53
 
61
- puts 'Migration scripts applied.'
54
+ scripts.sort { |a,b| a.timestamp <=> b.timestamp }.each do |script|
55
+ if executed_scripts == nil || !executed_scripts.include?(script.timestamp)
56
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Applying script: ' + script.timestamp + '.....'
57
+ script.apply
58
+ @dynamodb_repository.put({ :timestamp => script.timestamp })
59
+ end
60
+ end
62
61
 
63
- end
62
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Migration scripts applied.'
64
63
 
65
- def rollback
64
+ end
66
65
 
67
- puts 'Rolling back last migration script.....'
66
+ def rollback
68
67
 
69
- executed_scripts = get_executed_scripts()
68
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Rolling back started.'
70
69
 
71
- scripts = []
72
- MigrationScript.descendants.each do |ms|
73
- script = ms.new
74
- scripts.push(script)
75
- end
70
+ executed_scripts = get_executed_scripts()
76
71
 
77
- scripts.sort { |a,b| a.timestamp <=> b.timestamp }.each do |script|
78
- if executed_scripts != nil && executed_scripts.length > 0 && executed_scripts.include?(script.timestamp)
79
- script.undo
80
- @dynamodb_repository.delete({ :timestamp => script.timestamp })
81
- return
72
+ scripts = []
73
+ DynamoDbFramework::MigrationScript.descendants.each do |ms|
74
+ script = ms.new
75
+ scripts.push(script)
82
76
  end
83
- end
84
77
 
85
- puts 'Completed.'
78
+ scripts.sort { |a,b| a.timestamp <=> b.timestamp }.each do |script|
79
+ if executed_scripts != nil && executed_scripts.length > 0 && executed_scripts.include?(script.timestamp)
80
+ script.undo
81
+ @dynamodb_repository.delete({ :timestamp => script.timestamp })
82
+ return
83
+ end
84
+ end
86
85
 
87
- end
86
+ DynamoDbFramework::LOGGER.info '[DynamoDbFramework] - Rollback complete.'
88
87
 
89
- end
88
+ end
89
+
90
+ end
91
+ end
@@ -1,16 +1,17 @@
1
- class MigrationScript
2
- attr_accessor :timestamp
1
+ module DynamoDbFramework
2
+ class MigrationScript
3
+ attr_accessor :timestamp
3
4
 
4
- def apply
5
- raise 'Not implemented.'
6
- end
5
+ def apply
6
+ raise 'Not implemented.'
7
+ end
7
8
 
8
- def undo
9
- raise 'Not implemented.'
10
- end
9
+ def undo
10
+ raise 'Not implemented.'
11
+ end
11
12
 
12
- def self.descendants
13
- ObjectSpace.each_object(Class).select { |klass| klass < self }
13
+ def self.descendants
14
+ ObjectSpace.each_object(Class).select { |klass| klass < self }
15
+ end
14
16
  end
15
-
16
- end
17
+ end
@@ -1,193 +1,220 @@
1
- class DynamoDbRepository
1
+ require 'date'
2
2
 
3
- attr_reader :dynamodb
4
- attr_accessor :table_name
3
+ module DynamoDbFramework
4
+ class Repository
5
5
 
6
- def initialize
7
- @dynamodb = DynamoDbStore.new
8
- end
6
+ attr_reader :dynamodb
7
+ attr_accessor :table_name
9
8
 
10
- def put(item)
9
+ def initialize(store)
10
+ @dynamodb = store
11
+ end
11
12
 
12
- json_string = item.to_json
13
- json_obj = JSON.load(json_string)
13
+ def put(item)
14
14
 
15
- params =
16
- {
17
- table_name: @table_name,
18
- item: json_obj
19
- }
15
+ hash = to_hash(item)
20
16
 
21
- dynamodb.client.put_item(params)
17
+ params =
18
+ {
19
+ table_name: @table_name,
20
+ item: hash
21
+ }
22
22
 
23
- end
23
+ dynamodb.client.put_item(params)
24
24
 
25
- def delete(keys)
25
+ return true
26
26
 
27
- params =
28
- {
29
- table_name: @table_name,
30
- key: keys
31
- }
27
+ end
32
28
 
33
- dynamodb.client.delete_item(params)
29
+ def delete(keys)
34
30
 
35
- end
31
+ params =
32
+ {
33
+ table_name: @table_name,
34
+ key: keys
35
+ }
36
36
 
37
- def get_by_key(partition_key, partition_value, range_key = nil, range_value = nil)
37
+ dynamodb.client.delete_item(params)
38
38
 
39
- key = {}
40
- key[partition_key] = partition_value
41
- if(range_key != nil)
42
- key[range_key] = range_value
43
- end
39
+ return true
44
40
 
45
- params = {
46
- table_name: table_name,
47
- key: key
48
- }
41
+ end
49
42
 
50
- result = dynamodb.client.get_item(params)
51
- return map(result.item)
43
+ def get_by_key(partition_key, partition_value, range_key = nil, range_value = nil)
52
44
 
53
- end
45
+ key = {}
46
+ key[partition_key] = partition_value
47
+ if(range_key != nil)
48
+ key[range_key] = range_value
49
+ end
54
50
 
55
- def all
51
+ params = {
52
+ table_name: table_name,
53
+ key: key
54
+ }
56
55
 
57
- result = dynamodb.client.scan({
58
- :table_name => table_name
59
- })
56
+ result = dynamodb.client.get_item(params)
57
+ return result.item
60
58
 
61
- output = []
62
- result.items.each do |item|
63
- output.push(map(item))
64
59
  end
65
60
 
66
- return output
61
+ def all
67
62
 
68
- end
63
+ result = dynamodb.client.scan({
64
+ :table_name => @table_name
65
+ })
69
66
 
70
- def scan(expression, expression_params, limit = nil, count = false)
67
+ output = []
68
+ result.items.each do |item|
69
+ output.push(item)
70
+ end
71
71
 
72
- params = {
73
- :table_name => table_name
74
- }
72
+ return output
75
73
 
76
- if expression != nil
77
- params[:filter_expression] = expression
78
74
  end
79
75
 
80
- if expression_params != nil
76
+ def scan(expression, expression_params, limit = nil, count = false)
81
77
 
82
- params[:expression_attribute_names] = {}
83
- params[:expression_attribute_values] = {}
78
+ params = {
79
+ :table_name => table_name
80
+ }
84
81
 
85
- expression_params.each do |key, value|
86
- if key.starts_with?('#')
87
- params[:expression_attribute_names][key] = value
88
- elsif key.starts_with?(':')
89
- params[:expression_attribute_values][key] = value
90
- end
82
+ if expression != nil
83
+ params[:filter_expression] = expression
91
84
  end
92
85
 
93
- end
86
+ if expression_params != nil
94
87
 
95
- if limit != nil
96
- params[:limit] = limit
97
- end
88
+ params[:expression_attribute_names] = {}
89
+ params[:expression_attribute_values] = {}
98
90
 
99
- if count
100
- params[:select] = 'COUNT'
101
- else
102
- params[:select] = 'ALL_ATTRIBUTES'
103
- end
91
+ expression_params.each do |key, value|
92
+ if key[0] == '#'
93
+ params[:expression_attribute_names][key] = value
94
+ elsif key[0] == ':'
95
+ params[:expression_attribute_values][key] = value
96
+ end
97
+ end
104
98
 
105
- result = dynamodb.client.scan(params)
99
+ end
106
100
 
107
- if count
108
- return result.count
109
- else
110
- output = []
111
- result.items.each do |item|
112
- output.push(map(item))
101
+ if limit != nil
102
+ params[:limit] = limit
113
103
  end
114
104
 
115
- return output
116
- end
105
+ if count
106
+ params[:select] = 'COUNT'
107
+ else
108
+ params[:select] = 'ALL_ATTRIBUTES'
109
+ end
117
110
 
118
- end
111
+ result = dynamodb.client.scan(params)
119
112
 
120
- def query(partition_key_name, partition_key_value, range_key_name = nil, range_key_value = nil, expression = nil, expression_params = nil, index_name = nil, limit = nil, count = false)
113
+ if count
114
+ return result.count
115
+ else
116
+ output = []
117
+ result.items.each do |item|
118
+ output.push(item)
119
+ end
121
120
 
122
- params = {
123
- table_name: table_name
124
- }
121
+ return output
122
+ end
125
123
 
126
- if expression != nil
127
- params[:filter_expression] = expression
128
124
  end
129
125
 
130
- if index_name != nil
131
- params[:index_name] = index_name
132
- end
126
+ def query(partition_key_name, partition_key_value, range_key_name = nil, range_key_value = nil, expression = nil, expression_params = nil, index_name = nil, limit = nil, count = false)
133
127
 
134
- if range_key_name != nil
135
- params[:key_condition_expression] = '#partition_key = :partition_key and #range_key = :range_key'
136
- params[:expression_attribute_names] = { '#partition_key' => partition_key_name, '#range_key' => range_key_name }
137
- params[:expression_attribute_values] = { ':partition_key' => partition_key_value, ':range_key' => range_key_value }
138
- else
139
- params[:key_condition_expression] = '#partition_key = :partition_key'
140
- params[:expression_attribute_names] = { '#partition_key' => partition_key_name }
141
- params[:expression_attribute_values] = { ':partition_key' => partition_key_value }
142
- end
128
+ params = {
129
+ table_name: table_name
130
+ }
131
+
132
+ if expression != nil
133
+ params[:filter_expression] = expression
134
+ end
143
135
 
144
- if expression_params != nil
136
+ if index_name != nil
137
+ params[:index_name] = index_name
138
+ end
139
+
140
+ if range_key_name != nil
141
+ params[:key_condition_expression] = '#partition_key = :partition_key and #range_key = :range_key'
142
+ params[:expression_attribute_names] = { '#partition_key' => partition_key_name, '#range_key' => range_key_name }
143
+ params[:expression_attribute_values] = { ':partition_key' => partition_key_value, ':range_key' => range_key_value }
144
+ else
145
+ params[:key_condition_expression] = '#partition_key = :partition_key'
146
+ params[:expression_attribute_names] = { '#partition_key' => partition_key_name }
147
+ params[:expression_attribute_values] = { ':partition_key' => partition_key_value }
148
+ end
145
149
 
146
- expression_params.each do |key, value|
147
- if key.starts_with?('#')
148
- params[:expression_attribute_names][key] = value
149
- elsif key.starts_with?(':')
150
- params[:expression_attribute_values][key] = value
150
+ if expression_params != nil
151
+ expression_params.each do |key, value|
152
+ if key[0] == '#'
153
+ params[:expression_attribute_names][key] = value
154
+ elsif key[0] == ':'
155
+ params[:expression_attribute_values][key] = value
156
+ end
151
157
  end
158
+
152
159
  end
153
160
 
154
- end
161
+ if limit != nil
162
+ params[:limit] = limit
163
+ end
155
164
 
156
- if limit != nil
157
- params[:limit] = limit
158
- end
165
+ if count
166
+ params[:select] = 'COUNT'
167
+ else
168
+ params[:select] = 'ALL_ATTRIBUTES'
169
+ end
159
170
 
160
- if count
161
- params[:select] = 'COUNT'
162
- else
163
- params[:select] = 'ALL_ATTRIBUTES'
164
- end
171
+ result = dynamodb.client.query(params)
165
172
 
166
- result = dynamodb.client.query(params)
173
+ if count
174
+ return result.count
175
+ else
176
+ output = []
177
+ result.items.each do |item|
178
+ output.push(item)
179
+ end
167
180
 
168
- if count
169
- return result.count
170
- else
171
- output = []
172
- result.items.each do |item|
173
- output.push(map(item))
181
+ return output
174
182
  end
175
183
 
176
- return output
177
184
  end
178
185
 
179
- end
186
+ private
180
187
 
181
- def map(item)
182
- return item
183
- end
188
+ def to_hashb(obj)
189
+ hash = {}
190
+ obj.instance_variables.each {|var| hash[var.to_s.delete("@")] = obj.instance_variable_get(var) }
191
+ hash
192
+ end
193
+
194
+ STANDARD_TYPES = [String, Numeric, Fixnum, Integer, Float, nil, Time, Date, DateTime].freeze
184
195
 
185
- end
196
+ def is_standard_type?(obj)
197
+ return STANDARD_TYPES.detect { |type| obj.is_a?(type) } != nil
198
+ end
199
+
200
+ def to_hash(obj)
201
+ if obj.is_a?(Hash)
202
+ return obj
203
+ end
204
+
205
+ hash = {}
206
+ obj.instance_variables.each do |var|
207
+ value = obj.instance_variable_get(var)
208
+ if value.is_a?(Array)
209
+ hash[var.to_s.delete("@")] = value.collect { |i| to_hash(i) }
210
+ elsif !is_standard_type?(value)
211
+ hash[var.to_s.delete("@")] = to_hash(value)
212
+ else
213
+ hash[var.to_s.delete("@")] = value
214
+ end
215
+ end
216
+ hash
217
+ end
186
218
 
187
- class ::Hash
188
- def method_missing(name)
189
- return self[name] if key? name
190
- self.each { |k,v| return v if k.to_s.to_sym == name }
191
- super.method_missing name
192
219
  end
193
220
  end