openapply 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89fcc25f4b251ea7bed8c94a12e05f69bd379c6c87d097576ed9bd589365af3c
4
- data.tar.gz: c806bc3f83c5b8e4879b739f98cbb384c78e7b2d2091161ca115faf50ed5d6b8
3
+ metadata.gz: 4b681f4a386b3ab614a6eb7c4f8b244119a687a275eb0457dc54ff0b49901204
4
+ data.tar.gz: b6f98f8ca674289a607606c5c79b6e1160e45c53cf88aa038cad2aeaff32c52a
5
5
  SHA512:
6
- metadata.gz: 8ef763e465b040b37bf910483266a85a84960948a05b62f081475a5943262e5e42bccb0f9dc1c42a447224a973469ab89443950b1ca931490560023c0b9c2cd7
7
- data.tar.gz: b7cfa50c180eaefefba50bb44f04cfae1eb1c3d7f766950228a58cdb9815403f9974aa8f333bab411b572f4027a4cda42509ca4c3689470faecc809ce06394e1
6
+ metadata.gz: 656f153e570d7afaede6b73765637868ded3079eadac0763f17fbd1a052ec3f47c787adbefd20b634dbb8f2b8e87afebf8758bae467a9b50e02c3f850dbb4e50
7
+ data.tar.gz: b4c33173f2bd17b2ab0476231bbcc4ea2cd1a49ec362c24821c34c075cdb231f8620966a2f0f214b529d9a571e61006c116d51001115bfb74880c9865ca45742
data/.gitignore CHANGED
@@ -8,6 +8,8 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
 
