osm 0.0.19 → 0.0.20

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.
@@ -1,3 +1,12 @@
1
+ ## Version 0.0.20
2
+
3
+ * Start deprecation of api\_data option in Api methods (raise a warning and adjust documentation)
4
+ * Hide sesitive information when printing data sent to OSM in debug mode
5
+ * Add archived attribute to Event
6
+ * Add :include\_archived option to Api.get\_events method
7
+ * Add retreival of Flexi Records
8
+ * Make set\_user method of Api public
9
+
1
10
  ## Version 0.0.19
2
11
 
3
12
  * Fix caching error in Api.get\_register\_data
data/README.md CHANGED
@@ -73,12 +73,14 @@ however it should be noted that when the OSM API adds a feature it can be diffic
73
73
  * API Access for our app
74
74
  * Due Badges
75
75
  * Events
76
+ * Flexi Record Data
77
+ * Flexi Record Structure
76
78
  * Groupings (e.g. Sixes, Patrols)
77
79
  * Members
78
80
  * Notepad
79
81
  * Notepads
80
82
  * Programme
81
- * Register
83
+ * Register Data
82
84
  * Register Structure
83
85
  * Roles
84
86
  * Section
@@ -93,4 +95,32 @@ however it should be noted that when the OSM API adds a feature it can be diffic
93
95
  * Evening
94
96
 
95
97
  ### Actions
96
- * Authorise an app to use the API on a user's behalf
98
+ * Authorise an app to use the API on a user's behalf
99
+
100
+
101
+ ## Parts of the OSM API currently NOT supported:
102
+
103
+ * Retreival of leader access
104
+ * Terms:
105
+ * Create
106
+ * Update
107
+ * Register - Update attendance
108
+ * Flexi Record - Update data
109
+ * Events:
110
+ * Attendance (everything)
111
+ * Create
112
+ * Update
113
+ * Member:
114
+ * Update
115
+ * Add
116
+ * Badges:
117
+ * Which requirements each member has met:
118
+ * Retreive
119
+ * Update
120
+ * Retrieve details for each badge (stock, short column names etc.)
121
+ * Update Activity
122
+ * Gift aid (everything)
123
+ * Finances (Everything)
124
+ * SMS:
125
+ * Retreival of delivery reports
126
+ * Sending a message
data/lib/osm.rb CHANGED
@@ -6,6 +6,7 @@ module Osm
6
6
  OSM_DATE_FORMAT = '%Y-%m-%d'
7
7
  OSM_DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
8
8
  OSM_TIME_REGEX = /\A(?:[0-1][0-9]|2[0-3]):[0-5][0-9]\Z/
9
+ OSM_DATE_REGEX = /\A\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])\Z/
9
10
  end
10
11
 
11
12
  require File.join(File.dirname(__FILE__), '..', 'version')
@@ -3,7 +3,7 @@
3
3
  # @option options [Boolean] :no_cache (optional) if true then the data will be retreived from OSM not the cache
4
4
 
5
5
  # @!macro [new] options_api_data
6
- # @param [Hash] api_data
6
+ # @param [Hash] api_data - DEPRECATED (DO NOT USE THIS OPTION)
7
7
  # @option api_data [String] 'userid' (optional) the OSM userid to make the request as
8
8
  # @option api_data [String] 'secret' (optional) the OSM secret belonging to the above user
9
9
 
@@ -102,14 +102,25 @@ module Osm
102
102
  return data
103
103
  end
104
104
 
105
+ # Set the OSM user to make future requests as
106
+ # @param [String] userid the OSM userid to use (get this using the authorize method)
107
+ # @param [String] secret the OSM secret to use (get this using the authorize method)
108
+ def set_user(userid, secret)
109
+ @userid = userid
110
+ @secret = secret
111
+ end
112
+
113
+
105
114
  # Get the user's roles
106
115
  # @!macro options_get
107
116
  # @!macro options_api_data
108
117
  # @return [Array<Osm::Role>]
109
118
  def get_roles(options={}, api_data={})
119
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
120
+ cache_key = "roles-#{api_data[:userid] || @userid}"
110
121
 
111
- if !options[:no_cache] && cache_exist?("roles-#{api_data[:userid] || @userid}")
112
- return cache_read("roles-#{api_data[:userid] || @userid}")
122
+ if !options[:no_cache] && cache_exist?(cache_key)
123
+ return cache_read(cache_key)
113
124
  end
114
125
 
115
126
  data = perform_query('api.php?action=getUserRoles', api_data)
@@ -121,7 +132,7 @@ module Osm
121
132
  cache_write("section-#{role.section.id}", role.section, :expires_in => @@default_cache_ttl*2)
122
133
  self.user_can_access :section, role.section.id, api_data
123
134
  end
124
- cache_write("roles-#{api_data[:userid] || @userid}", result, :expires_in => @@default_cache_ttl*2)
135
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl*2)
125
136
 
126
137
  return result
127
138
  end
@@ -131,8 +142,11 @@ module Osm
131
142
  # @!macro options_api_data
132
143
  # @return [Hash] a hash (keys are section IDs, values are a string)
133
144
  def get_notepads(options={}, api_data={})
134
- if !options[:no_cache] && cache_exist?("notepads-#{api_data[:userid] || @userid}")
135
- return cache_read("notepads-#{api_data[:userid] || @userid}")
145
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
146
+ cache_key = "notepads-#{api_data[:userid] || @userid}"
147
+
148
+ if !options[:no_cache] && cache_exist?(cache_key)
149
+ return cache_read(cache_key)
136
150
  end
137
151
 
138
152
  notepads = perform_query('api.php?action=getNotepads', api_data)
@@ -144,7 +158,7 @@ module Osm
144
158
  cache_write("notepad-#{key}", value, :expires_in => @@default_cache_ttl*2)
145
159
  end
146
160
 
147
- cache_write("notepads-#{api_data[:userid] || @userid}", data, :expires_in => @@default_cache_ttl*2)
161
+ cache_write(cache_key, data, :expires_in => @@default_cache_ttl*2)
148
162
  return data
149
163
  end
150
164
 
@@ -155,10 +169,12 @@ module Osm
155
169
  # @return nil if an error occured or the user does not have access to that section
156
170
  # @return [String] the content of the notepad otherwise
157
171
  def get_notepad(section, options={}, api_data={})
172
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
158
173
  section_id = id_for_section(section)
174
+ cache_key = "notepad-#{section_id}"
159
175
 
