dm-appengine 0.0.1 → 0.0.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/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'date'
5
5
  require 'spec/rake/spectask'
6
6
 
7
7
  GEM = "dm-appengine"
8
- GEM_VERSION = "0.0.1"
8
+ GEM_VERSION = "0.0.2"
9
9
  AUTHOR = "Ryan Brown"
10
10
  EMAIL = "ribrdb@gmail.com"
11
11
  HOMEPAGE = "http://code.google.com/p/appengine-jruby"
@@ -17,10 +17,12 @@
17
17
  #
18
18
  # Datamapper adapter for Google App Engine
19
19
 
20
+ require 'date'
20
21
  require 'rubygems'
21
- gem 'appengine-apis', '~> 0.0.3'
22
+ require 'time'
23
+
24
+ gem 'appengine-apis', '~> 0.0.6'
22
25
 
23
- require 'appengine-apis/local_boot'
24
26
  require 'appengine-apis/datastore'
25
27
  require 'dm-core'
26
28
 
@@ -112,10 +114,20 @@ module DataMapper
112
114
  end
113
115
 
114
116
  def convert_value(property, value)
117
+ value = property.value(value)
115
118
  if property.type == DataMapper::Types::Text && value
116
119
  AppEngine::Datastore::Text.new(value)
117
120
  else
118
- value
121
+ case value
122
+ when Date, DateTime
123
+ Time.parse(value.to_s)
124
+ when BigDecimal
125
+ value.to_s
126
+ when Class
127
+ value.name
128
+ else
129
+ value
130
+ end
119
131
  end
120
132
  end
121
133
 
@@ -130,12 +142,14 @@ module DataMapper
130
142
  class QueryBuilder
131
143
  import Datastore::JavaDatastore::FetchOptions
132
144
  include Datastore::Query::Constants
145
+ include DataMapper::Query::Conditions
146
+
133
147
  @@OPERATORS = {
134
- Conditions::EqualToComparison => EQUAL,
135
- Conditions::GreaterThanComparison => GREATER_THAN,
136
- Conditions::GreaterThanOrEqualToComparison => GREATER_THAN_OR_EQUAL,
137
- Conditions::LessThanComparison => LESS_THAN,
138
- Conditions::LessThanOrEqualToComparison => LESS_THAN_OR_EQUAL,
148
+ EqualToComparison => EQUAL,
149
+ GreaterThanComparison => GREATER_THAN,
150
+ GreaterThanOrEqualToComparison => GREATER_THAN_OR_EQUAL,
151
+ LessThanComparison => LESS_THAN,
152
+ LessThanOrEqualToComparison => LESS_THAN_OR_EQUAL,
139
153
  }.freeze
140
154
 
141
155
  def initialize(query, kind, adapter)
@@ -172,24 +186,23 @@ module DataMapper
172
186
  end
173
187
 
174
188
  def parse_order(order)
175
- if order.size == 1 && order[0].direction != :desc
176
- if order[0].property.key?
189
+ if order.size == 1 && order[0].operator != :desc
190
+ if order[0].target.key?
177
191
  # omit the default key ordering.
178
192
  # This lets inequality filters work
179
193
  return
180
194
  end
181
195
  end
182
- debugger
183
196
  order.map do |order|
184
- if order.direction == :desc
197
+ if order.operator == :desc
185
198
  direction = DESCENDING
186
199
  else
187
200
  direction = ASCENDING
188
201
  end
189
- name = if order.property.key?
202
+ name = if order.target.key?
190
203
  '__key__'
191
204
  else
192
- property_name(order.property)
205
+ property_name(order.target)
193
206
  end
194
207
  @query.sort(name, direction)
195
208
  end
@@ -197,13 +210,13 @@ module DataMapper
197
210
 
198
211
  def parse_conditions(conditions)
199
212
  case conditions
200
- when Conditions::NotOperation then
213
+ when NotOperation then
201
214
  raise NotImplementedError, "NOT operator is not supported"
202
- when Conditions::AbstractComparison then
215
+ when AbstractComparison then
203
216
  parse_comparison(conditions)
204
- when Conditions::OrOperation then
217
+ when OrOperation then
205
218
  parse_or(conditions)
206
- when Conditions::AndOperation then
219
+ when AndOperation then
207
220
  parse_and(conditions)
