osm 0.2.2 → 0.3.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.
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "Badges" do
5
+
6
+
7
+ describe "Using the OSM API" do
8
+
9
+ it "Get due badges" do
10
+ data = {
11
+ 'pending' => {
12
+ 'badge_name' => [
13
+ {
14
+ 'scoutid' => '1',
15
+ 'firstname' => 'John',
16
+ 'lastname' => 'Doe',
17
+ 'level' => '',
18
+ 'extra' => '',
19
+ }
20
+ ],
21
+ 'staged_staged_participation' => [{
22
+ 'sid' => '2',
23
+ 'firstname' => 'Jane',
24
+ 'lastname' => 'Doe',
25
+ 'level' => '2',
26
+ 'extra' => 'Lvl 2'
27
+ }, {
28
+ 'sid' => '1',
29
+ 'firstname' => 'John',
30
+ 'lastname' => 'Doe',
31
+ 'level' => '2',
32
+ 'extra' => 'Lvl 2'
33
+ }
34
+ ]
35
+ },
36
+
37
+ 'description' => {
38
+ 'badge_name' => {
39
+ 'name' => 'Badge Name',
40
+ 'section' => 'cubs',
41
+ 'type' => 'activity',
42
+ 'badge' => 'badge_name'
43
+ },
44
+ 'staged_staged_participation' => {
45
+ 'name' => 'Participation',
46
+ 'section' => 'staged',
47
+ 'type' => 'staged',
48
+ 'badge' => 'participation'
49
+ }
50
+ }
51
+ }
52
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=outstandingBadges&section=cubs&sectionid=1&termid=2", :body => data.to_json)
53
+
54
+ db = Osm::Badges.get_due_badges(@api, Osm::Section.new(:id => 1, :type => :cubs), 2)
55
+ db.empty?.should == false
56
+ db.descriptions.should == {'badge_name_1'=>'Badge Name', 'staged_staged_participation_2'=>'Participation (Level 2)'}
57
+ db.by_member.should == {'John Doe'=>['badge_name_1', 'staged_staged_participation_2'], 'Jane Doe'=>['staged_staged_participation_2']}
58
+ db.totals.should == {'staged_staged_participation_2'=>2, 'badge_name_1'=>1}
59
+ db.valid?.should be_true
60
+ end
61
+
62
+ it "handles an empty array representing no due badges" do
63
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=outstandingBadges&section=cubs&sectionid=1&termid=2", :body => '[]')
64
+ db = Osm::Badges.get_due_badges(@api, Osm::Section.new(:id => 1, :type => :cubs), 2)
65
+ db.should_not == nil
66
+ end
67
+
68
+
69
+ it "Fetch badge stock levels" do
70
+ badges_body = {
71
+ 'stock' => {
72
+ 'sectionid' => '1',
73
+ 'badge_1' => '1',
74
+ 'badge_2' => '2'
75
+ }
76
+ }
77
+ FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=getInitialBadges&type=core&sectionid=1&section=beavers&termid=2", :body => badges_body.to_json)
78
+ Osm::Term.stub(:get_current_term_for_section) { Osm::Term.new(:id => 2) }
79
+
80
+ section = Osm::Section.new(:id => 1, :type => :beavers)
81
+ Osm::Badges.get_stock(@api, section).should == {'badge_1' => 1, 'badge_2' => 2}
82
+ end
83
+
84
+ describe "Update badge stock levels" do
85
+
86
+ it "Succeds" do
87
+ url = "https://www.onlinescoutmanager.co.uk/challenges.php?action=updateStock"
88
+ HTTParty.should_receive(:post).with(url, {:body => {
89
+ 'apiid' => @CONFIGURATION[:api][:osm][:id],
90
+ 'token' => @CONFIGURATION[:api][:osm][:token],
91
+ 'userid' => 'user_id',
92
+ 'secret' => 'secret',
93
+ 'stock' => 10,
94
+ 'table' => 'badge',
95
+ 'sectionid' => 1,
96
+ 'section' => :beavers,
97
+ }}) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"sectionid":"1","badge":"10"}'}) }
98
+
99
+ section = Osm::Section.new(:id => 1, :type => :beavers)
100
+ Osm::Badges.update_stock(@api, section, 'badge', 10).should be_true
101
+ end
102
+
103
+ it "Fails" do
104
+ HTTParty.stub(:post) { OsmTest::DummyHttpResult.new(:response=>{:code=>'200', :body=>'{"sectionid":"1","badge":"1"}'}) }
105
+ section = Osm::Section.new(:id => 1, :type => :beavers)
106
+ Osm::Badges.update_stock(@api, section, 'badge', 10).should be_false
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+
113
+ end
@@ -441,8 +441,9 @@ describe "Flexi Record" do
441
441
  :flexi_record => fr,