160
- if !options[:no_cache] && cache_exist?("notepad-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
161
- return cache_read("notepad-#{section_id}")
176
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:section, section_id, api_data)
177
+ return cache_read(cache_key)
162
178
  end
163
179
 
164
180
  notepads = get_notepads(options, api_data)
@@ -178,8 +194,11 @@ module Osm
178
194
  # @return nil if an error occured or the user does not have access to that section
179
195
  # @return [Osm::Section]
180
196
  def get_section(section_id, options={}, api_data={})
181
- if !options[:no_cache] && cache_exist?("section-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
182
- return cache_read("section-#{section_id}")
197
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
198
+ cache_key = "section-#{section_id}"
199
+
200
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:section, section_id, api_data)
201
+ return cache_read(cache_key)
183
202
  end
184
203
 
185
204
  roles = get_roles(options, api_data)
@@ -198,10 +217,12 @@ module Osm
198
217
  # @!macro options_api_data
199
218
  # @return [Array<Osm::Grouping>]
200
219
  def get_groupings(section, options={}, api_data={})
220
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
201
221
  section_id = id_for_section(section)
222
+ cache_key = "groupings-#{section_id}"
202
223
 
203
- if !options[:no_cache] && cache_exist?("groupings-#{section_id}") && self.user_can_access?(:section, section_id, api_data)
204
- return cache_read("groupings-#{section_id}")
224
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:section, section_id, api_data)
225
+ return cache_read(cache_key)
205
226
  end
206
227
 
207
228
  data = perform_query("users.php?action=getPatrols&sectionid=#{section_id}", api_data)
@@ -210,10 +231,9 @@ module Osm
210
231
  data['patrols'].each do |item|
211
232
  grouping = Osm::Grouping.from_api(item)
212
233
  result.push grouping
213
- cache_write("grouping-#{grouping.id}", grouping, :expires_in => @@default_cache_ttl*2)
214
234
  self.user_can_access :grouping, grouping.id, api_data
215
235
  end
216
- cache_write("groupings-#{section_id}", result, :expires_in => @@default_cache_ttl*2)
236
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl*2)
217
237
 
218
238
  return result
219
239
  end
@@ -223,8 +243,11 @@ module Osm
223
243
  # @!macro options_api_data
224
244
  # @return [Array<Osm::Term>]
225
245
  def get_terms(options={}, api_data={})
226
- if !options[:no_cache] && cache_exist?("terms-#{api_data[:userid] || @userid}")
227
- return cache_read("terms-#{api_data[:userid] || @userid}")
246
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
247
+ cache_key = "terms-#{api_data[:userid] || @userid}"
248
+
249
+ if !options[:no_cache] && cache_exist?(cache_key)
250
+ return cache_read(cache_key)
228
251
  end
229
252
 
230
253
  data = perform_query('api.php?action=getTerms', api_data)
@@ -239,7 +262,7 @@ module Osm
239
262
  end
240
263
  end
241
264
 
242
- cache_write("terms-#{api_data[:userid] || @userid}", result, :expires_in => @@default_cache_ttl*2)
265
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl*2)
243
266
  return result
244
267
  end
245
268
 
@@ -250,8 +273,11 @@ module Osm
250
273
  # @return nil if an error occured or the user does not have access to that term
251
274
  # @return [Osm::Term]
252
275
  def get_term(term_id, options={}, api_data={})
253
- if !options[:no_cache] && cache_exist?("term-#{term_id}") && self.user_can_access?(:term, term_id, api_data)
254
- return cache_read("term-#{term_id}")
276
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
277
+ cache_key = "term-#{term_id}"
278
+
279
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:term, term_id, api_data)
280
+ return cache_read(cache_key)
255
281
  end
256
282
 
257
283
  terms = get_terms(options)
@@ -271,11 +297,13 @@ module Osm
271
297
  # @!macro options_api_data
272
298
  # @return [Array<Osm::Evening>]
273
299
  def get_programme(section, term, options={}, api_data={})
300
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
274
301
  section_id = id_for_section(section)
275
302
  term_id = id_for_term(term, section, api_data)
303
+ cache_key = "programme-#{section_id}-#{term_id}"
276
304
 
277
- if !options[:no_cache] && cache_exist?("programme-#{section_id}-#{term_id}") && self.user_can_access?(:programme, section_id, api_data)
278
- return cache_read("programme-#{section_id}-#{term_id}")
305
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:programme, section_id, api_data)
306
+ return cache_read(cache_key)
279
307
  end
280
308
 
281
309
  data = perform_query("programme.php?action=getProgramme&sectionid=#{section_id}&termid=#{term_id}", api_data)
@@ -294,7 +322,7 @@ module Osm
294
322
  end
295
323
  end
296
324
 
297
- cache_write("programme-#{section_id}-#{term_id}", result, :expires_in => @@default_cache_ttl)
325
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl)
298
326
  return result
299
327
  end
300
328
 
@@ -305,8 +333,11 @@ module Osm
305
333
  # @!macro options_api_data
306
334
  # @return [Osm::Activity]
307
335
  def get_activity(activity_id, version=nil, options={}, api_data={})
308
- if !options[:no_cache] && cache_exist?("activity-#{activity_id}-#{version}") && self.user_can_access?(:activity, activity_id, api_data)
309
- return cache_read("activity-#{activity_id}-#{version}")
336
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
337
+ cache_key = "activity-#{activity_id}-"
338
+
339
+ if !options[:no_cache] && cache_exist?("#{cache_key}-#{version}") && self.user_can_access?(:activity, activity_id, api_data)
340
+ return cache_read("#{cache_key}-#{version}")
310
341
  end
311
342
 
312
343
  data = nil
@@ -317,8 +348,8 @@ module Osm
317
348
  end
318
349
 
319
350
  activity = Osm::Activity.from_api(data)
320
- cache_write("activity-#{activity_id}-#{nil}", activity, :expires_in => @@default_cache_ttl*2) if version.nil?
321
- cache_write("activity-#{activity_id}-#{activity.version}", activity, :expires_in => @@default_cache_ttl/2)
351
+ cache_write("#{cache_key}-#{nil}", activity, :expires_in => @@default_cache_ttl*2) if version.nil?
352
+ cache_write("#{cache_key}-#{activity.version}", activity, :expires_in => @@default_cache_ttl/2)
322
353
  self.user_can_access :activity, activity.id, api_data
323
354
 
324
355
  return activity
