parse-stack 1.6.13 → 1.7.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.
- checksums.yaml +4 -4
- data/Changes.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +61 -22
- data/Rakefile +1 -1
- data/bin/console +14 -6
- data/bin/parse-console +2 -1
- data/lib/parse/api/analytics.rb +1 -1
- data/lib/parse/api/push.rb +1 -1
- data/lib/parse/model/acl.rb +67 -22
- data/lib/parse/model/associations/has_many.rb +3 -3
- data/lib/parse/model/classes/user.rb +4 -4
- data/lib/parse/model/core/actions.rb +3 -3
- data/lib/parse/model/geopoint.rb +1 -1
- data/lib/parse/model/object.rb +50 -14
- data/lib/parse/query.rb +3 -3
- data/lib/parse/query/constraint.rb +1 -1
- data/lib/parse/query/constraints.rb +44 -0
- data/lib/parse/stack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 48e731586682a18f7800110c166f20536c46b717
|
|
4
|
+
data.tar.gz: e5cd663b12a7935acb772ff881ca471709de076b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 79a487df290f8e3f7efc843b8f7b079fccd5dee56e52f3821a20f75f3b391675da33ce03e23a01ed9c442305017d2cee5e1d6dcfb52074bca218ee5f8f986044
|
|
7
|
+
data.tar.gz: b54958ad9b82dd8fddc10b6c1701e20eea11701482d27403cc92c41e4db883573feb77a9ab17915738092b940ee319a6b6c394f7afa6d7360790d1b916d524b9
|
data/Changes.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
## Parse-Stack Changelog
|
|
2
2
|
|
|
3
|
+
### 1.7.0
|
|
4
|
+
- NEW: You can use `set_default_acl` to set default ACLs for your subclasses.
|
|
5
|
+
- NEW: Support for `withinPolygon` query constraint.
|
|
6
|
+
- Refactoring of the default ACL system and deprecation of `Parse::Object.acl`
|
|
7
|
+
- Parse::ACL.everyone returns an ACL instance with public read and writes.
|
|
8
|
+
- Documentation updates.
|
|
9
|
+
|
|
3
10
|
### 1.6.12
|
|
4
11
|
- NEW: Parse.use_shortnames! to utilize shorter class methods. (optional)
|
|
5
12
|
- NEW: parse-console supports `--url` option to load config from JSON url.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# Parse Stack - The Parse Server Ruby Client SDK
|
|
4
4
|
|
|
5
|
-
[Parse Stack](https://github.com/modernistik/parse-stack) is the [Parse Server](
|
|
5
|
+
[Parse Stack](https://github.com/modernistik/parse-stack) is the [Parse Server](http://parseplatform.org/) SDK, REST Client and ORM framework for [Ruby](https://www.ruby-lang.org/en/). It provides a client adapter, a query engine, an object relational mapper (ORM) and a Cloud Code Webhooks rack application.
|
|
6
6
|
|
|
7
|
-
Below is a [quick start guide](https://github.com/modernistik/parse-stack#overview), but you can also check out the full *[API Reference](https://www.modernistik.com/gems/parse-stack/)* for more detailed information about our Parse Server SDK.
|
|
7
|
+
Below is a [quick start guide](https://github.com/modernistik/parse-stack#overview), but you can also check out the full *[API Reference](https://www.modernistik.com/gems/parse-stack/index.html)* for more detailed information about our Parse Server SDK.
|
|
8
8
|
|
|
9
9
|
#### Tutorial Videos
|
|
10
10
|
1. Getting Started: https://youtu.be/zoYSGmciDlQ
|
|
@@ -15,7 +15,7 @@ Below is a [quick start guide](https://github.com/modernistik/parse-stack#overvi
|
|
|
15
15
|
[](https://github.com/modernistik/parse-stack)
|
|
16
16
|
[](https://rubygems.org/gems/parse-stack)
|
|
17
17
|
[](https://travis-ci.org/modernistik/parse-stack)
|
|
18
|
-
[](https://www.modernistik.com/gems/parse-stack/)
|
|
18
|
+
[](https://www.modernistik.com/gems/parse-stack/index.html)
|
|
19
19
|
|
|
20
20
|
### Questions?
|
|
21
21
|
[](https://gitter.im/modernistik/parse-stack?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
|
@@ -57,12 +57,12 @@ Master : true
|
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
## Overview
|
|
60
|
-
Parse-Stack is a full stack framework that utilizes several ideas behind [DataMapper](http://datamapper.org/docs/find.html) and [ActiveModel](https://github.com/rails/rails/tree/master/activemodel) to manage and maintain larger scale ruby applications and tools that utilize the [Parse Server Platform](
|
|
60
|
+
Parse-Stack is a full stack framework that utilizes several ideas behind [DataMapper](http://datamapper.org/docs/find.html) and [ActiveModel](https://github.com/rails/rails/tree/master/activemodel) to manage and maintain larger scale ruby applications and tools that utilize the [Parse Server Platform](http://parseplatform.org/). If you are familiar with these technologies, the framework should feel familiar to you.
|
|
61
61
|
|
|
62
62
|
```ruby
|
|
63
63
|
require 'parse/stack'
|
|
64
64
|
|
|
65
|
-
Parse.setup server_url: '
|
|
65
|
+
Parse.setup server_url: 'http://localhost:1337/parse',
|
|
66
66
|
app_id: APP_ID,
|
|
67
67
|
api_key: REST_API_KEY,
|
|
68
68
|
master_key: YOUR_MASTER_KEY # optional
|
|
@@ -80,6 +80,9 @@ class Song < Parse::Object
|
|
|
80
80
|
belongs_to :artist
|
|
81
81
|
# `like` is a Parse Relation to User class
|
|
82
82
|
has_many :likes, as: :user, through: :relation
|
|
83
|
+
|
|
84
|
+
# deny public write to Song records by default
|
|
85
|
+
set_default_acl :public, read: true, write: false
|
|
83
86
|
end
|
|
84
87
|
|
|
85
88
|
class Artist < Parse::Object
|
|
@@ -153,6 +156,7 @@ result = Parse.call_function :myFunctionName, {param: value}
|
|
|
153
156
|
- [Parse::ACL](#parseacl)
|
|
154
157
|
- [Parse::Session](#parsesession)
|
|
155
158
|
- [Parse::Installation](#parseinstallation)
|
|
159
|
+
- [Parse::Product](#parseproduct)
|
|
156
160
|
- [Parse::Role](#parserole)
|
|
157
161
|
- [Parse::User](#parseuser)
|
|
158
162
|
- [Signup](#signup)
|
|
@@ -188,6 +192,7 @@ result = Parse.call_function :myFunctionName, {param: value}
|
|
|
188
192
|
- [Creating, Saving and Deleting Records](#creating-saving-and-deleting-records)
|
|
189
193
|
- [Create](#create)
|
|
190
194
|
- [Saving](#saving)
|
|
195
|
+
- [Saving applying User ACLs](#saving-applying-user-acls)
|
|
191
196
|
- [Raising an exception when save fails](#raising-an-exception-when-save-fails)
|
|
192
197
|
- [Modifying Associations](#modifying-associations)
|
|
193
198
|
- [Batch Requests](#batch-requests)
|
|
@@ -229,6 +234,7 @@ result = Parse.call_function :myFunctionName, {param: value}
|
|
|
229
234
|
- [Geo Queries](#geo-queries)
|
|
230
235
|
- [Max Distance Constraint](#max-distance-constraint)
|
|
231
236
|
- [Bounding Box Constraint](#bounding-box-constraint)
|
|
237
|
+
- [Polygon Area Constraint](#polygon-area-constraint)
|
|
232
238
|
- [Relational Queries](#relational-queries)
|
|
233
239
|
- [Compound Queries](#compound-queries)
|
|
234
240
|
- [Query Scopes](#query-scopes)
|
|
@@ -244,7 +250,8 @@ result = Parse.call_function :myFunctionName, {param: value}
|
|
|
244
250
|
- [Register Webhooks](#register-webhooks)
|
|
245
251
|
- [Parse REST API Client](#parse-rest-api-client)
|
|
246
252
|
- [Request Caching](#request-caching)
|
|
247
|
-
- [
|
|
253
|
+
- [Contributing](#contributing)
|
|
254
|
+
- [License](#license)
|
|
248
255
|
|
|
249
256
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|
250
257
|
|
|
@@ -590,11 +597,27 @@ All `Parse::Object` subclasses have an `acl` property by default. With this prop
|
|
|
590
597
|
|
|
591
598
|
artist.save
|
|
592
599
|
```
|
|
600
|
+
You may also set default ACLs for newly created insatnces of your subclasses using `set_default_acl`:
|
|
601
|
+
|
|
602
|
+
```ruby
|
|
603
|
+
class AdminData < Parse::Object
|
|
604
|
+
|
|
605
|
+
# Disable public read and write
|
|
606
|
+
set_default_acl :public, read: false, write: false
|
|
607
|
+
|
|
608
|
+
# but allow members of the Admin role to read and write
|
|
609
|
+
set_default_acl 'Admin', role: true, read: true, write: true
|
|
610
|
+
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
data = AdminData.new
|
|
614
|
+
data.acl # => ACL({"role:Admin"=>{"read"=>true, "write"=>true}})
|
|
615
|
+
```
|
|
593
616
|
|
|
594
617
|
For more information about Parse record ACLs, see the documentation at [Security](http://docs.parseplatform.org/rest/guide/#security)
|
|
595
618
|
|
|
596
619
|
### [Parse::Session](https://www.modernistik.com/gems/parse-stack/Parse/Session.html)
|
|
597
|
-
This class represents the data and columns contained in the standard Parse `_Session` collection. You may add additional properties and methods to this class. See [Session API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Session). You may call `Parse.use_shortnames!` to use `Session` in addition to `Parse::Session`.
|
|
620
|
+
This class represents the data and columns contained in the standard Parse `_Session` collection. You may add additional properties and methods to this class. See [Session API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Session.html). You may call `Parse.use_shortnames!` to use `Session` in addition to `Parse::Session`.
|
|
598
621
|
|
|
599
622
|
You can get a specific `Parse::Session` given a session_token by using the `session` method. You can also find the user tied to a specific Parse session or session token with `Parse::User.session`.
|
|
600
623
|
|
|
@@ -606,25 +629,25 @@ session.user # the Parse user for this session
|
|
|
606
629
|
# or fetch user with a session token
|
|
607
630
|
user = Parse::User.session(token)
|
|
608
631
|
|
|
609
|
-
# save an object with the
|
|
632
|
+
# save an object with the privileges (ACLs) of this user
|
|
610
633
|
some_object.save( session: user.session_token )
|
|
611
634
|
|
|
612
|
-
# delete an object with the
|
|
635
|
+
# delete an object with the privileges of this user
|
|
613
636
|
some_object.destroy( session: user.session_token )
|
|
614
637
|
|
|
615
638
|
```
|
|
616
639
|
|
|
617
|
-
### [Parse::Installation](https://www.modernistik.com/gems/parse-stack/Parse/Installation)
|
|
618
|
-
This class represents the data and columns contained in the standard Parse `_Installation` collection. You may add additional properties and methods to this class. See [Installation API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Installation). You may call `Parse.use_shortnames!` to use `Installation` in addition to `Parse::Installation`.
|
|
640
|
+
### [Parse::Installation](https://www.modernistik.com/gems/parse-stack/Parse/Installation.html)
|
|
641
|
+
This class represents the data and columns contained in the standard Parse `_Installation` collection. You may add additional properties and methods to this class. See [Installation API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Installation.html). You may call `Parse.use_shortnames!` to use `Installation` in addition to `Parse::Installation`.
|
|
619
642
|
|
|
620
|
-
### [Parse::Product](https://www.modernistik.com/gems/parse-stack/Parse/Product)
|
|
621
|
-
This class represents the data and columns contained in the standard Parse `_Product` collection. You may add additional properties and methods to this class. See [Product API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Product). You may call `Parse.use_shortnames!` to use `Product` in addition to `Parse::Product`.
|
|
643
|
+
### [Parse::Product](https://www.modernistik.com/gems/parse-stack/Parse/Product.html)
|
|
644
|
+
This class represents the data and columns contained in the standard Parse `_Product` collection. You may add additional properties and methods to this class. See [Product API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Product.html). You may call `Parse.use_shortnames!` to use `Product` in addition to `Parse::Product`.
|
|
622
645
|
|
|
623
|
-
### [Parse::Role](https://www.modernistik.com/gems/parse-stack/Parse/Role)
|
|
624
|
-
This class represents the data and columns contained in the standard Parse `_Role` collection. You may add additional properties and methods to this class. See [Roles API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Role). You may call `Parse.use_shortnames!` to use `Role` in addition to `Parse::Role`.
|
|
646
|
+
### [Parse::Role](https://www.modernistik.com/gems/parse-stack/Parse/Role.html)
|
|
647
|
+
This class represents the data and columns contained in the standard Parse `_Role` collection. You may add additional properties and methods to this class. See [Roles API Reference](https://www.modernistik.com/gems/parse-stack/Parse/Role.html). You may call `Parse.use_shortnames!` to use `Role` in addition to `Parse::Role`.
|
|
625
648
|
|
|
626
|
-
### [Parse::User](https://www.modernistik.com/gems/parse-stack/Parse/User)
|
|
627
|
-
This class represents the data and columns contained in the standard Parse `_User` collection. You may add additional properties and methods to this class. See [User API Reference](https://www.modernistik.com/gems/parse-stack/Parse/User). You may call `Parse.use_shortnames!` to use `User` in addition to `Parse::User`.
|
|
649
|
+
### [Parse::User](https://www.modernistik.com/gems/parse-stack/Parse/User.html)
|
|
650
|
+
This class represents the data and columns contained in the standard Parse `_User` collection. You may add additional properties and methods to this class. See [User API Reference](https://www.modernistik.com/gems/parse-stack/Parse/User.html). You may call `Parse.use_shortnames!` to use `User` in addition to `Parse::User`.
|
|
628
651
|
|
|
629
652
|
#### Signup
|
|
630
653
|
You can signup new users in two ways. You can either use a class method `Parse::User.signup` to create a new user with the minimum fields of username, password and email, or create a `Parse::User` object can call the `signup!` method. If signup fails, it will raise the corresponding exception.
|
|
@@ -638,7 +661,7 @@ user.signup!
|
|
|
638
661
|
```
|
|
639
662
|
|
|
640
663
|
##### Third-Party Services
|
|
641
|
-
You can signup users using third-party services like Facebook and Twitter as described in: [Signing Up and Logging In](http://docs.parseplatform.org/rest/guide/#signing-up). To do this with Parse-Stack, you can call the `Parse::User.autologin_service` method by passing the service name and the corresponding authentication hash data. For a listing of supported third-party authentication services, see [OAuth](
|
|
664
|
+
You can signup users using third-party services like Facebook and Twitter as described in: [Signing Up and Logging In](http://docs.parseplatform.org/rest/guide/#signing-up). To do this with Parse-Stack, you can call the `Parse::User.autologin_service` method by passing the service name and the corresponding authentication hash data. For a listing of supported third-party authentication services, see [OAuth](http://docs.parseplatform.org/parse-server/guide/#oauth-and-3rd-party-authentication).
|
|
642
665
|
|
|
643
666
|
```ruby
|
|
644
667
|
fb_auth = {}
|
|
@@ -1374,7 +1397,7 @@ To commit a new record or changes to an existing record to Parse, use the `#save
|
|
|
1374
1397
|
The save operation can handle both creating and updating existing objects. If you do not want to update the association data of a changed object, you may use the `#update` method to only save the changed property values. In the case where you want to force update an object even though it has not changed, to possibly trigger your `before_save` hooks, you can use the `#update!` method. In addition, just like with other ActiveModel objects, you may call `reload!` to fetch the current record again from the data store.
|
|
1375
1398
|
|
|
1376
1399
|
### Saving applying User ACLs
|
|
1377
|
-
You may save and delete objects from Parse on behalf of a logged in user by passing the session token to the call to `save` or `destroy`. Doing so will allow Parse to apply the ACLs of this user against the record to see if the user is authorized to read or write the record. See [Parse::Actions](https://www.modernistik.com/gems/parse-stack/Parse/Actions).
|
|
1400
|
+
You may save and delete objects from Parse on behalf of a logged in user by passing the session token to the call to `save` or `destroy`. Doing so will allow Parse to apply the ACLs of this user against the record to see if the user is authorized to read or write the record. See [Parse::Actions](https://www.modernistik.com/gems/parse-stack/Parse/Core/Actions.html).
|
|
1378
1401
|
|
|
1379
1402
|
```ruby
|
|
1380
1403
|
user = Parse::User.login('myuser','pass')
|
|
@@ -1745,7 +1768,7 @@ The `where` clause is based on utilizing a set of constraints on the defined col
|
|
|
1745
1768
|
{ :column.constraint => value }
|
|
1746
1769
|
```
|
|
1747
1770
|
|
|
1748
|
-
## Query Constraints
|
|
1771
|
+
## [Query Constraints](https://www.modernistik.com/gems/parse-stack/Parse/Constraint.html)
|
|
1749
1772
|
Most of the constraints supported by Parse are available to `Parse::Query`. Assuming you have a column named `field`, here are some examples. For an explanation of the constraints, please see [Parse Query Constraints documentation](http://docs.parseplatform.org/rest/guide/#queries). You can build your own custom query constraints by creating a `Parse::Constraint` subclass. For all these `where` clauses assume `q` is a `Parse::Query` object.
|
|
1750
1773
|
|
|
1751
1774
|
#### Equals
|
|
@@ -1958,7 +1981,7 @@ Song.all :artist => Artist.pointer(artist_id)
|
|
|
1958
1981
|
Song.all :artist => Parse::Pointer.new("Artist", artist_id)
|
|
1959
1982
|
```
|
|
1960
1983
|
|
|
1961
|
-
### Geo Queries
|
|
1984
|
+
### [Geo Queries](https://www.modernistik.com/gems/parse-stack/Parse/Constraint/NearSphereQueryConstraint.html)
|
|
1962
1985
|
Equivalent to the `$nearSphere` Parse query operation. This is only applicable if the field is of type `GeoPoint`. This will query Parse and return a list of results ordered by distance with the nearest object being first.
|
|
1963
1986
|
|
|
1964
1987
|
```ruby
|
|
@@ -1984,7 +2007,7 @@ PlaceObject.all :location.near => geopoint.max_miles(10)
|
|
|
1984
2007
|
|
|
1985
2008
|
We will support `$maxDistanceInKilometers` (for kms) and `$maxDistanceInRadians` (for radian angle) in the future.
|
|
1986
2009
|
|
|
1987
|
-
#### Bounding Box Constraint
|
|
2010
|
+
#### [Bounding Box Constraint](https://www.modernistik.com/gems/parse-stack/Parse/Constraint/WithinGeoBoxQueryConstraint.html)
|
|
1988
2011
|
Equivalent to the `$within` Parse query operation and `$box` geopoint constraint. The rectangular bounding box is defined by a southwest point as the first parameter, followed by the a northeast point. Please note that Geo box queries that cross the international date lines are not currently supported by Parse.
|
|
1989
2012
|
|
|
1990
2013
|
```ruby
|
|
@@ -1999,6 +2022,22 @@ ne = Parse::GeoPoint.new 36.12, -115.31 # Las Vegas
|
|
|
1999
2022
|
PlaceObject.all :location.within_box => [sw,ne]
|
|
2000
2023
|
```
|
|
2001
2024
|
|
|
2025
|
+
#### [Polygon Area Constraint](https://www.modernistik.com/gems/parse-stack/Parse/Constraint/WithinPolygonQueryConstraint.html)
|
|
2026
|
+
Equivalent to the `$geoWithin` Parse query operation and `$polygon` geopoint constraint. The polygon area is described by a list of `Parse::GeoPoint` objects and should contain 3 or more points. This feature is only available in Parse-Server version 2.4.2 and later.
|
|
2027
|
+
|
|
2028
|
+
```ruby
|
|
2029
|
+
# As many points as you want, minimum 3
|
|
2030
|
+
q.where :field.within_polygon => [geopoint1, geopoint2, geopoint3]
|
|
2031
|
+
|
|
2032
|
+
# Polygon for the Bermuda Triangle
|
|
2033
|
+
bermuda = Parse::GeoPoint.new 32.3078000,-64.7504999 # Bermuda
|
|
2034
|
+
miami = Parse::GeoPoint.new 25.7823198,-80.2660226 # Miami, FL
|
|
2035
|
+
san_juan = Parse::GeoPoint.new 18.3848232,-66.0933608 # San Juan, PR
|
|
2036
|
+
|
|
2037
|
+
# get all sunken ships inside the Bermuda Triangle
|
|
2038
|
+
SunkenShip.all :location.within_polygon => [bermuda, san_juan, miami]
|
|
2039
|
+
```
|
|
2040
|
+
|
|
2002
2041
|
### Relational Queries
|
|
2003
2042
|
Equivalent to the `$relatedTo` Parse query operation. If you want to retrieve objects that are members of a `Relation` field in your Parse class.
|
|
2004
2043
|
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
|
@@ -6,16 +6,24 @@ require 'dotenv'
|
|
|
6
6
|
require 'byebug'
|
|
7
7
|
Dotenv.load
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
def setup
|
|
10
|
+
Parse.setup # cache: 'redis://localhost:6379'
|
|
10
11
|
|
|
11
|
-
puts "[ParseServerURL] #{Parse.client.server_url}"
|
|
12
|
-
puts "[ParseAppID] #{Parse.client.app_id}"
|
|
12
|
+
puts "[ParseServerURL] #{Parse.client.server_url}"
|
|
13
|
+
puts "[ParseAppID] #{Parse.client.app_id}"
|
|
13
14
|
|
|
14
|
-
if Parse.client.master_key.present?
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if Parse.client.master_key.present?
|
|
16
|
+
Parse.auto_generate_models!.each do |model|
|
|
17
|
+
puts "Generated #{model}"
|
|
18
|
+
end
|
|
17
19
|
end
|
|
20
|
+
|
|
18
21
|
end
|
|
22
|
+
puts "Type 'setup' to connect to Parse-Server"
|
|
23
|
+
|
|
24
|
+
# Create shortnames
|
|
25
|
+
Parse.use_shortnames!
|
|
26
|
+
|
|
19
27
|
# You can add fixtures and/or initialization code here to make experimenting
|
|
20
28
|
# with your gem easier. You can also use a different console, if you like.
|
|
21
29
|
|
data/bin/parse-console
CHANGED
data/lib/parse/api/analytics.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Parse
|
|
|
10
10
|
# Send analytics data.
|
|
11
11
|
# @param event_name [String] the name of the event.
|
|
12
12
|
# @param metrics [Hash] the metrics to attach to event.
|
|
13
|
-
# @see
|
|
13
|
+
# @see http://docs.parseplatform.org/rest/guide/#analytics Parse Analytics
|
|
14
14
|
def send_analytics(event_name, metrics = {})
|
|
15
15
|
request :post, "events/#{event_name}", body: metrics
|
|
16
16
|
end
|
data/lib/parse/api/push.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Parse
|
|
|
12
12
|
# Update the schema for a collection.
|
|
13
13
|
# @param payload [Hash] the paylod for the Push notification.
|
|
14
14
|
# @return [Parse::Response]
|
|
15
|
-
# @see
|
|
15
|
+
# @see http://docs.parseplatform.org/rest/guide/#sending-pushes Sending Pushes
|
|
16
16
|
def push(payload = {})
|
|
17
17
|
request :post, PUSH_PATH, body: payload.as_json
|
|
18
18
|
end
|
data/lib/parse/model/acl.rb
CHANGED
|
@@ -39,10 +39,10 @@ module Parse
|
|
|
39
39
|
# An ACL represents the dirty-trackable Parse Permissions object used for
|
|
40
40
|
# each record. In Parse, it is composed a hash-like object that represent
|
|
41
41
|
# {Parse::User} objectIds and/or a set of {Parse::Role} names. For each entity
|
|
42
|
-
# (ex. User/Role/Public), you can define read/write
|
|
42
|
+
# (ex. User/Role/Public), you can define read/write privileges on a particular
|
|
43
43
|
# record through a {Parse::ACL::Permission} instance.
|
|
44
44
|
#
|
|
45
|
-
# If you want to give
|
|
45
|
+
# If you want to give privileges for an action (ex. read/write),
|
|
46
46
|
# you set that particular permission it to true. If you want to deny a
|
|
47
47
|
# permission, then you set it to false. Any denied permissions will not be
|
|
48
48
|
# part of the final hash structure that is sent to parse, as omission of a permission
|
|
@@ -82,8 +82,26 @@ module Parse
|
|
|
82
82
|
# artist.acl.apply_role "Admins", true, true
|
|
83
83
|
#
|
|
84
84
|
# artist.save
|
|
85
|
+
#
|
|
86
|
+
# You may also set default ACLs for your subclasses by using {Parse::Object.set_default_acl}.
|
|
87
|
+
# These will be get applied for newly created instances. All subclasses have
|
|
88
|
+
# public read and write enabled by default.
|
|
89
|
+
#
|
|
90
|
+
# class AdminData < Parse::Object
|
|
91
|
+
#
|
|
92
|
+
# # Disable public read and write
|
|
93
|
+
# set_default_acl :public, read: true, write: false
|
|
94
|
+
#
|
|
95
|
+
# # Allow Admin roles to read/write
|
|
96
|
+
# set_default_acl 'Admin', role: true, read: true, write: true
|
|
97
|
+
#
|
|
98
|
+
# end
|
|
99
|
+
#
|
|
100
|
+
# data = AdminData.new
|
|
101
|
+
# data.acl # => ACL({"role:Admin"=>{"read"=>true, "write"=>true}})
|
|
102
|
+
#
|
|
85
103
|
# For more information about Parse record ACLs, see the documentation on
|
|
86
|
-
# {
|
|
104
|
+
# {http://docs.parseplatform.org/rest/guide/#security Security}.
|
|
87
105
|
class ACL < DataType
|
|
88
106
|
|
|
89
107
|
# @!attribute permissions
|
|
@@ -101,20 +119,28 @@ module Parse
|
|
|
101
119
|
@permissions ||= {}
|
|
102
120
|
end
|
|
103
121
|
# The key field value for public permissions.
|
|
104
|
-
PUBLIC = "*"
|
|
122
|
+
PUBLIC = "*".freeze
|
|
105
123
|
|
|
106
124
|
# Create a new ACL with default Public read/write permissions and any
|
|
107
125
|
# overrides from the input hash format.
|
|
108
126
|
# @param acls [Hash] a Parse-compatible hash acl format.
|
|
109
127
|
# @param owner [Parse::Object] a delegate to receive notifications of acl changes.
|
|
110
128
|
# This delegate must support receiving `acl_will_change!` method.
|
|
111
|
-
def initialize(acls =
|
|
112
|
-
|
|
129
|
+
def initialize(acls = nil, owner: nil)
|
|
130
|
+
acls = acls.as_json if acls.is_a?(ACL)
|
|
131
|
+
self.attributes = acls if acls.is_a?(Hash)
|
|
113
132
|
@delegate = owner
|
|
114
|
-
|
|
115
|
-
self.attributes = acls
|
|
116
|
-
end
|
|
133
|
+
end
|
|
117
134
|
|
|
135
|
+
# Create a new ACL with default Public read/write permissions and any
|
|
136
|
+
# overrides from the input hash format.
|
|
137
|
+
# @param read [Boolean] the read permissions for PUBLIC (default: true)
|
|
138
|
+
# @param write [Boolean] the write permissions for PUBLIC (default: true)
|
|
139
|
+
# @version 1.7.0
|
|
140
|
+
def self.everyone(read = true, write = true)
|
|
141
|
+
acl = Parse::ACL.new
|
|
142
|
+
acl.everyone(read, write)
|
|
143
|
+
acl
|
|
118
144
|
end
|
|
119
145
|
|
|
120
146
|
# Create a new ACL::Permission instance with the supplied read and write values.
|
|
@@ -125,12 +151,27 @@ module Parse
|
|
|
125
151
|
def self.permission(read, write = nil)
|
|
126
152
|
ACL::Permission.new(read, write)
|
|
127
153
|
end
|
|
128
|
-
|
|
129
|
-
# @
|
|
154
|
+
# Determines whether two ACLs or a Parse-ACL hash is equivalent to this object.
|
|
155
|
+
# @example
|
|
156
|
+
# acl = Parse::ACL.new
|
|
157
|
+
# # create a public read-only ACL
|
|
158
|
+
# acl.apply :public, true, false
|
|
159
|
+
# acl.as_json # => {'*' => { "read" => true }}
|
|
160
|
+
#
|
|
161
|
+
# create a second instance with similar privileges
|
|
162
|
+
# acl2 = Parse::ACL.everyone(true, false)
|
|
163
|
+
# acl2.as_json # => {'*' => { "read" => true }}
|
|
164
|
+
#
|
|
165
|
+
# acl == acl2 # => true
|
|
166
|
+
# acl == {'*' => { "read" => true }} # hash ok too
|
|
167
|
+
#
|
|
168
|
+
# acl2.apply_role 'Admin', true, true # rw for Admins
|
|
169
|
+
# acl == acl2 # => false
|
|
170
|
+
#
|
|
171
|
+
# @return [Boolean] whether two ACLs have the same set of privileges.
|
|
130
172
|
def ==(other_acl)
|
|
131
|
-
return false unless other_acl.is_a?(self.class)
|
|
132
|
-
|
|
133
|
-
permissions.keys.all? { |per| permissions[per] == other_acl.permissions[per] }
|
|
173
|
+
return false unless other_acl.is_a?(self.class) || other_acl.is_a?(Hash)
|
|
174
|
+
as_json == other_acl.as_json
|
|
134
175
|
end
|
|
135
176
|
|
|
136
177
|
# Set the public read and write permissions.
|
|
@@ -162,7 +203,7 @@ module Parse
|
|
|
162
203
|
end
|
|
163
204
|
end
|
|
164
205
|
|
|
165
|
-
# Apply a new permission with a given objectId
|
|
206
|
+
# Apply a new permission with a given objectId, tag or :public.
|
|
166
207
|
# @overload apply(user, read = nil, write = nil)
|
|
167
208
|
# Set the read and write permissions for this user on this ACL.
|
|
168
209
|
# @param user [Parse::User] the user object.
|
|
@@ -175,7 +216,8 @@ module Parse
|
|
|
175
216
|
# @param write [Boolean] the write permission.
|
|
176
217
|
# @overload apply(id, read = nil, write = nil)
|
|
177
218
|
# Set the read and write permissions for this objectId on this ACL.
|
|
178
|
-
# @param id [String] the objectId for a {Parse::User}.
|
|
219
|
+
# @param id [String|:public] the objectId for a {Parse::User}. If :public is passed,
|
|
220
|
+
# then the {Parse::ACL::PUBLIC} read and write permissions will be modified.
|
|
179
221
|
# @param read [Boolean] the read permission.
|
|
180
222
|
# @param write [Boolean] the write permission.
|
|
181
223
|
# @return [Hash] the current set of permissions.
|
|
@@ -183,12 +225,14 @@ module Parse
|
|
|
183
225
|
def apply(id, read = nil, write = nil)
|
|
184
226
|
return apply_role(id,read,write) if id.is_a?(Parse::Role)
|
|
185
227
|
id = id.id if id.is_a?(Parse::Pointer)
|
|
186
|
-
|
|
228
|
+
unless id.present?
|
|
229
|
+
raise ArgumentError, "Invalid argument applying ACLs: must be either objectId, role or :public"
|
|
230
|
+
end
|
|
231
|
+
id = PUBLIC if id.to_sym == :public
|
|
187
232
|
# create a new Permissions
|
|
188
233
|
permission = ACL.permission(read, write)
|
|
189
234
|
# if the input is already an Permission object, then set it directly
|
|
190
235
|
permission = read if read.is_a?(Parse::ACL::Permission)
|
|
191
|
-
|
|
192
236
|
if permission.is_a?(ACL::Permission)
|
|
193
237
|
if permissions[id.to_s] != permission
|
|
194
238
|
will_change! # dirty track
|
|
@@ -215,6 +259,8 @@ module Parse
|
|
|
215
259
|
|
|
216
260
|
# Used for object conversion when formatting the input/output value in
|
|
217
261
|
# Parse::Object properties
|
|
262
|
+
# @param value [Hash] a Parse ACL hash to construct a Parse::ACL instance.
|
|
263
|
+
# @param delegate [Object] any object that would need to be notified of changes.
|
|
218
264
|
# @return [ACL]
|
|
219
265
|
# @see Parse::DataType
|
|
220
266
|
def self.typecast(value, delegate = nil)
|
|
@@ -224,8 +270,7 @@ module Parse
|
|
|
224
270
|
# Used for JSON serialization. Only if an attribute is non-nil, do we allow it
|
|
225
271
|
# in the Permissions hash, since omission means denial of priviledge. If the
|
|
226
272
|
# permission value has neither read or write, then the entire record has been denied
|
|
227
|
-
# all
|
|
228
|
-
|
|
273
|
+
# all privileges
|
|
229
274
|
# @return [Hash]
|
|
230
275
|
def attributes
|
|
231
276
|
permissions.select {|k,v| v.present? }.as_json
|
|
@@ -280,7 +325,7 @@ module Parse
|
|
|
280
325
|
# @return [Boolean] whether this permission is allowed.
|
|
281
326
|
attr_reader :write
|
|
282
327
|
|
|
283
|
-
# Create a new permission with the given read and write
|
|
328
|
+
# Create a new permission with the given read and write privileges.
|
|
284
329
|
# @overload new(read = nil, write = nil)
|
|
285
330
|
# @param read [Boolean] whether reading is allowed.
|
|
286
331
|
# @param write [Boolean] whether writing is allowed.
|
|
@@ -293,7 +338,7 @@ module Parse
|
|
|
293
338
|
#
|
|
294
339
|
def initialize(r_perm = nil, w_perm = nil)
|
|
295
340
|
if r_perm.is_a?(Hash)
|
|
296
|
-
r_perm.symbolize_keys
|
|
341
|
+
r_perm = r_perm.symbolize_keys
|
|
297
342
|
@read = r_perm[:read].present?
|
|
298
343
|
@write = r_perm[:write].present?
|
|
299
344
|
else
|
|
@@ -15,7 +15,7 @@ module Parse
|
|
|
15
15
|
# to implement your associations, will affect how `has_many` works in
|
|
16
16
|
# Parse-Stack. Parse natively supports one-to-many and many-to-many
|
|
17
17
|
# relationships using `Array` and `Relations`, as described in
|
|
18
|
-
# {
|
|
18
|
+
# {http://docs.parseplatform.org/js/guide/#relations Parse Relational Data}.
|
|
19
19
|
# Both of these methods require you define a specific column type in your
|
|
20
20
|
# Parse table that will be used to store information about the association.
|
|
21
21
|
#
|
|
@@ -169,7 +169,7 @@ module Parse
|
|
|
169
169
|
# *ParseRelation-Approach*
|
|
170
170
|
#
|
|
171
171
|
# Other than the use of arrays, Parse supports native one-to-many and many-to-many
|
|
172
|
-
# associations through what is referred to as a {
|
|
172
|
+
# associations through what is referred to as a {http://docs.parseplatform.org/js/guide/#many-to-many Parse Relation}.
|
|
173
173
|
# This is implemented by defining a column to be of type `Relation` which
|
|
174
174
|
# refers to a foreign class. Parse-Stack supports this by passing the
|
|
175
175
|
# `through: :relation` option to the `has_many` method. Designating a column
|
|
@@ -183,7 +183,7 @@ module Parse
|
|
|
183
183
|
#
|
|
184
184
|
# *3*. Applying query constraints for a set of records within a relation is performed against the foreign table class, not the class having the relational column.
|
|
185
185
|
#
|
|
186
|
-
# The Parse documentation provides more details on associations, see {http://parseplatform.
|
|
186
|
+
# The Parse documentation provides more details on associations, see {http://docs.parseplatform.org/ios/guide/#relations Parse Relations Guide}.
|
|
187
187
|
# Parse-Stack will handle the work for (2) and (3) automatically.
|
|
188
188
|
#
|
|
189
189
|
# In the example below, a `Band` can have thousands of `Fans`. We setup a
|
|
@@ -74,11 +74,11 @@ module Parse
|
|
|
74
74
|
# *OAuth-Login*
|
|
75
75
|
#
|
|
76
76
|
# You can signup users using third-party services like Facebook and Twitter as
|
|
77
|
-
# described in {
|
|
77
|
+
# described in {http://docs.parseplatform.org/rest/guide/#signing-up
|
|
78
78
|
# Signing Up and Logging In}. To do this with Parse-Stack, you can call the
|
|
79
79
|
# {Parse::User.autologin_service} method by passing the service name and the
|
|
80
80
|
# corresponding authentication hash data. For a listing of supported third-party
|
|
81
|
-
# authentication services, see {
|
|
81
|
+
# authentication services, see {http://docs.parseplatform.org/parse-server/guide/#oauth-and-3rd-party-authentication OAuth}.
|
|
82
82
|
#
|
|
83
83
|
# fb_auth = {}
|
|
84
84
|
# fb_auth[:id] = "123456789"
|
|
@@ -105,12 +105,12 @@ module Parse
|
|
|
105
105
|
#
|
|
106
106
|
# You can link or unlink user accounts with third-party services like
|
|
107
107
|
# Facebook and Twitter as described in:
|
|
108
|
-
# {
|
|
108
|
+
# {http://docs.parseplatform.org/rest/guide/#linking-users Linking and Unlinking Users}.
|
|
109
109
|
# To do this, you must first get the corresponding authentication data for the
|
|
110
110
|
# specific service, and then apply it to the user using the linking and
|
|
111
111
|
# unlinking methods. Each method returns true or false if the action was
|
|
112
112
|
# successful. For a listing of supported third-party authentication services,
|
|
113
|
-
# see {
|
|
113
|
+
# see {http://docs.parseplatform.org/parse-server/guide/#oauth-and-3rd-party-authentication OAuth}.
|
|
114
114
|
#
|
|
115
115
|
# user = Parse::User.first
|
|
116
116
|
#
|
|
@@ -157,8 +157,8 @@ module Parse
|
|
|
157
157
|
# @see Parse::Model.autosave_on_create
|
|
158
158
|
def first_or_create(query_attrs = {}, resource_attrs = {})
|
|
159
159
|
|
|
160
|
-
query_attrs.symbolize_keys
|
|
161
|
-
resource_attrs.symbolize_keys
|
|
160
|
+
query_attrs = query_attrs.symbolize_keys
|
|
161
|
+
resource_attrs = resource_attrs.symbolize_keys
|
|
162
162
|
obj = query(query_attrs).first
|
|
163
163
|
|
|
164
164
|
if obj.blank?
|
|
@@ -511,7 +511,7 @@ module Parse
|
|
|
511
511
|
# we will create the object. If the object has an id, we will update the record.
|
|
512
512
|
#
|
|
513
513
|
# You may pass a session token to the `session` argument to perform this actions
|
|
514
|
-
# with the
|
|
514
|
+
# with the privileges of a certain user.
|
|
515
515
|
#
|
|
516
516
|
# You can define before and after :save callbacks
|
|
517
517
|
# autoraise: set to true will automatically raise an exception if the save fails
|
data/lib/parse/model/geopoint.rb
CHANGED
|
@@ -116,7 +116,7 @@ module Parse
|
|
|
116
116
|
# or with an array of two items where the first is the lat and the second is the lng (ex. [32.22,-118.81])
|
|
117
117
|
def attributes=(h)
|
|
118
118
|
if h.is_a?(Hash)
|
|
119
|
-
h.symbolize_keys
|
|
119
|
+
h = h.symbolize_keys
|
|
120
120
|
@latitude = h[:latitude].to_f || h[:lat].to_f || @latitude
|
|
121
121
|
@longitude = h[:longitude].to_f || h[:lng].to_f || @longitude
|
|
122
122
|
elsif h.is_a?(Array) && h.count == 2
|
data/lib/parse/model/object.rb
CHANGED
|
@@ -165,12 +165,12 @@ module Parse
|
|
|
165
165
|
# to set it to something different.
|
|
166
166
|
class << self
|
|
167
167
|
|
|
168
|
-
attr_accessor :disable_serialized_string_date, :parse_class
|
|
169
|
-
|
|
168
|
+
attr_accessor :disable_serialized_string_date, :parse_class
|
|
169
|
+
attr_reader :default_acls
|
|
170
170
|
# @!attribute disable_serialized_string_date
|
|
171
171
|
# Disables returning a serialized string date properties when encoding to JSON.
|
|
172
172
|
# This affects created_at and updated_at fields in order to be backwards compatible with old SDKs.
|
|
173
|
-
# @return [Boolean]
|
|
173
|
+
# @return [Boolean] the disabled status of whether string dates should be serialized.
|
|
174
174
|
|
|
175
175
|
# The class method to override the implicitly assumed Parse collection name
|
|
176
176
|
# in your Parse database. The default Parse collection name is the singular form
|
|
@@ -195,16 +195,51 @@ module Parse
|
|
|
195
195
|
@parse_class
|
|
196
196
|
end
|
|
197
197
|
|
|
198
|
-
#
|
|
199
|
-
#
|
|
200
|
-
# @
|
|
201
|
-
# @return [ACL] the default ACLs for this class.
|
|
202
|
-
def
|
|
203
|
-
|
|
204
|
-
@acl ||= Parse::ACL.new(acls, owner: owner)
|
|
198
|
+
# The set of default ACLs to be applied on newly created instances of this class.
|
|
199
|
+
# By default, public read and write are enabled.
|
|
200
|
+
# @see Parse::ACL.everyone
|
|
201
|
+
# @return [Parse::ACL] the current default ACLs for this class.
|
|
202
|
+
def default_acls
|
|
203
|
+
@default_acls ||= Parse::ACL.everyone # default public read/write
|
|
205
204
|
end
|
|
206
205
|
|
|
207
|
-
|
|
206
|
+
# A method to set default ACLs to be applied for newly created
|
|
207
|
+
# instances of this class. All subclasses have public read and write enabled
|
|
208
|
+
# by default.
|
|
209
|
+
# @example
|
|
210
|
+
# class AdminData < Parse::Object
|
|
211
|
+
#
|
|
212
|
+
# # Disable public read and write
|
|
213
|
+
# set_default_acl :public, read: false, write: false
|
|
214
|
+
#
|
|
215
|
+
# # but allow members of the Admin role to read and write
|
|
216
|
+
# set_default_acl 'Admin', role: true, read: true, write: true
|
|
217
|
+
#
|
|
218
|
+
# end
|
|
219
|
+
#
|
|
220
|
+
# data = AdminData.new
|
|
221
|
+
# data.acl # => ACL({"role:Admin"=>{"read"=>true, "write"=>true}})
|
|
222
|
+
#
|
|
223
|
+
# @param id [String|:public] The name for ACL entry. This can be an objectId, a role name or :public.
|
|
224
|
+
# @param read [Boolean] Whether to allow read permissions (default: false).
|
|
225
|
+
# @param write [Boolean] Whether to allow write permissions (default: false).
|
|
226
|
+
# @param role [Boolean] Whether the `id` argument should be applied as a role name.
|
|
227
|
+
# @see Parse::ACL#apply_role
|
|
228
|
+
# @see Parse::ACL#apply
|
|
229
|
+
# @version 1.7.0
|
|
230
|
+
def set_default_acl(id, read: false, write: false, role: false)
|
|
231
|
+
unless id.present?
|
|
232
|
+
raise ArgumentError, "Invalid argument applying #{self}.default_acls : must be either objectId, role or :public"
|
|
233
|
+
end
|
|
234
|
+
role ? default_acls.apply_role(id, read, write) : default_acls.apply(id, read, write)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# @!visibility private
|
|
238
|
+
def acl(acls, owner: nil)
|
|
239
|
+
raise "[#{self}.acl DEPRECATED] - Use `#{self}.default_acl` instead."
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
end # << self
|
|
208
243
|
|
|
209
244
|
# @return [String] the Parse class for this object.
|
|
210
245
|
# @see Parse::Object.parse_class
|
|
@@ -255,9 +290,10 @@ module Parse
|
|
|
255
290
|
apply_attributes!(opts, dirty_track: !dirty_track)
|
|
256
291
|
end
|
|
257
292
|
|
|
258
|
-
if
|
|
259
|
-
|
|
260
|
-
|
|
293
|
+
# if no ACLs, then apply the class default acls
|
|
294
|
+
# ACL.typecast will auto convert of Parse::ACL
|
|
295
|
+
self.acl = self.class.default_acls.as_json if self.acl.nil?
|
|
296
|
+
|
|
261
297
|
clear_changes! if @id.present? #then it was an import
|
|
262
298
|
|
|
263
299
|
# do not apply defaults on a pointer because it will stop it from being
|
data/lib/parse/query.rb
CHANGED
|
@@ -13,7 +13,7 @@ require 'active_support/core_ext'
|
|
|
13
13
|
|
|
14
14
|
module Parse
|
|
15
15
|
# The {Parse::Query} class provides the lower-level querying interface for
|
|
16
|
-
# your Parse collections by utilizing the {http://parseplatform.
|
|
16
|
+
# your Parse collections by utilizing the {http://docs.parseplatform.org/rest/guide/#queries
|
|
17
17
|
# REST Querying interface}. This is the main engine behind making Parse queries
|
|
18
18
|
# on remote collections. It takes a set of constraints and generates the
|
|
19
19
|
# proper hash parameters that are passed to an API request in order to retrive
|
|
@@ -58,7 +58,7 @@ module Parse
|
|
|
58
58
|
# Most of the constraints supported by Parse are available to `Parse::Query`.
|
|
59
59
|
# Assuming you have a column named `field`, here are some examples. For an
|
|
60
60
|
# explanation of the constraints, please see
|
|
61
|
-
# {http://parseplatform.
|
|
61
|
+
# {http://docs.parseplatform.org/rest/guide/#queries Parse Query Constraints documentation}.
|
|
62
62
|
# You can build your own custom query constraints by creating a `Parse::Constraint`
|
|
63
63
|
# subclass. For all these `where` clauses assume `q` is a `Parse::Query` object.
|
|
64
64
|
class Query
|
|
@@ -131,7 +131,7 @@ module Parse
|
|
|
131
131
|
# @!attribute [rw] session_token
|
|
132
132
|
# Set the session token to send with this API request. A session token is tied to
|
|
133
133
|
# a logged in {Parse::User}. When sending a session_token in the request,
|
|
134
|
-
# this performs the query on behalf of the user (with their allowed
|
|
134
|
+
# this performs the query on behalf of the user (with their allowed privileges).
|
|
135
135
|
# Using the short hand (inline) form, you can also pass an authenticated {Parse::User} instance
|
|
136
136
|
# or a {Parse::Session} instance.
|
|
137
137
|
# @example
|
|
@@ -107,7 +107,7 @@ module Parse
|
|
|
107
107
|
d = { __type: Parse::Model::TYPE_DATE, iso: d.iso8601(3) } if d.respond_to?(:iso8601)
|
|
108
108
|
d = d.pointer if d.respond_to?(:pointer) #simplified query object
|
|
109
109
|
d = d.to_s if d.is_a?(Regexp)
|
|
110
|
-
#d = d.pointer if d.is_a?(Parse::Object) #simplified query object
|
|
110
|
+
# d = d.pointer if d.is_a?(Parse::Object) #simplified query object
|
|
111
111
|
# d = d.compile
|
|
112
112
|
if d.is_a?(Parse::Query)
|
|
113
113
|
compiled = d.compile(encode: false, includeClassName: true)
|
|
@@ -663,6 +663,50 @@ module Parse
|
|
|
663
663
|
end
|
|
664
664
|
end
|
|
665
665
|
|
|
666
|
+
# Equivalent to the `$geoWithin` Parse query operation and `$polygon` geopoints
|
|
667
|
+
# constraint. The polygon area is defined by a list of {Parse::GeoPoint}
|
|
668
|
+
# objects that make up the enclosed area. A polygon query should have 3 or more geopoints.
|
|
669
|
+
# Please note that some Geo queries that cross the international date lines are not currently
|
|
670
|
+
# supported by Parse.
|
|
671
|
+
#
|
|
672
|
+
# # As many points as you want, minimum 3
|
|
673
|
+
# q.where :field.within_polygon => [geopoint1, geopoint2, geopoint3]
|
|
674
|
+
#
|
|
675
|
+
# # Polygon for the Bermuda Triangle
|
|
676
|
+
# bermuda = Parse::GeoPoint.new 32.3078000,-64.7504999 # Bermuda
|
|
677
|
+
# miami = Parse::GeoPoint.new 25.7823198,-80.2660226 # Miami, FL
|
|
678
|
+
# san_juan = Parse::GeoPoint.new 18.3848232,-66.0933608 # San Juan, PR
|
|
679
|
+
#
|
|
680
|
+
# # get all sunken ships inside the Bermuda Triangle
|
|
681
|
+
# SunkenShip.all :location.within_polygon => [bermuda, san_juan, miami]
|
|
682
|
+
#
|
|
683
|
+
class WithinPolygonQueryConstraint < Constraint
|
|
684
|
+
# @!method within_polygon
|
|
685
|
+
# A registered method on a symbol to create the constraint. Maps to Parse
|
|
686
|
+
# operator "$geoWithin" with "$polygon" subconstraint. Takes an array of {Parse::GeoPoint} objects.
|
|
687
|
+
# @example
|
|
688
|
+
# # As many points as you want
|
|
689
|
+
# q.where :field.within_polygon => [geopoint1, geopoint2, geopoint3]
|
|
690
|
+
# @return [WithinPolygonQueryConstraint]
|
|
691
|
+
# @version 1.7.0 (requires Server v2.4.2 or later)
|
|
692
|
+
contraint_keyword :$geoWithin
|
|
693
|
+
register :within_polygon
|
|
694
|
+
|
|
695
|
+
# @return [Hash] the compiled constraint.
|
|
696
|
+
def build
|
|
697
|
+
geopoint_values = formatted_value
|
|
698
|
+
unless geopoint_values.is_a?(Array) &&
|
|
699
|
+
geopoint_values.all? {|point| point.is_a?(Parse::GeoPoint) } &&
|
|
700
|
+
geopoint_values.count > 2
|
|
701
|
+
raise ArgumentError, '[Parse::Query] Invalid query value parameter passed to'\
|
|
702
|
+
' `within_polygon` constraint: Value must be an array with 3'\
|
|
703
|
+
' or more `Parse::GeoPoint` objects'
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
{ @operation.operand => { :$geoWithin => { :$polygon => geopoint_values } } }
|
|
707
|
+
end
|
|
708
|
+
end
|
|
709
|
+
|
|
666
710
|
end
|
|
667
711
|
|
|
668
712
|
end
|
data/lib/parse/stack/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: parse-stack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Anthony Persaud
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-06-
|
|
11
|
+
date: 2017-06-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|