442
442
  :member_id => 4,
443
443
  :grouping_id => 5,
444
- :fields => {'f_1' => 'value'}
444
+ :fields => {'f_1' => '', 'f_2' => 'value'}
445
445
  )
446
+ fr_data.fields['f_1'] = 'value'
446
447
  fr_data.update(@api).should be_true
447
448
  end
448
449
 
@@ -463,8 +464,9 @@ describe "Flexi Record" do
463
464
  :flexi_record => fr,
464
465
  :member_id => 4,
465
466
  :grouping_id => 5,
466
- :fields => {'f_1' => 'value'}
467
+ :fields => {'f_1' => 'old value'}
467
468
  )
469
+ fr_data.fields['f_1'] = 'new value'
468
470
  fr_data.update(@api).should be_false
469
471
  end
470
472
 
@@ -190,22 +190,6 @@ describe "Section" do
190
190
  section.set_notepad(@api, 'content').should be_false
191
191
  end
192
192
 
193
-
194
- it "Fetch badge stock levels" do
195
- badges_body = {
196
- 'stock' => {
197
- 'sectionid' => '1',
198
- 'badge_1' => '1',
199
- 'badge_2' => '2'
200
- }
201
- }
202
- FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=getInitialBadges&type=core&sectionid=1&section=beavers&termid=2", :body => badges_body.to_json)
203
-
204
- section = Osm::Section.get(@api, 1)
205
- section.should_not be_nil
206
- section.get_badge_stock(@api, 2).should == {'badge_1' => 1, 'badge_2' => 2}
207
- end
208
-
209
193
  end
210
194
 
211
195
 
data/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Osm
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
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.2.2
4
+ version: 0.3.0
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: 2013-02-24 00:00:00.000000000Z
12
+ date: 2013-02-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &86025430 !ruby/object:Gem::Requirement
16
+ requirement: &86835090 !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: *86025430
24
+ version_requirements: *86835090
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: httparty
27
- requirement: &86024870 !ruby/object:Gem::Requirement
27
+ requirement: &86833800 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.9'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *86024870
35
+ version_requirements: *86833800
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: active_attr
38
- requirement: &86006950 !ruby/object:Gem::Requirement
38
+ requirement: &86832220 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.6'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *86006950
46
+ version_requirements: *86832220
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activemodel
49
- requirement: &86006710 !ruby/object:Gem::Requirement
49
+ requirement: &86819190 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,21 @@ dependencies:
54
54
  version: '3.2'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *86006710
57
+ version_requirements: *86819190
58
+ - !ruby/object:Gem::Dependency
59
+ name: dirty_hashy
60
+ requirement: &86818730 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 0.2.1
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *86818730
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rake
60
- requirement: &86006480 !ruby/object:Gem::Requirement
71
+ requirement: &86818240 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ~>
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '10.0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *86006480
79
+ version_requirements: *86818240
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rspec
71
- requirement: &86006220 !ruby/object:Gem::Requirement
82
+ requirement: &86817390 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ~>
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '2.11'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *86006220
90
+ version_requirements: *86817390
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: fakeweb
82
- requirement: &86005980 !ruby/object:Gem::Requirement
93
+ requirement: &86816770 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ~>
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: '1.3'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *86005980
101
+ version_requirements: *86816770
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: guard-rspec
93
- requirement: &86005750 !ruby/object:Gem::Requirement
104
+ requirement: &86816110 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ~>
@@ -98,18 +109,18 @@ dependencies:
98
109
  version: '2.4'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *86005750