@@ -331,11 +362,13 @@ module Osm
331
362
  # @!macro options_api_data
332
363
  # @return [Array<Osm::Member>]
333
364
  def get_members(section, term=nil, options={}, api_data={})
365
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
334
366
  section_id = id_for_section(section)
335
367
  term_id = id_for_term(term, section, api_data)
368
+ cache_key = "members-#{section_id}-#{term_id}"
336
369
 
337
- if !options[:no_cache] && cache_exist?("members-#{section_id}-#{term_id}") && self.user_can_access?(:member, section_id, api_data)
338
- return cache_read("members-#{section_id}-#{term_id}")
370
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:member, section_id, api_data)
371
+ return cache_read(cache_key)
339
372
  end
340
373
 
341
374
  data = perform_query("users.php?action=getUserDetails&sectionid=#{section_id}&termid=#{term_id}", api_data)
@@ -345,7 +378,7 @@ module Osm
345
378
  result.push Osm::Member.from_api(item)
346
379
  end
347
380
  self.user_can_access :member, section_id, api_data
348
- cache_write("members-#{section_id}-#{term_id}", result, :expires_in => @@default_cache_ttl)
381
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl)
349
382
 
350
383
  return result
351
384
  end
@@ -356,10 +389,12 @@ module Osm
356
389
  # @!macro options_api_data
357
390
  # @return [Array<Osm::ApiAccess>]
358
391
  def get_api_access(section, options={}, api_data={})
392
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
359
393
  section_id = id_for_section(section)
394
+ cache_key = "api_access-#{api_data['userid'] || @userid}-#{section_id}"
360
395
 
361
- if !options[:no_cache] && cache_exist?("api_access-#{api_data['userid'] || @userid}-#{section_id}")
362
- return cache_read("api_access-#{api_data['userid'] || @userid}-#{section_id}")
396
+ if !options[:no_cache] && cache_exist?(cache_key)
397
+ return cache_read(cache_key)
363
398
  end
364
399
 
365
400
  data = perform_query("users.php?action=getAPIAccess&sectionid=#{section_id}", api_data)
@@ -371,8 +406,9 @@ module Osm
371
406
  self.user_can_access(:programme, section_id, api_data) if this_item.can_read?(:programme)
372
407
  self.user_can_access(:member, section_id, api_data) if this_item.can_read?(:member)
373
408
  self.user_can_access(:badge, section_id, api_data) if this_item.can_read?(:badge)
374
- cache_write("api_access-#{api_data['userid'] || @userid}-#{section_id}-#{this_item.id}", this_item, :expires_in => @@default_cache_ttl*2)
409
+ cache_write("#{cache_key}-#{this_item.id}", this_item, :expires_in => @@default_cache_ttl*2)
375
410
  end
411
+ cache_write(cache_key, result, :expires_in => @@default_cache_ttl*2)
376
412
 
377
413
  return result
378
414
  end
@@ -383,10 +419,12 @@ module Osm
383
419
  # @!macro options_api_data
384
420
  # @return [Osm::ApiAccess]
385
421
  def get_our_api_access(section, options={}, api_data={})
422
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
386
423
  section_id = id_for_section(section)
424
+ cache_key = "api_access-#{api_data['userid'] || @userid}-#{section_id}-#{Osm::Api.api_id}"
387
425
 
388
- if !options[:no_cache] && cache_exist?("api_access-#{api_data['userid'] || @userid}-#{section_id}-#{Osm::Api.api_id}")
389
- return cache_read("api_access-#{api_data['userid'] || @userid}-#{section_id}-#{Osm::Api.api_id}")
426
+ if !options[:no_cache] && cache_exist?(cache_key)
427
+ return cache_read(cache_key)
390
428
  end
391
429
 
392
430
  data = get_api_access(section_id, options)
@@ -401,27 +439,35 @@ module Osm
401
439
  # Get events
402
440
  # @param [Osm:Section, Fixnum] section the section (or its ID) to get the events for
403
441
  # @!macro options_get
442
+ # @option options [Boolean] :include_archived (optional) if true then archived activities will also be returned
404
443
  # @!macro options_api_data
405
444
  # @return [Array<Osm::Event>]
406
445
  def get_events(section, options={}, api_data={})
446
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
407
447
  section_id = id_for_section(section)
448
+ cache_key = "events-#{section_id}"
449
+ events = nil
408
450
 
409
- if !options[:no_cache] && cache_exist?("events-#{section_id}") && self.user_can_access?(:programme, section_id, api_data)
410
- return cache_read("events-#{section_id}")
411
- end
451
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:programme, section_id, api_data)
452
+ events = cache_read(cache_key)
453
+ else
412
454
 
413
- data = perform_query("events.php?action=getEvents&sectionid=#{section_id}", api_data)
455
+ data = perform_query("events.php?action=getEvents&sectionid=#{section_id}&showArchived=true", api_data)
414
456
 
415
- result = Array.new
416
- unless data['items'].nil?
417
- data['items'].each do |item|
418
- result.push Osm::Event.from_api(item)
457
+ events = Array.new
458
+ unless data['items'].nil?
459
+ data['items'].each do |item|
460
+ events.push Osm::Event.from_api(item)
461
+ end
419
462
  end
463
+ self.user_can_access :programme, section_id, api_data
464
+ cache_write(cache_key, events, :expires_in => @@default_cache_ttl)
420
465
  end
421
- self.user_can_access :programme, section_id, api_data
422
- cache_write("events-#{section_id}", result, :expires_in => @@default_cache_ttl)
423
466
 
424
- return result
467
+ return events if options[:include_archived]
468
+ return events.reject do |event|
469
+ event.archived?
470
+ end
425
471
  end
426
472
 
427
473
  # Get due badges
@@ -430,19 +476,21 @@ module Osm
430
476
  # @!macro options_api_data
431
477
  # @return [Osm::DueBadges]
432
478
  def get_due_badges(section, term=nil, options={}, api_data={})
479
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
433
480
  section_id = id_for_section(section)
481
+ section_type = type_for_section(section, api_data)
434
482
  term_id = id_for_term(term, section, api_data)
483
+ cache_key = "due_badges-#{section_id}-#{term_id}"
435
484
 
436
- if !options[:no_cache] && cache_exist?("due_badges-#{section_id}-#{term_id}") && self.user_can_access?(:badge, section_id, api_data)
437
- return cache_read("due_badges-#{section_id}-#{term_id}")
485
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:badge, section_id, api_data)
486
+ return cache_read(cache_key)
438
487
  end
