osm 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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