11
+ /examples/demo/*.csv
12
+ /examples/demo/*.xlsx
11
13
 
12
14
  # rspec failure tracking
13
15
  .rspec_status
data/README.md CHANGED
@@ -2,18 +2,33 @@
2
2
 
3
3
  This gem allows ruby access to the OpenApply API v1 - and supports the GET features described at: https://dev.faria.co/oa
4
4
 
5
+
5
6
  ### Still TODO
6
7
 
8
+ * xlsx export?
7
9
  * test timeouts
8
10
  * write PUTS methods
9
- * fix rdocs - not mapping to methods
10
- * write method to flatten data structures
11
- * write a recursive query to pull students by since date (with any status or change date)
12
- * write a recursive query to pull students by since id (with any status or change date)
13
- * investigate faster response when returning large number of records
11
+ * write a recursive query to pull students by since date
12
+ * add protection for bad keys - when not an array or not symbol
13
+ * investigate slow response when returning large number of records
14
+ * write a recursive query to pull students by since id (sort of already done)
15
+
16
+
17
+ ### CHANGE LOG
18
+
19
+ * **v0.1.0** - test release -- 2017-11-01
14
20
 
21
+ * **v0.2.0** - first release -- **NOT** compatible with 0.1.0 -- 2017-11-07
22
+ - get student details of a give status (and pure api calls)
23
+ - recursive query until all receipt of all records received
15
24
 
16
- ## Installation
25
+ * **v0.2.1** - update compatible with 0.2.0 - 2017-11-20
26
+ - convert api data into an array, csv or xlsx
27
+ - allow data flattening prep for post processing
28
+ - allow queries to lookup students with multiple statuses
29
+ - allow scp string object to file export (no automated tests)
30
+
31
+ ### Installation
17
32
 
18
33
  Add this line to your application's Gemfile:
19
34
 
@@ -29,12 +44,17 @@ Or install it yourself as:
29
44
 
30
45
  $ gem install openapply
31
46
 
32
- ## Usage
33
47
 
34
- ### Full Docs
48
+ ### Docs
35
49
 
36
50
  * http://www.rubydoc.info/gems/openapply
37
51
 
52
+
53
+ #### Examples Code
54
+
55
+ see /examples in repo -- https://github.com/btihen/openapply/tree/master/examples/demo
56
+
57
+
38
58
  ### Configuration
39
59
 
40
60
  * Setup / Config the following ENV-VARS (example code uses **.rbenv-vars**):
@@ -44,7 +64,8 @@ Or install it yourself as:
44
64
  OA_TIMEOUT=5
45
65
 
46
66
  # 100 records is the advertised default record count, but in reality it is 10
47
- OA_RELPY_RECORDS=100
67
+ # this gem uses 50 as the default
68
+ OA_RELPY_RECORDS=50
48
69
 
49
70
  # currently this is the only API path available
50
71
  OA_API_PATH=/api/v1/students/
@@ -53,6 +74,8 @@ OA_API_PATH=/api/v1/students/
53
74
  OA_BASE_URI=demo.openapply.com
54
75
 
55
76
  # this is the demo site key - you will need your own key for your own site
77
+ # from https://demo.openapply.com/admin/dashboard (it will reset every hour)
78
+ # navigate to Settings > Integrations, and enable the API, and generate a token
56
79
  OA_AUTH_TOKEN=demo_site_api_key
57
80
  ```
58
81
 
@@ -64,7 +87,9 @@ Associates the above settings with HTTParty
64
87
  @oa = OpenApply::Client.new
65
88
  ```
66
89
 
67
- #### Example Usage
90
+ ### USAGE
91
+
92
+ #### USAGE SUMMARY
68
93
 
69
94
  ```ruby
70
95
  # instantiate
@@ -75,141 +100,158 @@ Associates the above settings with HTTParty
75
100
  @oa.api_key
76
101
  @oa.base_path
77
102
  @oa.api_timeout
78
- @oa.record_count
79
- # replace record_count with reply count
80
- # oa.reply_count
81
- ```
82
-
83
- #### Method list
84
-
85
- * individual student details
86
-
87
- ```ruby
88
- # all student info & parents info
89
- def student_by_id(student_id, options ={})
90
- # all payments associated with a student
91
- def payments_by_id(student_id, options={})
92
- # this is all student details (combines studnet, parent and payments)
93
- def student_details_by_id(id, flatten = false)
94
- ```
95
-
96
- * group of students (summary data) -- **(recursive - collects all pages of records if return_count < total_records)**
103
+ @oa.api_records
104
+ #
105
+ # directly call against the OA API
106
+ @oa.oa_api_call('/api/v1/students/?status=accepted&count=5&auth_token=add_api_key')
107
+ #
97
108
 
98
- ```ruby
99
- # summary info of students with a given status
100
- def students_by_status(status)
101
- # only student ids of students with a given status
102
- def student_ids_by_status(status)
109
+ # Individual students records (separated)
110
+ @oa.student_by_id(95)
111
+ @oa.payments_by_id(95)
103
112
  #
104
- # returns all student details for all students of a given status **returned as a hash)**
105
- def students_details_by_status(status)
113
+ # individual student records combined & possible pre-processing
114
+ # ATTRIBUTES: id, [:keys_to_un-nest], [:keys_to_exclude]
115
+ @oa.student_details_by_id(95)
116
+ @oa.student_details_by_id(95, [:custom_fields], [:parent_guardian])
106
117
  #
107
- # TODO: add in v0.2.1
108
- # # returns all student details for all students of a given status **(returned as a csv string - only returns data matching the keys given)**
109
- # def students_details_by_status_as_csv(status,keys)
110
- # # returns all student details for all students of a given status **(returned as an array - only returns data matching the keys given)**
111
- # def students_details_by_status_as_array(status,keys)
118
+ # student summaries of a given status (recursively if more than on page)
119
+ @oa.students_by_status('applied')
120
+ #
121
+ # student details of a given status (recursively if more than on page)
122
+ @oa.students_details_by_status('applied')
123
+ @oa.students_details_by_status('applied', [:custom_fields])
124
+ @oa.students_details_by_status('applied', nil, [:parent_guardian])
125
+ @oa.students_details_by_status('applied', [:custom_fields], [:parent_guardian])
126
+ #
127
+ # student details with multiple status (recursively if more than on page)
128
+ @oa.students_details_by_statuses(['applied','enrolled'], [:custom_fields])
129
+ @oa.students_details_by_statuses(['applied','enrolled'], nil, [:parent_guardian])
130
+ @oa.students_details_by_statuses(['applied','enrolled'], [:custom_fields], [:parent_guardian])
131
+ #
132
+ # create an array
133
+ @oa.students_as_array_by_status('applied', [:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
134
+ # multiple statuses into an array
135
+ @oa.students_as_array_by_statuses(['applied','enrolled'], [:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
136
+ #
137
+ # Create a csv string
138
+ @oa.students_as_csv_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
139
+ # multiple status into
140
+ csv_string=@oa.students_as_csv_by_statuses(['applied','enrolled'],[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
141
+ #
142
+ # send CSV to a remote server as a file - using ssh-keys
143
+ @oa.send_data_to_remote_server(csv_string, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
144
+
145
+ # Create XLSX file
146
+ @oa.students_as_xlsx_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
147
+ # multiple status into
148
+ xlsx_obj=@oa.students_as_xlsx_by_statuses(['applied','enrolled'],[:custom_fields], [:parent_guardian], [:id, :name], {type: :guardians, count: 1, keys: [:id, :name, :address]}, {type: :payments, count: 2, order: :newest, keys: [:date, :amount]} )
149
+ #
150
+ # send XLSX to a remote server as a file - using ssh-keys
151
+ @oa.send_data_to_remote_server(xlsx, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.xlsx', '0750')
112
152
  ```
113
153
 
114
- * custom grouping
154
+ #### INDIVIDUAL STUDENT QUERIES
155
+
115
156
  ```ruby
116
- def custom_students_query(status=nil, since_id=nil, since_date=nil, count=api_records)
117
- def custom_students_url(status=nil, since_id=nil, since_date=nil, count=api_records)
157
+ # all student info & parents info -- returns the data straight from OpenApply
158
+ student_record = @oa.student_by_id(95)
159
+
160
+ # all payments associated with a student -- returns the data straight from OpenApply
161
+ student_payments = @oa.payments_by_id(95)
162
+
163
+ # Returns all student details (combines studnet, parent and payments)
164
+ # **flatten_keys** - brings these keys to the top level - prepending the group name to the key name -- we usually use:
165
+ # flatten_keys = [:custom_fields]
166
+ # **reject keys** -- removes the data matching these keys -- we usually use:
167
+ # reject_keys = [:parent_guardian] (since this is duplicated)
168
+ # returns the data structured as:
169
+ # { student: {
170
+ # id: xxx,
171
+ # record: {xxx} # complete student record
172
+ # guardians: [ {} ] # all guardian information
173
+ # payments: [ {} ] # all payments made via openapply
174
+ # }
175
+ # }
176
+ @oa.student_details_by_id(95)
177
+ # or
178
+ @oa.student_details_by_id(95, [:custom_fields], [:parent_guardian])
118
179
  ```
119
180
 
120
- #### Get Individual student information
181
+ #### DATA OF GROUPS OF STUDENTS
121
182
 
122
- * Get a complete student record using student id -- includes: *(demographic, custom_fields, parent info & sibling ids)*
183
+ searched recursively - collects all pages of records
123
184
 
124
185
  ```ruby
125
- # def one_student_record_by_id(student_id, options ={})
186
+ # SUMMARY INFO of students with a given status - ONLY ONE STATUS string!
187
+ @oa.students_by_status('applied')
126
188
 
127
- @oa = OpenApply::Client.new
128
- @answer = @oa.student_by_id(95)
129
-
130
- # answer formats include:
131
- # { student:
132
- # { id: value1,
133
- # name: kid_name,
134
- # custom_fields: {
135
- # key3: value3,
136
- # key4: value4
137
- # }
138
- # },
139
- # linked: {
140
- # parents: [
141
- # id: value5,
142
- # name: parent_name,
143
- # custom_fields: {
144
- # key6: value6,
145
- # ...
146
- # }
147
- # ]
148
- # }
149
- # }
189
+ # STUDENT IDs of students with a given status or array of statuses
190
+ ids = @oa.student_ids_by_status('applied')
191
+ ids = @oa.student_ids_by_statuses(['applied','enrolled'])
192
+ # [1, 2, 60]
193
+ #
194
+ # FULL STUDENT DETAILS for all students of a given status or statuses
195
+ # **returned as a hash)** -- attributes are (status, flatten_keys, reject_keys)
196
+ # example usage:
197
+ @oa.students_details_by_status('applied')
198
+ @oa.students_details_by_status('applied',[:custom_fields])
199
+ @oa.students_details_by_status('applied', [:custom_fields], [:parent_guardian])
200
+ @oa.students_details_by_status(['applied','enrolled'])
201
+ @oa.students_details_by_status(['applied','enrolled'], nil, [:parent_guardian])
150
202
  ```
151
203
 
152
- * Get a student's payment records
204
+
205
+ #### STUDENT DATA TRANFORMATIONS
153
206
 
154
207
  ```ruby
155
- @oa = OpenApply::Client.new
156
- @answer = @oa.payments_by_id(95)
157
-
158
- # answer format is:
159
- # {
160
- # payments: [
161
- # {key1: value1, key2: value2},
162
- # {key1: value3, key2: value3}
163
- # ],
164
- # }
208
+ # student details - in an array format (instead of hash)
209
+ # ATTRIBUTES - status, flatten_keys, reject_keys, student_keys(into array), guardian_info(into array), payment_info(into array)
210
+ # guardian and payment info options:
211
+ # count - how many records to return
212
+ # keys - which keys to return to array/csv
213
+ # order: :newest/:oldest (for payments) - return newest or oldest payments first
214
+ @oa.students_as_array_by_status('applied', nil, nil, [:id, :name], nil, {count: 2, order: :newest, keys: [:date, :amount]} )
215
+ # all options
216
+ @oa.students_as_array_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
217
+ #
218
+ # Create a csv string
219
+ @oa.students_as_csv_by_status('applied', nil, nil, [:id, :name], nil, {count: 2, order: :newest, keys: [:date, :amount]} )
220
+ # all options
221
+ csv=@oa.students_as_csv_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
222
+ #
223
+ # send CSV to a remote server as a file - using ssh-keys
224
+ # attributes: csv_string, srv_hostname, srv_username, srv_path_file, file_permissions(0750 - default if not specified)
225
+ @oa.send_data_to_remote_server(csv, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
226
+ #
227
+ # Create a XLSX package
228
+ @oa.students_as_xlsx_by_status('applied', nil, nil, [:id, :name], nil, {count: 2, order: :newest, keys: [:date, :amount]} )
229
+ # all options
230
+ xlsx=@oa.students_as_xlsx_by_status('applied',[:custom_fields], [:parent_guardian], [:id, :name], {count: 1, keys: [:id, :name, :address]}, {count: 2, order: :newest, keys: [:date, :amount]} )
231
+ #
232
+ # send CSV to a remote server as a file - using ssh-keys
233
+ # attributes: csv_string, srv_hostname, srv_username, srv_path_file, file_permissions(0750 - default if not specified)
234
+ @oa.send_data_to_remote_server(xlsx, 'hostname.domain.name', 'myusername', '/home/myusername/xfer/myexport.csv', '0750')
165
235
  ```
166
236
 
167
- * Get all student data about one individual - includes: *(demographic, gardians, sibling ids, & payment records)*
237
+ #### CUSTOM GROUP QUERIES - summary data
168
238
 
169
239
  ```ruby
170
- @oa = OpenApply::Client.new
171
- @answer = @oa.student_details_by_id(95)
172
-
173
- # answer format is:
174
- # { student:
175
- # {
176
- # id: id,
177
- # record:
178
- # { id: id,
179
- # name: kid_name,
180
- # ... ,
181
- # custom_fields: {
182
- # key2: value2,
183
- # ...
184
- # }
185
- # },
186
- # payments: [
187
- # {payment1},
188
- # {payment2}
189
- # ],
190
- # guardians: [
191
- # { id: id,
192
- # name: guardian1,
193
- # ... ,
194
- # custom_fields: {
195
- # key2: value2,
196
- # ...
197
- # }
198
- # },
199
- # { id: id,
200
- # name: guardian2,
201
- # ... ,
202
- # custom_fields: {
203
- # key2: value2,
204
- # ...
205
- # }
206
- # }
207
- # ]
208
- # }
209
- # }
240
+ # status = 'applied' # all records matching a valid openapply status
241
+ # since_id = 95 # all records with ids after 95
242
+ # since_date = '2017-11-12' # all records modified after 2017-11-12 (& time)
243
+ # count = 20 # records per page
244
+
245
+ # build a custom url query to send to OA api
246
+ # returns a url that can be passed to api
247
+ @oa.students_query_url('applied', 106, '2017-11-12', 25)
248
+
249
+ # executes a custom query and returns a group of student summaries matching criteria
250
+ @oa.students_query('applied', 106, '2017-11-12', 25)
210
251
  ```
211
252
 
212
- #### Group queries (by status)
253
+
254
+ #### OpenApply's allowed statuses
213
255
 
214
256
  * **valid status includes:**
215
257
  - Status
@@ -223,270 +265,6 @@ def custom_students_url(status=nil, since_id=nil, since_date=nil, count=api_reco
223
265
  - Withdrawn
224
266
 
225
267
 
226
- * Get student summary info of all students of a given status **(all pages - uses recursion)**
227
-
228
- ```ruby
229
- # def all_student_summaries_by_status(status)
230
-
231
- @oa = OpenApply::Client.new
232
- @answer = @oa.students_by_status('applied')
233
-
234
- # answer format is:
235
- # { students: [
236
- # { id: id1,
237
- # name: kid1,
238
- # ...,
239
- # { id: id2,
240
- # name: kid_name_2,
241
- # ...,
242
- # }
243
- # ],
244
- # linked: {
245
- # parents: [
246
- # id: value5,
247
- # name: parent_name,
248
- # custom_fields: {
249
- # key6: value6,
250
- # ...
251
- # }
252
- # ]
253
- # }
254
- # }
255
- ```
256
-
257
- * Get a list of student ids of all students of a given status **(all pages - uses recursion)**
258
-
259
- ```ruby
260
- # def all_student_ids_by_status(status)
261
-
262
- @oa = OpenApply::Client.new
263
- @answer = @oa.student_ids_by_status('applied')
264
-
265
- # answer format is:
266
- # { student_ids: [95, 160, 240] }
267
- ```
268
-
269
- * Get all student data of all students of a given status **(all pages - uses recursion)**
270
-
271
- ```ruby
272
- # def all_students_all_data_by_status(status)
273
-
274
- @oa = OpenApply::Client.new
275
- @answer = @oa.students_details_by_status('enrolled')
276
-
277
- # TODO: add correct info
278
- # answer formats include:
279
- # { students:
280
- # [
281
- # { id: value1,
282
- # key2: value2,
283
- # custom_fields: {
284
- # key3: value3,
285
- # key4: value4
286
- # }
287
- # },
288
- # { id: valueX,
289
- # key2: valueY,
290
- # custom_fields: {
291
- # key3: valueZ,
292
- # key4: valueA
293
- # }
294
- # }
295
- # ],
296
- # guardians: [
297
- # {
298
- # id: value5,
299
- # custom_fields: {
300
- # key6: value6,
301
- # ...
302
- # },
303
- # {
304
- # id: value6,
305
- # custom_fields: {
306
- # key6: value7,
307
- # ...
308
- # },
309
- # ]
310
- # }
311
- ```
312
-
313
-
314
- * Get all student data of all students of a given status **(all pages - uses recursion)**
315
-
316
- ```ruby
317
- # FLATTEN RECORDS
318
- # def all_students_all_data_by_status(status,true)
319
-
320
- @oa = OpenApply::Client.new
321
- @answer = @oa.students_details_by_status('enrolled',true)
322
-
323
- # answer formats include:
324
- # { students:
325
- # [
326
- # { id: value1,
327
- # name: kid_1,
328
- # key3: value3,
329
- # key4: value4
330
- # },
331
- # { id: valueX,
332
- # name: kid_2,
333
- # key3: valueZ,
334
- # key4: valueA
335
- # }
336
- # ],
337
- # guardians: [
338
- # { id: value5,
339
- # name: guardian_1
340
- # key6: value6,
341
- # ...
342
- # },
343
- # { id: value6,
344
- # name: guardian_2
345
- # key6: value7,
346
- # ...
347
- # },
348
- # ]
349
- # }
350
- ```
351
-
352
- #### Custom URL (GET) API calls
353
-
354
- * Get student summary info of students with a custom query - supporting the description here: https://dev.faria.co/oa/#responses **(one page - no recursion)**
355
-
356
- ```ruby
357
- # def custom_student_summaries(status=nil, since_id=nil, since_date=nil, count=self.record_count)
358
-
359
- @oa = OpenApply::Client.new
360
- # status -- return records matching this status
361
- # since_id -- return records with ids after this id
362
- # since_date (format: 'YYYY-MM-DD') -- return records updated after this date
363
- # count (>= 1) -- is the number of records to return
364
- @answer = @oa.students_custom('applied',240,nil,3)
365
- @answer = @oa.students_custom('applied',nil,'2015-09-12',3)
366
-
367
- # answer formats include:
368
- # { students:
369
- # [
370
- # { id: value1,
371
- # name: kid_1,
372
- # ...,
373
- # custom_fields: {
374
- # key3: value3,
375
- # key4: value4
376
- # }
377
- # },
378
- # { id: valueX,
379
- # name: kid_2,
380
- # ...,
381
- # custom_fields: {
382
- # key3: valueZ,
383
- # key4: valueA
384
- # }
385
- # }
386
- # ],
387
- # linked: {}
388
- # parents: [
389
- # {
390
- # id: value5,
391
- # name: parent_1,
392
- # ...,
393
- # custom_fields: {
394
- # key6: value6,
395
- # ...
396
- # },
397
- # {
398
- # id: value6,
399
- # name: parent_2,
400
- # ...,
401
- # custom_fields: {
402
- # key6: value7,
403
- # ...
404
- # },
405
- # ]
406
- # }
407
- # meta: {
408
- # page: 3,
409
- # per_page": "2"
410
- # }
411
- # }
412
- ```
413
-
414
- * Get a response to a custom url query - this is the lowest level access
415
-
416
- ```ruby
417
- # def oa_answer( url, options={} )
418
-
419
- url = "api/v1/students?since_id=269&auth_token=demo_site_api_key"
420
-
421
- @oa = OpenApply::Client.new
422
- @oa_answer = @oa.oa_answer( url )
423
-
424
- # answer format like:
425
- #<HTTParty::Response:0x7f851fa20408 parsed_response="{\"payments\":[]}", @response=#<Net::HTTPOK 200 readbody=true>, @headers={}>
426
- #
427
- # access data using something like:
428
- return { error: "no answer" } unless @oa_answer.responds_to? 'response'
429
- return { error: "no answer" } unless (@oa_answer.response).responds_to? 'body'
430
- return JSON.parse( @api_answer.response.body, symbolize_names: true )
431
-
432
- # answer formats include:
433
- # { student:
434
- # { id: value1,
435
- # key2: value2,
436
- # custom_fields: {
437
- # key3: value3,
438
- # key4: value4
439
- # }
440
- # },
441
- # linked: {
442
- # parents: [
443
- # id: value5,
444
- # custom_fields: {
445
- # key6: value6,
446
- # ...
447
- # }
448
- # ]
449
- # }
450
- # }
451
- # or
452
- # {
453
- # payments: [
454
- # {key1: value1, key2: value2},
455
- # {key1: value3, key2: value3}
456
- # ],
457
- # }
458
- # or
459
- # {
460
- # students: [
461
- # {id: value1, key2: value2, custom_fields: {key3: value3, key4: value4} },
462
- # {id: value3, key2: value3, custom_fields: {key3: value3, key5: value5} }
463
- # ],
464
- # linked: {
465
- # parents: [
466
- # id: value5,
467
- # custom_fields: {
468
- # key6: value6,
469
- # ...
470
- # }
471
- # ]
472
- # }
473
- # meta: {
474
- # page: 3,
475
- # per_page": "10"
476
- # }
477
- # }
478
- ```
479
-
480
- #### Group queries with recursion (by since_date)
481
- not done (just code stubs)- not yet needed
482
-
483
- #### Group queries with recursion (by since_id)
484
- not done (just code stubs)- not yet needed
485
-
486
- #### See Examples Folder
487
-
488
- for an actual complete code examples
489
-
490
268
  ## Development
491
269
 
492
270
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.