439
488
 
440
- section_type = get_section(section_id, api_data).type.to_s
441
489
  data = perform_query("challenges.php?action=outstandingBadges&section=#{section_type}&sectionid=#{section_id}&termid=#{term_id}", api_data)
442
490
 
443
491
  data = Osm::DueBadges.from_api(data)
444
492
  self.user_can_access :badge, section_id, api_data
445
- cache_write("due_badges-#{section_id}-#{term_id}", data, :expires_in => @@default_cache_ttl*2)
493
+ cache_write(cache_key, data, :expires_in => @@default_cache_ttl*2)
446
494
 
447
495
  return data
448
496
  end
@@ -454,11 +502,13 @@ module Osm
454
502
  # @!macro options_api_data
455
503
  # @return [Array<Osm::RegisterField>] representing the fields of the register
456
504
  def get_register_structure(section, term=nil, options={}, api_data={})
505
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
457
506
  section_id = id_for_section(section)
458
507
  term_id = id_for_term(term, section, api_data)
508
+ cache_key = "register_structure-#{section_id}-#{term_id}"
459
509
 
460
- if !options[:no_cache] && cache_exist?("register_structure-#{section_id}-#{term_id}") && self.user_can_access?(:register, section_id, api_data)
461
- return cache_read("register_structure-#{section_id}-#{term_id}")
510
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:register, section_id, api_data)
511
+ return cache_read(cache_key)
462
512
  end
463
513
 
464
514
  data = perform_query("users.php?action=registerStructure&sectionid=#{section_id}&termid=#{term_id}", api_data)
@@ -470,7 +520,7 @@ module Osm
470
520
  end
471
521
  end
472
522
  self.user_can_access :register, section_id, api_data
473
- cache_write("register_structure-#{section_id}-#{term_id}", structure, :expires_in => @@default_cache_ttl/2)
523
+ cache_write(cache_key, structure, :expires_in => @@default_cache_ttl/2)
474
524
 
475
525
  return structure
476
526
  end
@@ -482,11 +532,13 @@ module Osm
482
532
  # @!macro options_api_data
483
533
  # @return [Array<RegisterData>] representing the attendance of each member
484
534
  def get_register_data(section, term=nil, options={}, api_data={})
535
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
485
536
  section_id = id_for_section(section)
486
537
  term_id = id_for_term(term, section, api_data)
538
+ cache_key = "register-#{section_id}-#{term_id}"
487
539
 
488
- if !options[:no_cache] && cache_exist?("register-#{section_id}-#{term_id}") && self.user_can_access?(:register, section_id, api_data)
489
- return cache_read("register-#{section_id}-#{term_id}")
540
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:register, section_id, api_data)
541
+ return cache_read(cache_key)
490
542
  end
491
543
 
492
544
  data = perform_query("users.php?action=register&sectionid=#{section_id}&termid=#{term_id}", api_data)
@@ -497,7 +549,65 @@ module Osm
497
549
  to_return.push Osm::RegisterData.from_api(item)
498
550
  end
499
551
  self.user_can_access :register, section_id, api_data
500
- cache_write("register-#{section_id}-#{term_id}", to_return, :expires_in => @@default_cache_ttl/2)
552
+ cache_write(cache_key, to_return, :expires_in => @@default_cache_ttl/2)
553
+ return to_return
554
+ end
555
+
556
+ # Get flexirecord structure
557
+ # @param [Osm:Section, Fixnum] section the section (or its ID) to get the structure for
558
+ # @param [Fixnum] the id of the Flexi Record
559
+ # @!macro options_get
560
+ # @!macro options_api_data
561
+ # @return [Array<Osm::FlexiRecordField>] representing the fields of the flexi record
562
+ def get_flexi_record_fields(section, id, options={}, api_data={})
563
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
564
+ section_id = id_for_section(section)
565
+ cache_key = "flexi_record_structure-#{section_id}-#{id}"
566
+
567
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:flexi, section_id, api_data)
568
+ return cache_read(cache_key)
569
+ end
570
+
571
+ data = perform_query("extras.php?action=getExtra&sectionid=#{section_id}&extraid=#{id}", api_data)
572
+
573
+ structure = []
574
+ data['structure'].each do |item|
575
+ item['rows'].each do |row|
576
+ structure.push Osm::FlexiRecordField.from_api(row)
577
+ end
578
+ end
579
+ self.user_can_access :flexi, section_id, api_data
580
+ cache_write(cache_key, structure, :expires_in => @@default_cache_ttl/2)
581
+
582
+ return structure
583
+ end
584
+
585
+ # Get flexi record data
586
+ # @param [Osm:Section, Fixnum] section the section (or its ID) to get the register for
587
+ # @param [Fixnum] the id of the Flexi Record
588
+ # @param [Osm:Term, Fixnum] section the term (or its ID) to get the register for, passing nil causes the current term to be used
589
+ # @!macro options_get
590
+ # @!macro options_api_data
591
+ # @return [Array<FlexiRecordData>]
592
+ def get_flexi_record_data(section, id, term=nil, options={}, api_data={})
593
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
594
+ section_id = id_for_section(section)
595
+ section_type = type_for_section(section, api_data)
596
+ term_id = id_for_term(term, section, api_data)
597
+ cache_key = "flexi_record_data-#{section_id}-#{term_id}-#{id}"
598
+
599
+ if !options[:no_cache] && cache_exist?(cache_key) && self.user_can_access?(:flexi, section_id, api_data)
600
+ return cache_read(cache_key)
601
+ end
602
+
603
+ data = perform_query("extras.php?action=getExtraRecords&sectionid=#{section_id}&extraid=#{id}&termid=#{term_id}&section=#{section_type}", api_data)
604
+
605
+ to_return = []
606
+ data['items'].each do |item|
607
+ to_return.push Osm::FlexiRecordData.from_api(item)
608
+ end
609
+ self.user_can_access :flexi, section_id, api_data
610
+ cache_write(cache_key, to_return, :expires_in => @@default_cache_ttl/2)
501
611
  return to_return
502
612
  end
503
613
 
@@ -507,6 +617,7 @@ module Osm
507
617
  # @!macro options_api_data
508
618
  # @return [Boolean] if the operation suceeded or not
509
619
  def create_evening(section, meeting_date, api_data={})
620
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
510
621
  section_id = id_for_section(section)
