tiny_dyno 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dad49629c87d23c41034877a01393def956c568e
4
- data.tar.gz: 0e6ceca28ce34d7c53a8ed3ad4e9c75b531d8036
3
+ metadata.gz: 042ea3b53fd10c8a3a6b8ab228d568e501b1b843
4
+ data.tar.gz: 5222389a219e25dc9a40b88a6ed748e54fb381d3
5
5
  SHA512:
6
- metadata.gz: 2b0ceaaf98b68e1f216f93099aa5ee8749145a561b7e729bc92be64668894cc6fee883f6cfd7d28ca232941e0059e28f583cec51dc1cbda3d61cadbb37694527
7
- data.tar.gz: 47f32b1f3d66bc0128b505a5a64c6f971987a16490489bd9abef230e9689e6d4d1c0d6d3b796c8ff474c0f9c93c010197b0b2dfa4f73abbe3bb17f93d14d71b1
6
+ metadata.gz: 051dabb980854bc99bcb736ea43bea31df12c0eecdbf5e848c5e40f1a20e5bc6b8338e4239b218552597fb0929bfd1c1e427850e6ca1495d9315e45f77df47e5
7
+ data.tar.gz: 7df845254448752c5eb6c16ea6d1ed7fa954adc55b2dbe69e11fba1b5f47f024d01508cf6b5277b2fc1a871c297cb9ddeb240462be3d06de5b94ec7b64c74ad7
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ 0.1.12 (2015-07-04)
2
+ -------------------
3
+
4
+ * New - simple range_key support
5
+
1
6
  0.1.11 (2015-07-04)
2
7
  -------------------
3
8
 
data/README.md CHANGED
@@ -81,18 +81,32 @@ Or install it yourself as:
81
81
 
82
82
  ## Usage
83
83
 