208
221
  else
209
222
  raise ArgumentError, "invalid conditions #{conditions.class}: #{conditions.inspect}"
@@ -229,14 +242,14 @@ module DataMapper
229
242
  raise NotImplementedError, "OR only supported with key equality comparisons"
230
243
  end
231
244
  @must_be_get = true
232
- or_op.operands.each do |op|
245
+ or_op.each do |op|
233
246
  case op
234
- when Conditions::OrOperation then
247
+ when OrOperation then
235
248
  parse_or(op)
236
- when Conditions::EqualToComparison then
249
+ when EqualToComparison then
237
250
  key = parse_key(op.property, op.value)
238
251
  @keys << key
239
- when Conditions::InclusionComparison then
252
+ when InclusionComparison then
240
253
  parse_key_inclusion(op)
241
254
  else
242
255
  raise NotImplementedError, "Unsupported condition #{op.class} inside OR"
@@ -256,7 +269,7 @@ module DataMapper
256
269
  @maybe_get = false
257
270
  end
258
271
  @found_and = true
259
- op.operands.each do |conditions|
272
+ op.each do |conditions|
260
273
  parse_conditions(conditions)
261
274
  end
262
275
  end
@@ -267,9 +280,9 @@ module DataMapper
267
280
  if @maybe_get
268
281
  if property.key?
269
282
  case op
270
- when Conditions::EqualToComparison
283
+ when EqualToComparison
271
284
  @keys << parse_key(property, value)
272
- when Conditions::InclusionComparison
285
+ when InclusionComparison
273
286
  parse_key_inclusion(op)
274
287
  @must_be_get = true
275
288
  return
@@ -281,7 +294,7 @@ module DataMapper
281
294
  end
282
295
  end
283
296
 
284
- if op.kind_of? Conditions::InclusionComparison
297
+ if op.kind_of? InclusionComparison
285
298
  parse_range(op)
286
299
  else
287
300
  filter_op = @@OPERATORS[op.class]
@@ -348,8 +361,11 @@ module DataMapper
348
361
  key = entity.get_key
349
362
  hash = entity.to_hash
350
363
  @dm_query.fields.each do |property|
364
+ name = property.field
351
365
  if property.key?
352
- hash[property.field] = key.get_name || key.get_id
366
+ hash[name] = key.get_name || key.get_id
367
+ else
368
+ hash[name] = property.typecast(hash[name])
353
369
  end
354
370
  end
355
371
  hash
@@ -25,6 +25,22 @@ class TextTest
25
25
  property :text, Text
26
26
  end
27
27
 
28
+ class TypeTest
29
+ include DataMapper::Resource
30
+
31
+ property :name, String, :key => true
32
+ property :time, Time
33
+ property :date, Date
34
+ property :datetime, DateTime
35
+ property :bigd, BigDecimal
36
+ property :flower, Object
37
+ property :klass, Class
38
+ end
39
+
40
+ class Flower
41
+ attr_accessor :color
42
+ end
43
+
28
44
  class FooBar
29
45
  include DataMapper::Resource
30
46
 
@@ -97,4 +113,54 @@ describe DataMapper::Adapters::AppEngineAdapter do
97
113
  b.string.should == 'c'
98
114
  end
99
115
  end
116
+
117
+ describe 'types' do
118
+ it 'should support Date' do
119
+ date = Date.parse('2007/12/23')
120
+ a = TypeTest.new(:name => 'date', :date => date)
121
+ a.save
122
+ a.reload
123
+ a.date.should == date
124
+ end
125
+
126
+ it 'should support Time' do
127
+ time = Time.at(Time.now.to_i) # Datastore store ms precision, not usec
128
+ a = TypeTest.new(:name => 'time', :time => time)
129
+ a.save
130
+ a.reload
131
+ a.time.should == time
132
+ end
133
+
134
+ it 'should support DateTime' do
135
+ date = DateTime.parse('2007-12-23')
136
+ a = TypeTest.new(:name => 'datetime', :datetime => date)
137
+ a.save
138
+ a.reload
139
+ a.datetime.should == date
140
+ end
141
+
142
+ it 'should support BigDecimal' do
143
+ one = BigDecimal.new('1.0')
144
+ a = TypeTest.new(:name => 'bigd', :bigd => one)
145
+ a.save
146
+ a.reload
147
+ a.bigd.should == one
148
+ end
149
+
150
+ it 'should support Object' do
151
+ flower = Flower.new
152
+ flower.color = 'red'
153
+ a = TypeTest.new(:name => 'color', :flower => flower)
154
+ a.save
155
+ a.reload
156
+ a.flower.color.should == flower.color
157
+ end
158
+
159
+ it 'should support Class' do
160
+ a = TypeTest.new(:name => 'class', :klass => Flower)
161
+ a.save
162
+ a.reload
163
+ a.klass.should == Flower
164
+ end
165
+ end
100
166
  end