511
622
  evening_api_data = {
512
623
  'meetingdate' => meeting_date.strftime(Osm::OSM_DATE_FORMAT),
@@ -529,6 +640,7 @@ module Osm
529
640
  # @!macro options_api_data
530
641
  # @return [Boolean] if the operation suceeded or not
531
642
  def update_evening(evening, api_data={})
643
+ warn "[DEPRECATION OF OPTION] use of the api_data option is deprecated." unless api_data == {}
532
644
  raise ArgumentIsInvalid, 'evening is invalid' unless evening.valid?
533
645
  response = perform_query("programme.php?action=editEvening", api_data.merge(evening.to_api))
534
646
 
@@ -577,17 +689,11 @@ module Osm
577
689
 
578
690
 
579
691
  private
580
- # Set the OSM user to make future requests as
581
- # @param [String] userid the OSM userid to use (get this using the authorize method)
582
- # @param [String] secret the OSM secret to use (get this using the authorize method)
583
- def set_user(userid, secret)
584
- @userid = userid
585
- @secret = secret
586
- end
587
-
588
692
  # Make the query to the OSM API
589
693
  # @param [String] url the script on the remote server to invoke
590
694
  # @param [Hash] api_data a hash containing the values to be sent to the server
695
+ # @option api_data [String] 'userid' (optional) the OSM userid to make the request as
696
+ # @option api_data [String] 'secret' (optional) the OSM secret belonging to the above user
591
697
  # @return [Hash, Array, String] the parsed JSON returned by OSM
592
698
  def perform_query(url, api_data={})
593
699
  api_data['apiid'] = @@api_id
@@ -602,7 +708,9 @@ module Osm
602
708
 
603
709
  if @@debug
604
710
  puts "Making OSM API request to #{url}"
605
- puts api_data.to_s
711
+ hide_values_for = ['secret', 'token']
712
+ api_data_as_string = api_data.sort.map{ |key, value| "#{key} => #{hide_values_for.include?(key) ? 'PRESENT' : value.inspect}" }.join(', ')
713
+ puts "{#{api_data_as_string}}"
606
714
  end
607
715
 
608
716
  begin
@@ -676,6 +784,11 @@ module Osm
676
784
  def id_for_section(section)
677
785
  id_for(Osm::Section, section, 'section')
678
786
  end
787
+
788
+ def type_for_section(section, api_data)
789
+ (section.is_a?(Osm::Section) ? section : get_section(section, api_data)).type.to_s
790
+ end
791
+
679
792
  def id_for_term(term, section, api_data)
680
793
  return term.nil? ? Osm::find_current_term_id(self, id_for_section(section), api_data) : id_for(Osm::Term, term, 'term')
681
794
  end
@@ -4,22 +4,23 @@ module Osm
4
4
  include ::ActiveAttr::MassAssignmentSecurity
5
5
  include ::ActiveAttr::Model
6
6
 
7
- # @!attribute [r] id
7
+ # @!attribute [rw] id
8
8
  # @return [Fixnum] the id for the event
9
- # @!attribute [r] section_id
9
+ # @!attribute [rw] section_id
10
10
  # @return [Fixnum] the id for the section
11
- # @!attribute [r] name
11
+ # @!attribute [rw] name
12
12
  # @return [String] the name of the event
13
- # @!attribute [r] start
13
+ # @!attribute [rw] start
14
14
  # @return [DateTime] when the event starts
15
- # @!attribute [r] finish
15
+ # @!attribute [rw] finish
16
16
  # @return [DateTime] when the event ends
17
- # @!attribute [r] cost
17
+ # @!attribute [rw] cost
18
18
  # @return [String] the cost of the event
19
- # @!attribute [r] location
19
+ # @!attribute [rw] location
20
20
  # @return [String] where the event is
21
- # @!attribute [r] notes
21
+ # @!attribute [rw] notes
22
22
  # @return [String] notes about the event
23
+ # @!attribute [rw] archived
23
24
 
24
25
  attribute :id, :type => Integer
25
26
  attribute :section_id, :type => Integer
@@ -29,8 +30,9 @@ module Osm
29
30
  attribute :cost, :type => String, :default => ''
30
31
  attribute :location, :type => String, :default => ''
31
32
  attribute :notes, :type => String, :default => ''
33
+ attribute :archived, :type => Boolean, :default => false
32
34
 
33
- attr_accessible :id, :section_id, :name, :start, :finish, :cost, :location, :notes
35
+ attr_accessible :id, :section_id, :name, :start, :finish, :cost, :location, :notes, :archived
34
36
 
35
37
  validates_numericality_of :id, :only_integer=>true, :greater_than=>0
36
38
  validates_numericality_of :section_id, :only_integer=>true, :greater_than=>0
@@ -53,6 +55,7 @@ module Osm
53
55
  :cost => data['cost'],
54
56
  :location => data['location'],
55
57
  :notes => data['notes'],
58
+ :archived => data['archived'].eql?('1')
56
59
  })
57
60
  end
58
61
 