84
+ It is highly recommended to work through the specs and also the fabricators and models in the spec folder to see example implementations.
85
+
84
86
  ```
85
87
 
88
+ require 'securerandom'
86
89
  require 'tiny_dyno'
87
90
 
88
- class Person
91
+
92
+ class Account
89
93
  include TinyDyno::Document
90
94
 
91
- hash_key :id, type: Integer
95
+ hash_key :id, type: String
96
+
97
+ field :email, type: String, range_key: true
98
+ field :label, type: String
99
+
100
+ validates_presence_of :id, :email, :label
101
+
102
+ def initialize(attrs = nil)
103
+ super
104
+ set_id if id.nil?
105
+ end
92
106
 
93
- field :first_name, type: String
94
- field :last_name, type: String
95
- field :age, type: Integer
107
+ def set_id
108
+ self.id ||= SecureRandom.uuid
109
+ end
96
110
 
97
111
  end
98
112
 
@@ -53,8 +53,9 @@ module TinyDyno
53
53
 
54
54
  module ClassMethods
55
55
 
56
+ # TODO, extract into its own class to allow better testing
56
57
  def where(options = {})
57
- valid_option_keys(options)
58
+ validate_option_keys(options)
58
59
  get_query = build_where_query(options)
59
60
  attributes = TinyDyno::Adapter.get_item(get_item_request: get_query)
60
61
  if attributes.nil?
@@ -67,16 +68,21 @@ module TinyDyno
67
68
  end
68
69
  end
69
70
 
71
+
70
72
  private
71
73
 
72
74
  # minimimum implementation for now
73
75
  # check that each option key relates to a hash_key present on the model
74
76
  # do not permit scan queries
75
- def valid_option_keys(options)
77
+ def validate_option_keys(options)
76
78
  raise TinyDyno::Errors::HashKeyOnly.new(klass: self.class, name: 'primary_key') if primary_key.nil?
77
- # options.keys.each do |name|
78
- # named = name.to_s
79
- # end
79
+ options.keys.each do |key|
80
+ raise TinyDyno::Errors::InvalidSelector.new(klass: self.class, name: key) unless valid_field_selector?(field_name: key.to_s)
81
+ end
82
+ end
83
+
84
+ def valid_field_selector?(field_name:)
85
+ key_schema.map {|k| k[:attribute_name] }.include?(field_name)
80
86
  end
81
87
 
82
88
  # minimimum implementation for now
@@ -102,3 +102,30 @@ module TinyDyno
102
102
  end
103
103
  end
104
104
 
105
+
106
+ # encoding: utf-8
107
+ module TinyDyno
108
+ module Errors
109
+
110
+ # This error is raised, when a query is performed with fields specified
111
+ # that are not HashKeys, which would result in a table scan
112
+ class InvalidSelector < TinyDynoError
113
+
114
+ # Create the new error.
115
+ #
116
+ # @example Instantiate the error.
117
+ # InvalidSelector.new(Person, "gender")
118
+ #
119
+ # @param [ Class ] klass The model class.
120
+ # @param [ String, Symbol ] name The name of the attribute.
121
+ #
122
+ # @since 3.0.0
123
+ def initialize(klass:, name:)
124
+ super(
125
+ compose_message("look up only by key fields", { klass: klass.name, name: name })
126
+ )
127
+ end
128
+ end
129
+ end
130
+ end
131
+
@@ -0,0 +1,35 @@
1
+ module TinyDyno
2
+ module Fields
3
+ class RangeKey
4
+
5
+ # Defines the behaviour for defined fields in the document.
6
+ # Set readers for the instance variables.
7
+ attr_accessor :default_val, :label, :name, :options
8
+
9
+ # Create the new field with a name and optional additional options.
10
+ #
11
+ # @example Create the new field.
12
+ # Field.new(:name, :type => String)
13
+ #
14
+ # @param [ Hash ] options The field options.
15
+ #
16
+ # @option options [ Class ] :type The class of the field.
17
+ # @option options [ Object ] :default The default value for the field.
18
+ # @option options [ String ] :label The field's label.
19
+ #
20
+ # @since 3.0.0
21
+ def initialize(name, options = {})
22
+ @name = name
23
+ @options = options
24
+ @label = options[:label]
25
+ @default_val = options[:default]
26
+ @type = options[:type]
27
+ end
28
+
29
+ def as_selector
30
+ binding.pry
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -1,4 +1,5 @@
1
1
  require 'tiny_dyno/fields/standard'
2
+ require 'tiny_dyno/fields/range_key'
2
3
 
3
4
  module TinyDyno
4
5
  module Fields
@@ -166,7 +167,6 @@ module TinyDyno
166
167
  # @param [ Field ] field the field to process
167
168
  def process_options(field)
168
169
  field_options = field.options
169
-
170
170
  Fields.options.each_pair do |option_name, handler|
171
171
  if field_options.key?(option_name)
172
172
  handler.call(self, field, field_options[option_name])
@@ -176,7 +176,14 @@ module TinyDyno
176
176
 
177
177
  def field_for(name, options)
178
178
  opts = options.merge(klass: self)
179
- Fields::Standard.new(name, opts)
179
+ if opts.has_key?(:range_key) && opts[:range_key] == true
180
+ named = name.to_s
181
+ attribute_definitions << build_attribute_definition(named,options[:type])
182
+ key_schema << { attribute_name: named, key_type: 'RANGE' }
183
+ Fields::RangeKey.new(name, opts)
184
+ else
185
+ Fields::Standard.new(name, opts)
186
+ end
180
187
  end
181
188
 
182
189
  # Create the field accessors.
@@ -37,7 +37,7 @@ module TinyDyno
37
37
  raise TinyDyno::Errors::OnlyOneHashKeyPermitted.new(klass: self.class, name: name) unless primary_key.empty?
38
38
  named = name.to_s
39
39
  attribute_definition = build_attribute_definition(named,options[:type])
40
- key_schema = build_key_schema(named)
40
+ key_schema = hash_key_schema(named)
41
41
  unless attribute_definition_meets_spec?(attribute_definition)
42
42
  raise TinyDyno::Errors::InvalidHashKey.new(klass: self.class, name: name)
43
43
  end
@@ -52,12 +52,6 @@ module TinyDyno
52
52
  }
53
53
  end
54
54
 
55
- # convert a hash key into a format as expected by
56
- # put_item and update_item request
57
- def as_item_entry(hash_key)
58
-
59
- end
60
-
61
55
  private
62
56
 
63
57
  # Return true or false, depending on whether the attribute_definitions on the model
@@ -80,17 +74,17 @@ module TinyDyno
80
74
  def build_attribute_definition(name, key_type)
81
75
  {
82
76
  attribute_name: name,
83
- attribute_type: hash_key_type(key_type)
77
+ attribute_type: determine_key_class(key_type)
84
78
  }
85
79
  end
86
80
 
87
- def hash_key_type(key_type = nil)
81
+ def determine_key_class(key_type = nil)
88
82
  return 'S' if key_type == String
89
83
  return 'N' if key_type == Fixnum or key_type == Integer
90
84
  return nil
91
85
  end
92
86
 
93
- def build_key_schema(name)
87
+ def hash_key_schema(name)
94
88
  {
95
89
  attribute_name: name,
96
90
  key_type: 'HASH'
@@ -1,3 +1,3 @@
1
1
  module TinyDyno
2
- VERSION = '0.1.11'
2
+ VERSION = '0.1.12'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_dyno
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Gerschner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-04 00:00:00.000000000 Z
11
+ date: 2015-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -190,13 +190,12 @@ files:
190
190
  - lib/tiny_dyno/extensions.rb
191
191
  - lib/tiny_dyno/extensions/module.rb
192
192
  - lib/tiny_dyno/fields.rb
193
+ - lib/tiny_dyno/fields/range_key.rb
193
194
  - lib/tiny_dyno/fields/standard.rb
194
195
  - lib/tiny_dyno/hash_key.rb
195
196
  - lib/tiny_dyno/hash_keys.rb
196
197
  - lib/tiny_dyno/loggable.rb
197
198
  - lib/tiny_dyno/persistable.rb
198
- - lib/tiny_dyno/range_attributes.rb
199
- - lib/tiny_dyno/range_key.rb
200
199
  - lib/tiny_dyno/stateful.rb
201
200
  - lib/tiny_dyno/tables.rb
202
201
  - lib/tiny_dyno/version.rb
@@ -1,15 +0,0 @@
1
- module TinyDyno
2
- module RangeAttributes
3
- extend ActiveSupport::Concern
4
-
5
- attr_reader :range_attributes
6
-
7
- included do
8
- class_attribute :range_attributes
9
-
10
- self.range_attributes = []
11
-
12
- end
13
-
14
- end
15
- end
File without changes