data/spec/spec_helper.rb CHANGED
@@ -24,5 +24,5 @@ require 'dm-appengine'
24
24
  ADAPTERS = ['default']
25
25
  PRIMARY = {'default' => "appengine://memory"}
26
26
 
27
- DataMapper::Logger.new(nil, :debug)
27
+ DataMapper::Logger.new(STDERR, :debug)
28
28
  DataMapper.setup(:default, 'appengine://memory')
metadata CHANGED
@@ -1,82 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
- required_ruby_version: !ruby/object:Gem::Requirement
3
- requirements:
4
- - - '>='
5
- - !ruby/object:Gem::Version
6
- version: "0"
7
- version:
8
- email: ribrdb@gmail.com
2
+ name: dm-appengine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Brown
8
+ autorequire: dm-appengine
9
+ bindir: bin
9
10
  cert_chain: []
10
11
 
11
- summary: A DataMapper adapter for Google App Engine
12
- post_install_message:
12
+ date: 2009-07-27 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: appengine-apis
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.3
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: dm-core
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.0
34
+ version:
35
+ description: A DataMapper adapter for Google App Engine
36
+ email: ribrdb@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
13
41
  extra_rdoc_files:
14
42
  - README.rdoc
15
43
  - LICENSE
16
- homepage: http://code.google.com/p/appengine-jruby
17
- signing_key:
18
- name: dm-appengine
19
- rdoc_options: []
20
-
21
- autorequire: dm-appengine
22
- rubyforge_project:
23
- executables: []
24
-
25
- description: A DataMapper adapter for Google App Engine
26
- specification_version: 2
27
- default_executable:
28
44
  files:
29
45
  - LICENSE
30
46
  - README.rdoc
31
47
  - Rakefile
32
- - lib/dm-appengine
33
- - lib/dm-appengine.rb
34
- - lib/dm-appengine.rb-custom_resource
48
+ - lib/appengine_adapter.rb
35
49
  - lib/dm-appengine/appengine_resource.rb
36
50
  - lib/dm-appengine/transactions.rb
51
+ - lib/dm-appengine.rb-custom_resource
37
52
  - spec/dm-appengine_spec.rb
38
53
  - spec/spec_helper.rb
54
+ has_rdoc: true
55
+ homepage: http://code.google.com/p/appengine-jruby
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options: []
60
+
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
39
69
  required_rubygems_version: !ruby/object:Gem::Requirement
40
70
  requirements:
41
- - - '>='
71
+ - - ">="
42
72
  - !ruby/object:Gem::Version
43
73
  version: "0"
44
74
  version:
45
- extensions: []
46
-
47
- rubygems_version: 1.3.1
48
75
  requirements: []
49
76
 
50
- authors:
51
- - Ryan Brown
52
- date: 2009-05-06 07:00:00 +00:00
53
- platform: ruby
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.5
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: A DataMapper adapter for Google App Engine
54
82
  test_files: []
55
83
 
56
- version: !ruby/object:Gem::Version
57
- version: 0.0.1
58
- require_paths:
59
- - lib
60
- dependencies:
61
- - !ruby/object:Gem::Dependency
62
- version_requirements: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ~>
65
- - !ruby/object:Gem::Version
66
- version: 0.0.3
67
- version:
68
- type: :runtime
69
- version_requirement:
70
- name: appengine-apis
71
- - !ruby/object:Gem::Dependency
72
- version_requirements: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ~>
75
- - !ruby/object:Gem::Version
76
- version: 0.10.0
77
- version:
78
- type: :runtime
79
- version_requirement:
80
- name: dm-core
81
- bindir: bin
82
- has_rdoc: true