@@ -0,0 +1,68 @@
1
+ module Osm
2
+
3
+ class FlexiRecordData
4
+ include ::ActiveAttr::MassAssignmentSecurity
5
+ include ::ActiveAttr::Model
6
+
7
+ # @!attribute [rw] member_id
8
+ # @return [Fixnum] OSM id for the member
9
+ # @!attribute [rw] first_name
10
+ # @return [String] Member's first name
11
+ # @!attribute [rw] last_name
12
+ # @return [String] Member's last name
13
+ # @!attribute [rw] grouping__id
14
+ # @return [Fixnum] OSM id for the grouping the member is in
15
+ # @!attribute [rw] fields
16
+ # @return [Hash] Keys are the field'd id, values are the field values
17
+ # @!attribute [rw] total
18
+ # @return [Fixnum, nil] The total of the field values, nil if the flexi record does not have this column type
19
+ # @!attribute [rw] completed
20
+ # @return [Fixnum, nil] The count of completed fields, nil if the flexi record does not have this column type
21
+ # @!attribute [rw] date_of_birth
22
+ # @return [Date, nil] The member's date of birth, nil if the flexi record does not have this column type
23
+ # @!attribute [rw] age
24
+ # @return [String, nil] The member's age (yy/mm), nil if the flexi record does not have this column type
25
+
26
+ attribute :member_id, :type => Integer
27
+ attribute :first_name, :type => String
28
+ attribute :last_name, :type => String
29
+ attribute :grouping_id, :type => Integer
30
+ attribute :date_of_birth, :type => Date
31
+ attribute :total, :type => Integer
32
+ attribute :completed, :type => Integer
33
+ attribute :age, :type => String
34
+ attribute :fields, :default => {}
35
+
36
+ attr_accessible :member_id, :first_name, :last_name, :date_of_birth, :grouping_id, :total, :completed, :age, :fields
37
+
38
+ validates_presence_of :first_name
39
+ validates_presence_of :last_name
40
+ validates_numericality_of :grouping_id, :only_integer=>true, :greater_than_or_equal_to=>-2
41
+ validates_format_of :age, :with => /\A[0-9]{2}\/(0[0-9]|1[012])\Z/, :message => 'age is not in the correct format (yy/mm)', :allow_nil => true
42
+ validates :fields, :hash => {:key_type => String, :value_type => String}
43
+
44
+
45
+ # @!method initialize
46
+ # Initialize a new FlexiRecordData
47
+ # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
48
+
49
+
50
+ # Initialize a new FlexiRecordData from api data
51
+ # @param [Hash] data the hash of data provided by the API
52
+ def self.from_api(data)
53
+ new({
54
+ :member_id => Osm::to_i_or_nil(data['scoutid']),
55
+ :first_name => data['firstname'],
56
+ :last_name => data['lastname'],
57
+ :grouping_id => Osm::to_i_or_nil(data['patrolid'].eql?('') ? nil : data['patrolid']),
58
+ :date_of_birth => data['dob'].nil? ? nil : Osm::parse_date(data['dob'], :ignore_epoch => true),
59
+ :total => Osm::to_i_or_nil(data['total'].eql?('') ? nil : data['total']),
60
+ :completed => Osm::to_i_or_nil(data['completed'].eql?('') ? nil : data['completed']),
61
+ :age => data['age'].eql?('') ? nil : data['age'],
62
+ :fields => data.select { |key, value| key.to_s.match(/^f_\d+/) }
63
+ })
64
+ end
65
+
66
+ end # Class FlexiRecordData
67
+
68
+ end # Module
@@ -0,0 +1,41 @@
1
+ module Osm
2
+
3
+ class FlexiRecordField
4
+ include ::ActiveAttr::MassAssignmentSecurity
5
+ include ::ActiveAttr::Model
6
+
7
+ # @!attribute [rw] id
8
+ # @return [String] OSM identifier for the field. Special ones are 'dob', 'total', 'completed', 'age', 'firstname' and 'lastname', user ones are of the format 'f\_NUMBER'
9
+ # @!attribute [rw] name
10
+ # @return [String] Human readable name for the field
11
+ # @!attribute [rw] editable
12
+ # @return [Boolean] Wether the field can be edited
13
+
14
+ attribute :id, :type => String
15
+ attribute :name, :type => String
16
+ attribute :editable, :type => Boolean, :default => false
17
+
18
+ attr_accessible :id, :name, :editable
19
+
20
+ validates_presence_of :id
21
+ validates_presence_of :name
22
+
23
+
24
+ # @!method initialize
25
+ # Initialize a new FlexiRecordField
26
+ # @param [Hash] attributes the hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
27
+
28
+
29
+ # Initialize a new FlexiRecordField from api data
30
+ # @param [Hash] data the hash of data provided by the API
31
+ def self.from_api(data)
32
+ new({
33
+ :id => data['field'],
34
+ :name => data['name'],
35
+ :editable => data['editable'],
36
+ })
37
+ end
38
+
39
+ end # Class FlexiRecordField
40
+
41
+ end # Module
@@ -47,20 +47,16 @@ module Osm
47
47
  # Initialize a new RegisterData from api data
48
48
  # @param [Hash] data the hash of data provided by the API
49
49
  def self.from_api(data)
50
- attributes = {}
51
- attributes[:member_id] = Osm::to_i_or_nil(data['scoutid'])
52
- attributes[:grouping_id] = Osm::to_i_or_nil(data['patrolid'])
53
- attributes[:section_id] = Osm::to_i_or_nil(data['sectionid'])
54
- attributes[:first_name] = data['firstname']
55
- attributes[:last_name] = data['lastname']
56
- attributes[:total] = data['total'].to_i
57
-
58
- attributes[:attendance] = {}
59
- data.except('scoutid', 'patrolid', 'sectionid', 'firstname', 'lastname', 'total').keys.each do |key|
60
- attributes[:attendance][Date.strptime(key, Osm::OSM_DATE_FORMAT)] = data[key]
61
- end
62
-
63
- new(attributes)
50
+ new(
51
+ :member_id => Osm::to_i_or_nil(data['scoutid']),
52
+ :grouping_id => Osm::to_i_or_nil(data['patrolid']),
53
+ :section_id => Osm::to_i_or_nil(data['sectionid']),
54
+ :first_name => data['firstname'],
55
+ :last_name => data['lastname'],
56
+ :total => data['total'].to_i,
57
+ :attendance => data.select { |key, value| key.to_s.match(Osm::OSM_DATE_REGEX) }.
58
+ inject({}){ |new_hash,(date, attendance)| new_hash[Date.strptime(date, Osm::OSM_DATE_FORMAT)] = attendance; new_hash },
59
+ )
64
60
  end
65
61
 
66
62
  end # Class RegisterData
@@ -111,7 +111,7 @@ module Osm
111
111
  end
112
112
 
113
113
  def inspect
114
- attribute_descriptions = attributes.merge('section' => section.inspect_without_role(self))
114
+ attribute_descriptions = attributes.merge('section' => (section.nil? ? nil : section.inspect_without_role(self)))
115
115
  return_inspect(attribute_descriptions)
116
116
  end
117
117
 
@@ -96,7 +96,10 @@ module Osm
96
96
  }
97
97
 
98
98
  # Populate arrays
99
- (data['extraRecords'].is_a?(Array) ? data['extraRecords'] : []).each do |record_data|
99
+ fr = []
100
+ fr = data['extraRecords'] if data['extraRecords'].is_a?(Array)
101
+ fr = data['extraRecords'].values if data['extraRecords'].is_a?(Hash)
102
+ fr.each do |record_data|
100
103
  attributes[:flexi_records].push FlexiRecord.from_api(record_data)
101
104
  end
102
105
 
@@ -151,7 +154,7 @@ module Osm
151
154
  end
152
155
 
153
156
  def inspect
154
- attribute_descriptions = attributes.merge('role' => role.inspect_without_section(self))
157
+ attribute_descriptions = attributes.merge('role' => (role.nil? ? nil : role.inspect_without_section(self)))
155
158
  return_inspect(attribute_descriptions)
