dm-parse 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +94 -0
- data/Rakefile +0 -4
- data/VERSION +1 -1
- data/dm-parse.gemspec +101 -0
- data/lib/dm-parse.rb +2 -0
- data/lib/property/parse_file.rb +17 -0
- data/lib/property/parse_geo_point.rb +21 -0
- data/spec/parse_file_spec.rb +43 -0
- data/spec/parse_geo_point_spec.rb +63 -0
- data/spec/spec_helper.rb +2 -0
- metadata +9 -66
data/README.md
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
# dm-parse
|
2
|
+
|
3
|
+
A DataMapper extension for [Parse](https://parse.com/), include an adapter and some types for Parse.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Include in your `Gemfile`:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem "dm-parse"
|
11
|
+
```
|
12
|
+
|
13
|
+
Or just gem install:
|
14
|
+
|
15
|
+
```bash
|
16
|
+
gem install dm-parse
|
17
|
+
```
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
To setup the adapter:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
DataMapper.setup(:default, adapter: :parse, app_id: "your-id", api_key: "your-rest-api-key")
|
25
|
+
```
|
26
|
+
|
27
|
+
To setup with Master Key:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
DataMapper.setup(:default, adapter: :parse, app_id: "your-id", api_key: "your-master-key", master: true)
|
31
|
+
```
|
32
|
+
|
33
|
+
To define model for parse, use `is :parse`:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
class Article
|
37
|
+
include DataMapper::Resource
|
38
|
+
|
39
|
+
is :parse # it defines id, created_at and updated_at for you
|
40
|
+
|
41
|
+
property :title, String
|
42
|
+
property :body, Text
|
43
|
+
property :rank, Integer
|
44
|
+
property :closed_at, ParseDate # Date type for Parse
|
45
|
+
|
46
|
+
has n, :comments
|
47
|
+
end
|
48
|
+
|
49
|
+
class Comment
|
50
|
+
include DataMapper::Resource
|
51
|
+
|
52
|
+
is :parse
|
53
|
+
|
54
|
+
property :body, Text
|
55
|
+
|
56
|
+
belongs_to :article
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
To define a user model, use `is :parse_user`:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
class User
|
64
|
+
include DataMapper::Resource
|
65
|
+
|
66
|
+
# more than :parse, it also defines username, password and email.
|
67
|
+
# it also sets the default storage_names to "_User"
|
68
|
+
is :parse_user
|
69
|
+
storage_names[:master] = "_User"
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
By this, you can use `User.authenticate(username, password)` to sign in, and use `User.request_password_reset(email)` to reset password.
|
74
|
+
|
75
|
+
## Special properties for Parse
|
76
|
+
* ParseKey: the property for objectId, `is :parse` will define it for you.
|
77
|
+
* ParsePointer: the pointer, you just need to give it objectId value.
|
78
|
+
* ParseDate: the date, use it like you use DateTime.
|
79
|
+
* ParseFile: the file, just give it file url.
|
80
|
+
|
81
|
+
## Contributing to dm-parse
|
82
|
+
|
83
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
84
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
85
|
+
* Fork the project.
|
86
|
+
* Start a feature/bugfix branch.
|
87
|
+
* Commit and push until you are happy with your contribution.
|
88
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
89
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
90
|
+
|
91
|
+
## Copyright
|
92
|
+
|
93
|
+
Copyright (c) 2012 Zhi-Qiang Lei. See LICENSE.txt for
|
94
|
+
further details.
|
data/Rakefile
CHANGED
@@ -22,10 +22,6 @@ Jeweler::Tasks.new do |gem|
|
|
22
22
|
gem.email = "zhiqiang.lei@gmail.com"
|
23
23
|
gem.authors = ["Zhi-Qiang Lei"]
|
24
24
|
# dependencies defined in Gemfile
|
25
|
-
gem.add_dependency "dm-core", ">= 1.2"
|
26
|
-
gem.add_dependency "dm-validations", ">= 1.2"
|
27
|
-
gem.add_dependency "activesupport", ">= 3.2"
|
28
|
-
gem.add_dependency "nestful", ">= 0.0.8"
|
29
25
|
end
|
30
26
|
Jeweler::RubygemsDotOrgTasks.new
|
31
27
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/dm-parse.gemspec
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "dm-parse"
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Zhi-Qiang Lei"]
|
12
|
+
s.date = "2012-06-28"
|
13
|
+
s.description = "An extension to make DataMapper working on Parse.com"
|
14
|
+
s.email = "zhiqiang.lei@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
".rspec",
|
23
|
+
"Gemfile",
|
24
|
+
"Gemfile.lock",
|
25
|
+
"LICENSE.txt",
|
26
|
+
"README.md",
|
27
|
+
"README.rdoc",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"dm-parse.gemspec",
|
31
|
+
"lib/adapters/parse_adapter.rb",
|
32
|
+
"lib/collection.rb",
|
33
|
+
"lib/dm-parse.rb",
|
34
|
+
"lib/is/parse.rb",
|
35
|
+
"lib/parse/query.rb",
|
36
|
+
"lib/parse/resource.rb",
|
37
|
+
"lib/property/parse_date.rb",
|
38
|
+
"lib/property/parse_file.rb",
|
39
|
+
"lib/property/parse_geo_point.rb",
|
40
|
+
"lib/property/parse_key.rb",
|
41
|
+
"lib/property/parse_pointer.rb",
|
42
|
+
"spec/integration_spec.rb",
|
43
|
+
"spec/parse_adapter_spec.rb",
|
44
|
+
"spec/parse_date_spec.rb",
|
45
|
+
"spec/parse_file_spec.rb",
|
46
|
+
"spec/parse_geo_point_spec.rb",
|
47
|
+
"spec/parse_key_spec.rb",
|
48
|
+
"spec/parse_pointer_spec.rb",
|
49
|
+
"spec/query_spec.rb",
|
50
|
+
"spec/resource_spec.rb",
|
51
|
+
"spec/spec_helper.rb"
|
52
|
+
]
|
53
|
+
s.homepage = "https://github.com/siegfried/dm-parse"
|
54
|
+
s.licenses = ["MIT"]
|
55
|
+
s.require_paths = ["lib"]
|
56
|
+
s.rubygems_version = "1.8.24"
|
57
|
+
s.summary = "An extension to make DataMapper working on Parse.com"
|
58
|
+
|
59
|
+
if s.respond_to? :specification_version then
|
60
|
+
s.specification_version = 3
|
61
|
+
|
62
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
63
|
+
s.add_runtime_dependency(%q<dm-core>, [">= 1.2"])
|
64
|
+
s.add_runtime_dependency(%q<dm-validations>, [">= 1.2"])
|
65
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.2"])
|
66
|
+
s.add_runtime_dependency(%q<nestful>, [">= 0.0.8"])
|
67
|
+
s.add_development_dependency(%q<rspec>, [">= 2.10.0"])
|
68
|
+
s.add_development_dependency(%q<yard>, [">= 0.7"])
|
69
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
70
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
71
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
|
72
|
+
s.add_development_dependency(%q<simplecov>, [">= 0.6"])
|
73
|
+
s.add_development_dependency(%q<debugger>, [">= 1.1"])
|
74
|
+
else
|
75
|
+
s.add_dependency(%q<dm-core>, [">= 1.2"])
|
76
|
+
s.add_dependency(%q<dm-validations>, [">= 1.2"])
|
77
|
+
s.add_dependency(%q<activesupport>, [">= 3.2"])
|
78
|
+
s.add_dependency(%q<nestful>, [">= 0.0.8"])
|
79
|
+
s.add_dependency(%q<rspec>, [">= 2.10.0"])
|
80
|
+
s.add_dependency(%q<yard>, [">= 0.7"])
|
81
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
82
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
83
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
84
|
+
s.add_dependency(%q<simplecov>, [">= 0.6"])
|
85
|
+
s.add_dependency(%q<debugger>, [">= 1.1"])
|
86
|
+
end
|
87
|
+
else
|
88
|
+
s.add_dependency(%q<dm-core>, [">= 1.2"])
|
89
|
+
s.add_dependency(%q<dm-validations>, [">= 1.2"])
|
90
|
+
s.add_dependency(%q<activesupport>, [">= 3.2"])
|
91
|
+
s.add_dependency(%q<nestful>, [">= 0.0.8"])
|
92
|
+
s.add_dependency(%q<rspec>, [">= 2.10.0"])
|
93
|
+
s.add_dependency(%q<yard>, [">= 0.7"])
|
94
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
95
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
96
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.3"])
|
97
|
+
s.add_dependency(%q<simplecov>, [">= 0.6"])
|
98
|
+
s.add_dependency(%q<debugger>, [">= 1.1"])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
data/lib/dm-parse.rb
CHANGED
@@ -6,6 +6,8 @@ require "collection"
|
|
6
6
|
require "property/parse_key"
|
7
7
|
require "property/parse_pointer"
|
8
8
|
require "property/parse_date"
|
9
|
+
require "property/parse_file"
|
10
|
+
require "property/parse_geo_point"
|
9
11
|
require "parse/resource"
|
10
12
|
require "parse/query"
|
11
13
|
require "adapters/parse_adapter"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DataMapper
|
2
|
+
class Property
|
3
|
+
|
4
|
+
class ParseGeoPoint < Object
|
5
|
+
|
6
|
+
def dump(value)
|
7
|
+
value && {"__type" => "GeoPoint", "latitude" => value["lat"].to_f, "longitude" => value["lng"].to_f}
|
8
|
+
end
|
9
|
+
|
10
|
+
def load(value)
|
11
|
+
value && {"lat" => value["latitude"], "lng" => value["longitude"]}
|
12
|
+
end
|
13
|
+
|
14
|
+
def valid?(value)
|
15
|
+
return false if value && (value["lat"].nil? || value["lng"].nil?)
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DataMapper::Property::ParseFile do
|
4
|
+
subject { property }
|
5
|
+
|
6
|
+
let(:property) { Article.properties[:attachment] }
|
7
|
+
|
8
|
+
describe "#dump" do
|
9
|
+
subject { property.dump value }
|
10
|
+
|
11
|
+
let(:value) { "http://a.cn/a.png" }
|
12
|
+
|
13
|
+
it { should eq("__type" => "File", "name" => value) }
|
14
|
+
|
15
|
+
context "when value is nil" do
|
16
|
+
let(:value) { nil }
|
17
|
+
|
18
|
+
it { should be_nil }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#load" do
|
23
|
+
subject { property.load value }
|
24
|
+
|
25
|
+
let(:value) { { "__type" => "File", "name" => "http://a.cn/a.png" } }
|
26
|
+
|
27
|
+
it { should eq(value["name"]) }
|
28
|
+
|
29
|
+
context "when value is nil" do
|
30
|
+
let(:value) { nil }
|
31
|
+
|
32
|
+
it { should be_nil }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#valid?" do
|
37
|
+
subject { property.valid? value }
|
38
|
+
|
39
|
+
let(:value) { "http://a.cn/a.png" }
|
40
|
+
|
41
|
+
it { should be_true }
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DataMapper::Property::ParseGeoPoint do
|
4
|
+
subject { property }
|
5
|
+
|
6
|
+
let(:property) { User.properties[:location] }
|
7
|
+
|
8
|
+
describe "#dump" do
|
9
|
+
subject { property.dump value }
|
10
|
+
|
11
|
+
let(:value) { { "lat" => "20", "lng" => "50" } }
|
12
|
+
|
13
|
+
it { should eq("__type" => "GeoPoint", "latitude" => value["lat"].to_f, "longitude" => value["lng"].to_f) }
|
14
|
+
|
15
|
+
context "when value is nil" do
|
16
|
+
let(:value) { nil }
|
17
|
+
|
18
|
+
it { should be_nil }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#load" do
|
23
|
+
subject { property.load value }
|
24
|
+
|
25
|
+
let(:value) { { "__type" => "GeoPoint", "latitude" => 20.0, "longitude" => 50.0 } }
|
26
|
+
|
27
|
+
it { should eq("lat" => value["latitude"], "lng" => value["longitude"]) }
|
28
|
+
|
29
|
+
context "when value is nil" do
|
30
|
+
let(:value) { nil }
|
31
|
+
|
32
|
+
it { should be_nil }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#valid?" do
|
37
|
+
subject { property.valid? value }
|
38
|
+
|
39
|
+
let(:value) { { "lat" => lat, "lng" => lng } }
|
40
|
+
let(:lat) { "20.0" }
|
41
|
+
let(:lng) { "50.0" }
|
42
|
+
|
43
|
+
it { should be_true }
|
44
|
+
|
45
|
+
context "when lat is nil" do
|
46
|
+
let(:lat) { nil }
|
47
|
+
|
48
|
+
it { should be_false }
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when lng is nil" do
|
52
|
+
let(:lng) { nil }
|
53
|
+
|
54
|
+
it { should be_false }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when value is nil" do
|
58
|
+
let(:value) { nil }
|
59
|
+
|
60
|
+
it { should be_true }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -29,6 +29,7 @@ class User
|
|
29
29
|
|
30
30
|
is :parse_user
|
31
31
|
storage_names[:master] = "_User"
|
32
|
+
property :location, ParseGeoPoint
|
32
33
|
end
|
33
34
|
|
34
35
|
class Article
|
@@ -40,6 +41,7 @@ class Article
|
|
40
41
|
property :body, Text
|
41
42
|
property :rank, Integer
|
42
43
|
property :closed_at, ParseDate
|
44
|
+
property :attachment, ParseFile
|
43
45
|
|
44
46
|
has n, :comments
|
45
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-parse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -187,76 +187,13 @@ dependencies:
|
|
187
187
|
- - ! '>='
|
188
188
|
- !ruby/object:Gem::Version
|
189
189
|
version: '1.1'
|
190
|
-
- !ruby/object:Gem::Dependency
|
191
|
-
name: dm-core
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
|
-
requirements:
|
195
|
-
- - ! '>='
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '1.2'
|
198
|
-
type: :runtime
|
199
|
-
prerelease: false
|
200
|
-
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
|
-
requirements:
|
203
|
-
- - ! '>='
|
204
|
-
- !ruby/object:Gem::Version
|
205
|
-
version: '1.2'
|
206
|
-
- !ruby/object:Gem::Dependency
|
207
|
-
name: dm-validations
|
208
|
-
requirement: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
|
-
requirements:
|
211
|
-
- - ! '>='
|
212
|
-
- !ruby/object:Gem::Version
|
213
|
-
version: '1.2'
|
214
|
-
type: :runtime
|
215
|
-
prerelease: false
|
216
|
-
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
|
-
requirements:
|
219
|
-
- - ! '>='
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
version: '1.2'
|
222
|
-
- !ruby/object:Gem::Dependency
|
223
|
-
name: activesupport
|
224
|
-
requirement: !ruby/object:Gem::Requirement
|
225
|
-
none: false
|
226
|
-
requirements:
|
227
|
-
- - ! '>='
|
228
|
-
- !ruby/object:Gem::Version
|
229
|
-
version: '3.2'
|
230
|
-
type: :runtime
|
231
|
-
prerelease: false
|
232
|
-
version_requirements: !ruby/object:Gem::Requirement
|
233
|
-
none: false
|
234
|
-
requirements:
|
235
|
-
- - ! '>='
|
236
|
-
- !ruby/object:Gem::Version
|
237
|
-
version: '3.2'
|
238
|
-
- !ruby/object:Gem::Dependency
|
239
|
-
name: nestful
|
240
|
-
requirement: !ruby/object:Gem::Requirement
|
241
|
-
none: false
|
242
|
-
requirements:
|
243
|
-
- - ! '>='
|
244
|
-
- !ruby/object:Gem::Version
|
245
|
-
version: 0.0.8
|
246
|
-
type: :runtime
|
247
|
-
prerelease: false
|
248
|
-
version_requirements: !ruby/object:Gem::Requirement
|
249
|
-
none: false
|
250
|
-
requirements:
|
251
|
-
- - ! '>='
|
252
|
-
- !ruby/object:Gem::Version
|
253
|
-
version: 0.0.8
|
254
190
|
description: An extension to make DataMapper working on Parse.com
|
255
191
|
email: zhiqiang.lei@gmail.com
|
256
192
|
executables: []
|
257
193
|
extensions: []
|
258
194
|
extra_rdoc_files:
|
259
195
|
- LICENSE.txt
|
196
|
+
- README.md
|
260
197
|
- README.rdoc
|
261
198
|
files:
|
262
199
|
- .document
|
@@ -264,9 +201,11 @@ files:
|
|
264
201
|
- Gemfile
|
265
202
|
- Gemfile.lock
|
266
203
|
- LICENSE.txt
|
204
|
+
- README.md
|
267
205
|
- README.rdoc
|
268
206
|
- Rakefile
|
269
207
|
- VERSION
|
208
|
+
- dm-parse.gemspec
|
270
209
|
- lib/adapters/parse_adapter.rb
|
271
210
|
- lib/collection.rb
|
272
211
|
- lib/dm-parse.rb
|
@@ -274,11 +213,15 @@ files:
|
|
274
213
|
- lib/parse/query.rb
|
275
214
|
- lib/parse/resource.rb
|
276
215
|
- lib/property/parse_date.rb
|
216
|
+
- lib/property/parse_file.rb
|
217
|
+
- lib/property/parse_geo_point.rb
|
277
218
|
- lib/property/parse_key.rb
|
278
219
|
- lib/property/parse_pointer.rb
|
279
220
|
- spec/integration_spec.rb
|
280
221
|
- spec/parse_adapter_spec.rb
|
281
222
|
- spec/parse_date_spec.rb
|
223
|
+
- spec/parse_file_spec.rb
|
224
|
+
- spec/parse_geo_point_spec.rb
|
282
225
|
- spec/parse_key_spec.rb
|
283
226
|
- spec/parse_pointer_spec.rb
|
284
227
|
- spec/query_spec.rb
|
@@ -299,7 +242,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
299
242
|
version: '0'
|
300
243
|
segments:
|
301
244
|
- 0
|
302
|
-
hash: -
|
245
|
+
hash: -458598293042877060
|
303
246
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
304
247
|
none: false
|
305
248
|
requirements:
|