112
+ version_requirements: *86816110
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: rb-inotify
104
- requirement: &86005510 !ruby/object:Gem::Requirement
115
+ requirement: &86815330 !ruby/object:Gem::Requirement
105
116
  none: false
106
117
  requirements:
107
118
  - - ~>
108
119
  - !ruby/object:Gem::Version
109
- version: 0.8.8
120
+ version: '0.9'
110
121
  type: :development
111
122
  prerelease: false
112
- version_requirements: *86005510
123
+ version_requirements: *86815330
113
124
  description: Use the Online Scout Manager API (https://www.onlinescoutmanager.co.uk)
114
125
  to retrieve and save data.
115
126
  email:
@@ -133,7 +144,8 @@ files:
133
144
  - lib/osm/activity.rb
134
145
  - lib/osm/api.rb
135
146
  - lib/osm/api_access.rb
136
- - lib/osm/due_badges.rb
147
+ - lib/osm/badge.rb
148
+ - lib/osm/badges.rb
137
149
  - lib/osm/event.rb
138
150
  - lib/osm/flexi_record.rb
139
151
  - lib/osm/grouping.rb
@@ -147,7 +159,8 @@ files:
147
159
  - spec/osm/activity_spec.rb
148
160
  - spec/osm/api_access_spec.rb
149
161
  - spec/osm/api_spec.rb
150
- - spec/osm/due_badges_spec.rb
162
+ - spec/osm/badge_spec.rb
163
+ - spec/osm/badges_spec.rb
151
164
  - spec/osm/event_spec.rb
152
165
  - spec/osm/flexi_record_spec.rb
153
166
  - spec/osm/grouping_spec.rb
@@ -1,102 +0,0 @@
1
- module Osm
2
-
3
- class DueBadges < Osm::Model
4
-
5
- # @!attribute [rw] descriptions
6
- # @return [Hash] descriptions for each of the badges
7
- # @!attribute [rw] by_member
8
- # @return [Hash] the due badges grouped by member
9
-
10
- attribute :descriptions, :default => {}
11
- attribute :by_member, :default => {}
12
-
13
- attr_accessible :descriptions, :by_member
14
-
15
- validates :descriptions, :hash => {:key_type => String, :value_type => String}
16
-
17
- validates_each :by_member do |record, attr, value|
18
- desc_keys = record.descriptions.keys
19
- record.errors.add(attr, 'must be a Hash') unless value.is_a?(Hash)
20
- value.each do |k, v|
21
- record.errors.add(attr, 'keys must be String') unless k.is_a?(String)
22
- record.errors.add(attr, 'values must be Arrays') unless v.is_a?(Array)
23
- v.each do |vv|
24
- record.errors.add(attr, 'internal values must be Strings') unless vv.is_a?(String)
25
- record.errors.add(attr, 'internal values must exist as a key in :descriptions') unless desc_keys.include?(vv)
26
- end
27
- end
28
- end
29
-
30
-
31
- # Get due badges
32
- # @param [Osm::Api] api The api to use to make the request
33
- # @param [Osm::Section, Fixnum, #to_i] section The section (or its ID) to get the due badges for
34
- # @param [Osm::Term, Fixnum, #to_i, nil] term The term (or its ID) to get the due badges for, passing nil causes the current term to be used
35
- # @!macro options_get
36
- # @return [Osm::DueBadges]
37
- def self.get(api, section, term=nil, options={})
38
- require_ability_to(api, :read, :badge, section, options)
39
- section = Osm::Section.get(api, section, options) if section.is_a?(Fixnum)
40
- term_id = (term.nil? ? Osm::Term.get_current_term_for_section(api, section, options) : term).to_i
41
- cache_key = ['due_badges', section.id, term_id]
42
-
43
- if !options[:no_cache] && cache_exist?(api, cache_key)
44
- return cache_read(api, cache_key)
45
- end
46
-
47
- data = api.perform_query("challenges.php?action=outstandingBadges&section=#{section.type}&sectionid=#{section.id}&termid=#{term_id}")
48
-
49
-
50
- data = {} unless data.is_a?(Hash) # OSM/OGM returns an empty array to represent no badges
51
- pending_raw = data['pending'] || {}
52
- descriptions_raw = data['description'] || {}
53
-
54
- attributes = {
55
- :by_member => {},
56
- :descriptions => {}
57
- }
58
-
59
- pending_raw.each do |key, members|
60
- members.each do |member|
61
- name = "#{member['firstname']} #{member['lastname']}"
62
- description = descriptions_raw[key]['name'] + (descriptions_raw[key]['section'].eql?('staged') ? " (Level #{member['level']})" : '')
63
- description_key = key + (descriptions_raw[key]['section'].eql?('staged') ? "_#{member['level']}" : '_1')
64
- attributes[:descriptions][description_key] = description
65
- attributes[:by_member][name] ||= []
66
- attributes[:by_member][name].push(description_key)
67
- end
68
- end
69
-
70
- due_badges = Osm::DueBadges.new(attributes)
71
- cache_write(api, cache_key, due_badges)
72
- return due_badges
73
- end
74
-
75
-
76
- # @!method initialize
77
- # Initialize a new Term
78
- # @param [Hash] attributes The hash of attributes (see attributes for descriptions, use Symbol of attribute name as the key)
79
-
80
-
81
- # Check if there are no badges due
82
- # @return [Boolean]
83
- def empty?
84
- return by_member.empty?
85
- end
86
-
87
- # Calculate the total number of badges needed
88
- # @return [Hash] the total number of each badge which is due
89
- def totals()
90
- totals = {}
91
- by_member.keys.each do |member_name|
92
- by_member[member_name].each do |badge|
93
- totals[badge] ||= 0
94
- totals[badge] += 1
95
- end
96
- end
97
- return totals
98
- end
99
-
100
- end # Class DueBadges
101
-
102
- end # Module
@@ -1,65 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- describe "DueBadge" do
5
-
6
- it "Create from API data" do
7
- data = {
8
- 'pending' => {
9
- 'badge_name' => [
10
- {
11
- 'scoutid' => '1',
12
- 'firstname' => 'John',
13
- 'lastname' => 'Doe',
14
- 'level' => '',
15
- 'extra' => '',
16
- }
17
- ],
18
- 'staged_staged_participation' => [{
19
- 'sid' => '2',
20
- 'firstname' => 'Jane',
21
- 'lastname' => 'Doe',
22
- 'level' => '2',
23
- 'extra' => 'Lvl 2'
24
- }, {
25
- 'sid' => '1',
26
- 'firstname' => 'John',
27
- 'lastname' => 'Doe',
28
- 'level' => '2',
29
- 'extra' => 'Lvl 2'
30
- }
31
- ]
32
- },
33
-
34
- 'description' => {
35
- 'badge_name' => {
36
- 'name' => 'Badge Name',
37
- 'section' => 'cubs',
38
- 'type' => 'activity',
39
- 'badge' => 'badge_name'
40
- },
41
- 'staged_staged_participation' => {
42
- 'name' => 'Participation',
43
- 'section' => 'staged',
44
- 'type' => 'staged',
45
- 'badge' => 'participation'
46
- }
47
- }
48
- }
49
- FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=outstandingBadges&section=cubs&sectionid=1&termid=2", :body => data.to_json)
50
-
51
- db = Osm::DueBadges.get(@api, Osm::Section.new(:id => 1, :type => :cubs), 2)
52
- db.empty?.should == false
53
- db.descriptions.should == {'badge_name_1'=>'Badge Name', 'staged_staged_participation_2'=>'Participation (Level 2)'}
54
- db.by_member.should == {'John Doe'=>['badge_name_1', 'staged_staged_participation_2'], 'Jane Doe'=>['staged_staged_participation_2']}
55
- db.totals.should == {'staged_staged_participation_2'=>2, 'badge_name_1'=>1}
56
- db.valid?.should be_true
57
- end
58
-
59
- it "handles an empty array representing no due badges" do
60
- FakeWeb.register_uri(:post, "https://www.onlinescoutmanager.co.uk/challenges.php?action=outstandingBadges&section=cubs&sectionid=1&termid=2", :body => '[]')
61
- db = Osm::DueBadges.get(@api, Osm::Section.new(:id => 1, :type => :cubs), 2)
62
- db.should_not == nil
63
- end
64
-
65
- end