156
159
  end
157
160
 
@@ -85,6 +85,18 @@ describe "API" do
85
85
  Osm::Api.new.authorize(user_email, user_password).should == {'userid' => 'id', 'secret' => 'secret'}
86
86
  end
87
87
 
88
+ it "sets a new API user" do
89
+ api = Osm::Api.new
90
+ api.set_user('1', '2')
91
+
92
+ HTTParty.should_receive(:post).with("https://www.onlinescoutmanager.co.uk/api.php?action=getUserRoles", {:body => {
93
+ 'apiid' => @api_config[:api_id],
94
+ 'token' => @api_config[:api_token],
95
+ 'userid' => '1',
96
+ 'secret' => '2',
97
+ }}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'[]'}) }
98
+ api.get_roles
99
+ end
88
100
 
89
101
 
90
102
  describe "Using the API:" do
@@ -325,14 +337,53 @@ describe "API" do
325
337
  'location' => '',
326
338
  'notes' => '',
327
339
  'sectionid' => 1,
328
- 'googlecalendar' => nil
340
+ 'googlecalendar' => nil,
341
+ 'archived' => '0'
329
342
  }]
330
343
  }
331
- FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents&sectionid=1", :body => body.to_json)
344
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents&sectionid=1&showArchived=true", :body => body.to_json)
332
345
  events = Osm::Api.new('1', '2').get_events(1)
333
346
  events[0].id.should == 1
334
347
  end
335
348
 
349
+ it "Fetch events for a section honoring archived option" do
350
+ body = {
351
+ 'identifier' => 'eventid',
352
+ 'label' => 'name',
353
+ 'items' => [{
354
+ 'eventid' => '1',
355
+ 'name' => 'An Event',
356
+ 'startdate' => '2001-02-03',
357
+ 'enddate' => nil,
358
+ 'starttime' => '00:00:00',
359
+ 'endtime' => '00:00:00',
360
+ 'cost' => '0.00',
361
+ 'location' => '',
362
+ 'notes' => '',
363
+ 'sectionid' => 1,
364
+ 'googlecalendar' => nil,
365
+ 'archived' => '0'
366
+ },{
367
+ 'eventid' => '2',
368
+ 'name' => 'An Archived Event',
369
+ 'startdate' => '2001-02-03',
370
+ 'enddate' => nil,
371
+ 'starttime' => '00:00:00',
372
+ 'endtime' => '00:00:00',
373
+ 'cost' => '0.00',
374
+ 'location' => '',
375
+ 'notes' => '',
376
+ 'sectionid' => 1,
377
+ 'googlecalendar' => nil,
378
+ 'archived' => '1'
379
+ }]
380
+ }
381
+
382
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents&sectionid=1&showArchived=true", :body => body.to_json)
383
+ Osm::Api.new('1', '2').get_events(1).size.should == 1
384
+ Osm::Api.new('1', '2').get_events(1, {:include_archived => true}).size.should == 2
385
+ end
386
+
336
387
 
337
388
  it "Fetch due badges for a section" do
338
389
  badges_body = []
@@ -374,6 +425,58 @@ describe "API" do
374
425
  end
375
426
 
376
427
 
428
+ it "Fetch the flexi record fields for a section" do
429
+ data = {
430
+ "extraid" => "2",
431
+ "sectionid" => "1",
432
+ "name" => "A Flexi Record",
433
+ "config" => "[{\"id\":\"f_1\",\"name\":\"Field 1\",\"width\":\"150\"},{\"id\":\"f_2\",\"name\":\"Field 2\",\"width\":\"150\"}]",
434
+ "total" => "none",
435
+ "extrafields" => "[]",
436
+ "structure" => [
437
+ {
438
+ "rows" => [
439
+ {"name" => "First name","field" => "firstname","width" => "150px"},
440
+ {"name" => "Last name","field" => "lastname","width" => "150px"},
441
+ ],
442
+ "noscroll" => true
443
+ },
444
+ {"rows" => [
445
+ {"name" => "Field 1","field" => "f_1","width" => "150px","editable" => true},
446
+ {"name" => "Filed 2","field" => "f_2","width" => "150px","editable" => true},
447
+ ]}
448
+ ]
449
+ }
450
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/extras.php?action=getExtra&sectionid=1&extraid=2", :body => data.to_json)
451
+
452
+ fields = Osm::Api.new('1', '2').get_flexi_record_fields(1, 2)
453
+ fields.is_a?(Array).should be_true
454
+ end
455
+
456
+ it "Fetch the flexi record data for a section" do
457
+ data = {
458
+ 'identifier' => 'scoutid',
459
+ 'label' => "name",
460
+ 'items' => [{
461
+ "scoutid" => "1",
462
+ "firstname" => "First",
463
+ "lastname" => "Last",
464
+ "dob" => "",
465
+ "patrolid" => "2",
466
+ "total" => "",
467
+ "completed" => "",
468
+ "f_1" => "A",
469
+ "f_2" => "B",
470
+ "age" => "",
471
+ "patrol" => "Green"
472
+ }]
473
+ }
474
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/extras.php?action=getExtraRecords&sectionid=1&extraid=2&termid=3&section=cubs", :body => data.to_json)
475
+
476
+ records = Osm::Api.new('1', '2').get_flexi_record_data(Osm::Section.new(:id => 1, :type => :cubs), 2, 3)
477
+ records.is_a?(Array).should be_true
478
+ end
479
+
377
480
 
378
481
  it "Create an evening (succeded)" do
379
482
  url = 'https://www.onlinescoutmanager.co.uk/programme.php?action=addActivityToProgramme'
@@ -479,9 +582,12 @@ describe "API" do
479
582
  'userid' => 'user',
480
583
  'secret' => 'secret',
481
584
  }
585
+ api = Osm::Api.new('1', '2')
482
586
 
483
587
  HTTParty.should_receive(:post).with(url, {:body => post_data}) { DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"1":"Section 1"}'}) }
484
- Osm::Api.new('1', '2').get_notepads({}, {'userid'=>'user', 'secret'=>'secret'}).should == {1 => 'Section 1'}
588
+ api.should_receive(:warn).with('[DEPRECATION OF OPTION] use of the api_data option is deprecated.')
589
+
590
+ api.get_notepads({}, {'userid'=>'user', 'secret'=>'secret'}).should == {1 => 'Section 1'}
485
591
  end
