hyperion-api 0.1.1 → 0.1.2

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/lib/hyperion.rb CHANGED
@@ -3,6 +3,7 @@ require 'hyperion/filter'
3
3
  require 'hyperion/sort'
4
4
  require 'hyperion/util'
5
5
  require 'hyperion/format'
6
+ require 'hyperion/types'
6
7
 
7
8
  module Hyperion
8
9
 
@@ -137,15 +138,16 @@ module Hyperion
137
138
 
138
139
  def self.build_query(kind, args)
139
140
  kind = Format.format_kind(kind)
140
- filters = build_filters(args[:filters])
141
+ filters = build_filters(kind, args[:filters])
141
142
  sorts = build_sorts(args[:sorts])
142
143
  Query.new(kind, filters, sorts, args[:limit], args[:offset])
143
144
  end
144
145
 
145
- def self.build_filters(filters)
146
+ def self.build_filters(kind, filters)
146
147
  (filters || []).map do |(field, operator, value)|
147
148
  operator = Format.format_operator(operator)
148
149
  field = Format.format_field(field)
150
+ value = pack_value(kind, field, value)
149
151
  Filter.new(field, operator, value)
150
152
  end
151
153
  end
@@ -187,6 +189,14 @@ module Hyperion
187
189
  end
188
190
  end
189
191
 
192
+ def self.pack_value(kind, field, value)
193
+ kind_spec = kind_spec_for(kind)
194
+ return value unless kind_spec
195
+ field_spec = kind_spec.fields[field]
196
+ return value unless field_spec
197
+ return field_spec.pack(value)
198
+ end
199
+
190
200
  def self.packer_for(type)
191
201
  @packers[type]
192
202
  end
@@ -284,5 +284,13 @@ shared_examples_for 'Datastore' do
284
284
  found_shirt[:account_key].should == account_key
285
285
  found_account[:key].should == account_key
286
286
  end
287
+
288
+ it 'filters on foreign keys' do
289
+ account = api.save(:kind => :account)
290
+ account_key = account[:key]
291
+ shirt = api.save(:kind => :shirt, :account_key => account_key)
292
+ found_shirts = api.find_by_kind(:shirt, :filters => [[:account_key, '=', account_key]])
293
+ found_shirts[0].should == shirt
294
+ end
287
295
  end
288
296
  end
@@ -289,5 +289,9 @@ shared_examples_for 'filtering' do |actor|
289
289
  it 'passes the value to the filter' do
290
290
  actor.call([:attr, '=', 0]).value.should == 0
291
291
  end
292
+
293
+ it 'packs filter values' do
294
+ actor.call([:test, '=', 0]).value.should == 'i was packed'
295
+ end
292
296
  end
293
297
 
@@ -1,5 +1,4 @@
1
1
  require 'hyperion'
2
- require 'hyperion/types'
3
2
  require 'hyperion/shared_examples'
4
3
  require 'hyperion/fake_ds'
5
4
 
@@ -9,6 +8,10 @@ describe Hyperion do
9
8
  Hyperion
10
9
  end
11
10
 
11
+ Hyperion.defentity(:filtering) do |kind|
12
+ kind.field(:test, :packer => lambda { |value| 'i was packed' })
13
+ end
14
+
12
15
  context 'datastore' do
13
16
  it 'will throw an error if the datastore is called before assignment' do
14
17
  expect{ subject.datastore }.to raise_error
@@ -151,7 +154,7 @@ describe Hyperion do
151
154
 
152
155
  context 'parses filters' do
153
156
  include_examples 'filtering', lambda { |filter|
154
- Hyperion.find_by_kind('kind', :filters => [filter])
157
+ Hyperion.find_by_kind('filtering', :filters => [filter])
155
158
  Hyperion.datastore.queries.last.filters.first
156
159
  }
157
160
  end
@@ -217,7 +220,7 @@ describe Hyperion do
217
220
 
218
221
  context 'parses filters' do
219
222
  include_examples 'filtering', lambda { |filter|
220
- Hyperion.delete_by_kind('kind', :filters => [filter])
223
+ Hyperion.delete_by_kind('filtering', :filters => [filter])
221
224
  Hyperion.datastore.queries.last.filters.first
222
225
  }
223
226
  end
@@ -238,7 +241,7 @@ describe Hyperion do
238
241
 
239
242
  context 'parses filters' do
240
243
  include_examples 'filtering', lambda { |filter|
241
- Hyperion.count_by_kind('kind', :filters => [filter])
244
+ Hyperion.count_by_kind('filtering', :filters => [filter])
242
245
  Hyperion.datastore.queries.last.filters.first
243
246
  }
244
247
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperion-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-26 00:00:00.000000000 Z
12
+ date: 2012-11-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -50,22 +50,22 @@ executables: []
50
50
  extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
- - lib/hyperion/dev/ds_spec.rb
54
- - lib/hyperion/format.rb
53
+ - lib/hyperion.rb
54
+ - lib/hyperion/query.rb
55
+ - lib/hyperion/memory.rb
55
56
  - lib/hyperion/util.rb
56
- - lib/hyperion/filter.rb
57
+ - lib/hyperion/format.rb
57
58
  - lib/hyperion/key.rb
58
- - lib/hyperion/memory.rb
59
59
  - lib/hyperion/sort.rb
60
- - lib/hyperion/query.rb
61
60
  - lib/hyperion/types.rb
62
- - lib/hyperion.rb
61
+ - lib/hyperion/filter.rb
62
+ - lib/hyperion/dev/ds_spec.rb
63
63
  - spec/hyperion_spec.rb
64
- - spec/hyperion/util_spec.rb
65
- - spec/hyperion/key_spec.rb
66
- - spec/hyperion/shared_examples.rb
67
64
  - spec/hyperion/memory_spec.rb
65
+ - spec/hyperion/key_spec.rb
68
66
  - spec/hyperion/fake_ds.rb
67
+ - spec/hyperion/util_spec.rb
68
+ - spec/hyperion/shared_examples.rb
69
69
  homepage: https://github.com/mylesmegyesi/hyperion-ruby
70
70
  licenses:
71
71
  - Eclipse Public License
@@ -93,8 +93,8 @@ specification_version: 3
93
93
  summary: A Generic Persistence API for Ruby
94
94
  test_files:
95
95
  - spec/hyperion_spec.rb
96
- - spec/hyperion/util_spec.rb
97
- - spec/hyperion/key_spec.rb
98
- - spec/hyperion/shared_examples.rb
99
96
  - spec/hyperion/memory_spec.rb
97
+ - spec/hyperion/key_spec.rb
100
98
  - spec/hyperion/fake_ds.rb
99
+ - spec/hyperion/util_spec.rb
100
+ - spec/hyperion/shared_examples.rb