486
592
  end
487
593
 
@@ -40,7 +40,7 @@ describe "Online Scout Manager API Strangeness" do
40
40
 
41
41
  it "handles a non existant array when no events" do
42
42
  data = '{"identifier":"eventid","label":"name"}'
43
- FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents&sectionid=1", :body => data)
43
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/events.php?action=getEvents&sectionid=1&showArchived=true", :body => data)
44
44
 
45
45
  @api.get_events(1).should == []
46
46
  end
@@ -51,6 +51,33 @@ describe "Online Scout Manager API Strangeness" do
51
51
  FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/api.php?action=getUserRoles", :body => body)
52
52
 
53
53
  @api.get_section(1).fields.should == {}
54
+ end
55
+
56
+
57
+ it "handles a section's flexi records being a hash" do
58
+ data = {
59
+ 'subscription_level' => '3',
60
+ 'subscription_expires' => (Date.today + 60).strftime('%Y-%m-%d'),
61
+ 'sectionType' => 'cubs',
62
+ 'numscouts' => 10,
63
+ 'columnNames' => {},
64
+ 'fields' => {},
65
+ 'intouch' => {},
66
+ 'mobFields' => {},
67
+ 'extraRecords' => {
68
+ '1' => {
69
+ 'name' => 'Name 1',
70
+ 'extraid' => 1
71
+ },
72
+ '2' => {
73
+ 'name' => 'Name 2',
74
+ 'extraid' => 2
75
+ }
76
+ }
77
+ }
78
+ section = Osm::Section.from_api(1, 'Name', data, nil)
79
+ section.flexi_records.size.should == 2
54
80
 
55
81
  end
82
+
56
83
  end
@@ -15,7 +15,8 @@ describe "Event" do
15
15
  'endtime' => '',
16
16
  'cost' => 'Free',
17
17
  'location' => 'Somewhere',
18
- 'notes' => 'None'
18
+ 'notes' => 'None',
19
+ 'archived' => '0'
19
20
  }
20
21
  event = Osm::Event.from_api(data)
21
22
 
@@ -27,6 +28,7 @@ describe "Event" do
27
28
  event.cost.should == 'Free'
28
29
  event.location.should == 'Somewhere'
29
30
  event.notes.should == 'None'
31
+ event.archived.should be_false
30
32
  event.valid?.should be_true
31
33
  end
32
34
 
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'date'
4
+
5
+
6
+ describe "Flexi Record Data" do
7
+
8
+ it "Create from API data" do
9
+ data = {
10
+ "scoutid" => "1",
11
+ "firstname" => "First",
12
+ "lastname" => "Last",
13
+ "dob" => "1899-11-30",
14
+ "patrolid" => "2",
15
+ "total" => "3",
16
+ "completed" => "",
17
+ "f_1" => "a",
18
+ "f_2" => "b",
19
+ "age" => "",
20
+ "patrol" => "Green"
21
+ }
22
+
23
+ rd = Osm::FlexiRecordData.from_api(data)
24
+
25
+ rd.member_id.should == 1
26
+ rd.grouping_id.should == 2
27
+ rd.first_name.should == 'First'
28
+ rd.last_name.should == 'Last'
29
+ rd.total.should == 3
30
+ rd.completed.nil?.should be_true
31
+ rd.age.nil?.should be_true
32
+ rd.date_of_birth.should == Date.new(1899, 11, 30)
33
+ rd.fields.should == {
34
+ 'f_1' => 'a',
35
+ 'f_2' => 'b',
36
+ }
37
+ rd.valid?.should be_true
38
+ end
39
+
40
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+
5
+ describe "Flexi Record Field" do
6
+
7
+ it "Create from API data" do
8
+ data = {
9
+ "field" => "f_1",
10
+ "name" => "Field Name",
11
+ "width" => "150",
12
+ "editable" => true
13
+ }
14
+
15
+ field = Osm::FlexiRecordField.from_api(data)
16
+
17
+ field.id.should == 'f_1'
18
+ field.name.should == 'Field Name'
19
+ field.editable.should be_true
20
+ field.valid?.should be_true
21
+ end
22
+
23
+ end
data/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Osm
2
- VERSION = "0.0.19"
2
+ VERSION = "0.0.20"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-12 00:00:00.000000000Z
12
+ date: 2012-09-24 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &80296550 !ruby/object:Gem::Requirement
16
+ requirement: &80777240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *80296550
24
+ version_requirements: *80777240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: httparty
27
- requirement: &80296180 !ruby/object:Gem::Requirement
27
+ requirement: &80776920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *80296180
35
+ version_requirements: *80776920
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_attr
38
- requirement: &80295520 !ruby/object:Gem::Requirement
38
+ requirement: &80776570 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *80295520
46
+ version_requirements: *80776570
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activemodel
49
- requirement: &80295180 !ruby/object:Gem::Requirement
49
+ requirement: &80776260 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *80295180
57
+ version_requirements: *80776260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &80294690 !ruby/object:Gem::Requirement
60
+ requirement: &80775920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *80294690
68
+ version_requirements: *80775920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &80294360 !ruby/object:Gem::Requirement
71
+ requirement: &80775540 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *80294360
79
+ version_requirements: *80775540
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: fakeweb
82
- requirement: &80294040 !ruby/object:Gem::Requirement
82
+ requirement: &80775080 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *80294040
90
+ version_requirements: *80775080
91
91
  description: Use the Online Scout Manager API (https://www.onlinescoutmanager.co.uk)
92
92
  to retrieve and save data.
93
93
  email:
@@ -113,6 +113,8 @@ files:
113
113
  - lib/osm/due_badges.rb
114
114
  - lib/osm/evening.rb
115
115
  - lib/osm/event.rb
116
+ - lib/osm/flexi_record_data.rb
117
+ - lib/osm/flexi_record_field.rb
116
118
  - lib/osm/grouping.rb
117
119
  - lib/osm/member.rb
118
120
  - lib/osm/register_data.rb
@@ -128,6 +130,8 @@ files:
128
130
  - spec/osm/due_badges_spec.rb
129
131
  - spec/osm/evening_spec.rb
130
132
  - spec/osm/event_spec.rb
133
+ - spec/osm/flexi_record_data_spec.rb
134
+ - spec/osm/flexi_record_field_spec.rb
131
135
  - spec/osm/grouping_spec.rb
132
136
  - spec/osm/member_spec.rb
133
137
  - spec/osm/osm_spec.rb