powerapi 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/powerapi.rb +37 -4
- data/lib/powerapi/data/assignment.rb +29 -0
- data/lib/powerapi/data/section.rb +51 -0
- data/lib/powerapi/data/student.rb +75 -0
- data/lib/powerapi/parser.rb +2 -2
- data/lib/powerapi/version.rb +1 -1
- data/powerapi.gemspec +2 -1
- data/spec/{assignment_spec.rb → data_assignment_spec.rb} +2 -2
- data/spec/{section_spec.rb → data_section_spec.rb} +4 -4
- data/spec/{student_spec.rb → data_student_spec.rb} +4 -4
- data/spec/fixtures/district/http_nonstandard.json +1 -0
- data/spec/fixtures/district/http_standard.json +1 -0
- data/spec/fixtures/district/https_nonstandard.json +1 -0
- data/spec/fixtures/district/https_standard.json +1 -0
- data/spec/parser_spec.rb +2 -2
- data/spec/powerapi_spec.rb +52 -1
- data/spec/spec_helper.rb +6 -3
- metadata +34 -12
- data/lib/powerapi/assignment.rb +0 -27
- data/lib/powerapi/section.rb +0 -49
- data/lib/powerapi/student.rb +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63d3c8580e2d02e887d44732b857882bc8d2e104
|
4
|
+
data.tar.gz: 1ba4b8b6720e3e4ddc9261e0c3e9467bee9a7ec6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af346ff6b959d0172ac4356e8354c14e6f11ea5b793fa0ef531d10abf557419cfcd139e6b1690bcc40caa7a5dec414f6b9438303820b11ec2facf7da9bf4c61f
|
7
|
+
data.tar.gz: e02214d310936139690ac4830d19667b5420c53f680cf17672b27a780754c3f473609b1e1dd36eb3362fafe65299ac208709dd7b6ff85088aca487709da25338
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
[](https://travis-ci.org/powerapi/powerapi-ruby)
|
2
|
-
[](https://coveralls.io/r/powerapi/powerapi-ruby)
|
3
3
|
[](https://codeclimate.com/github/powerapi/powerapi-ruby)
|
4
4
|
[](https://rubygems.org/gems/powerapi)
|
5
5
|
|
data/lib/powerapi.rb
CHANGED
@@ -2,9 +2,9 @@ require "powerapi/exception.rb"
|
|
2
2
|
require "powerapi/parser.rb"
|
3
3
|
require "powerapi/version.rb"
|
4
4
|
|
5
|
-
require "powerapi/assignment.rb"
|
6
|
-
require "powerapi/section.rb"
|
7
|
-
require "powerapi/student.rb"
|
5
|
+
require "powerapi/data/assignment.rb"
|
6
|
+
require "powerapi/data/section.rb"
|
7
|
+
require "powerapi/data/student.rb"
|
8
8
|
|
9
9
|
require "savon"
|
10
10
|
require "json"
|
@@ -31,7 +31,7 @@ module PowerAPI
|
|
31
31
|
|
32
32
|
session = login.body[:login_response][:return][:user_session_vo]
|
33
33
|
|
34
|
-
return PowerAPI::Student.new(url, session, fetch_transcript)
|
34
|
+
return PowerAPI::Data::Student.new(url, session, fetch_transcript)
|
35
35
|
end
|
36
36
|
|
37
37
|
def clean_url(url)
|
@@ -41,4 +41,37 @@ module PowerAPI
|
|
41
41
|
url = url
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
def district_lookup(code)
|
46
|
+
request = HTTPI::Request.new("https://powersource.pearsonschoolsystems.com/services/rest/remote-device/v2/get-district/" + code)
|
47
|
+
request.headers = { "Accept" => "application/json" }
|
48
|
+
|
49
|
+
details = HTTPI.get(request)
|
50
|
+
|
51
|
+
if details.error?
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
details = JSON.parse(details.body)
|
56
|
+
|
57
|
+
district_lookup_url(details["district"]["server"])
|
58
|
+
end
|
59
|
+
|
60
|
+
def district_lookup_url(district_server)
|
61
|
+
if district_server["sslEnabled"] == true
|
62
|
+
url = "https://"
|
63
|
+
else
|
64
|
+
url = 'http://'
|
65
|
+
end
|
66
|
+
|
67
|
+
url += district_server["serverAddress"]
|
68
|
+
|
69
|
+
if (district_server["sslEnabled"] == true and district_server["portNumber"] != 443) or
|
70
|
+
(district_server["sslEnabled"] == false and district_server["portNumber"] != 80)
|
71
|
+
|
72
|
+
url += ":" + district_server["portNumber"].to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
url
|
76
|
+
end
|
44
77
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module PowerAPI
|
2
|
+
module Data
|
3
|
+
class Assignment
|
4
|
+
def initialize(details)
|
5
|
+
@details = details
|
6
|
+
end
|
7
|
+
|
8
|
+
def category
|
9
|
+
@details[:category]["name"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def description
|
13
|
+
@details[:assignment]["description"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
@details[:assignment]["name"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def percent
|
21
|
+
@details[:score]["percent"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def score
|
25
|
+
@details[:score]["score"]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module PowerAPI
|
2
|
+
module Data
|
3
|
+
class Section
|
4
|
+
def initialize(details)
|
5
|
+
@details = details
|
6
|
+
|
7
|
+
# Occasionally, a section won't have any final_grades objects
|
8
|
+
if @details[:final_grades] != nil
|
9
|
+
@final_grades = {}
|
10
|
+
|
11
|
+
@details[:final_grades].each do |final_grade|
|
12
|
+
@final_grades[
|
13
|
+
@details[:reporting_terms][final_grade["reportingTermId"]]
|
14
|
+
] = final_grade["percent"]
|
15
|
+
end
|
16
|
+
else
|
17
|
+
@final_grades = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def assignments
|
22
|
+
@details[:assignments]
|
23
|
+
end
|
24
|
+
|
25
|
+
def expression
|
26
|
+
@details[:section]["expression"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def final_grades
|
30
|
+
@final_grades
|
31
|
+
end
|
32
|
+
|
33
|
+
def name
|
34
|
+
@details[:section]["schoolCourseTitle"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def room_name
|
38
|
+
@details[:section]["roomName"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def teacher
|
42
|
+
{
|
43
|
+
:first_name => @details[:teacher]["firstName"],
|
44
|
+
:last_name => @details[:teacher]["lastName"],
|
45
|
+
:email => @details[:teacher]["email"],
|
46
|
+
:school_phone => @details[:teacher]["schoolPhone"]
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module PowerAPI
|
2
|
+
module Data
|
3
|
+
class Student
|
4
|
+
def initialize(soap_url, soap_session, populate=true)
|
5
|
+
@soap_url = soap_url
|
6
|
+
@soap_session = soap_session
|
7
|
+
|
8
|
+
if populate
|
9
|
+
self.populate()
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def populate()
|
14
|
+
transcript = self.fetch_transcript
|
15
|
+
self.parse_transcript(transcript)
|
16
|
+
end
|
17
|
+
|
18
|
+
def fetch_transcript()
|
19
|
+
student_client = Savon.client(
|
20
|
+
endpoint: @soap_url + "/pearson-rest/services/PublicPortalServiceJSON?response=application/json",
|
21
|
+
namespace: "http://publicportal.rest.powerschool.pearson.com/xsd",
|
22
|
+
digest_auth: ["pearson", "m0bApP5"]
|
23
|
+
)
|
24
|
+
|
25
|
+
transcript_params = {
|
26
|
+
userSessionVO: {
|
27
|
+
userId: @soap_session[:user_id],
|
28
|
+
serviceTicket: @soap_session[:service_ticket],
|
29
|
+
serverInfo: {
|
30
|
+
apiVersion: @soap_session[:server_info][:api_version]
|
31
|
+
},
|
32
|
+
serverCurrentTime: "2012-12-26T21:47:23.792Z", # I really don't know.
|
33
|
+
userType: "2"
|
34
|
+
},
|
35
|
+
studentIDs: @soap_session[:student_i_ds],
|
36
|
+
qil: {
|
37
|
+
includes: "1"
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
transcript = student_client.call(:get_student_data, message: transcript_params).to_xml
|
42
|
+
|
43
|
+
JSON.parse(transcript)
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_transcript(transcript)
|
47
|
+
@student_data = transcript["return"]["studentDataVOs"]
|
48
|
+
|
49
|
+
@student_data["student"].delete("@type")
|
50
|
+
|
51
|
+
assignment_categories = PowerAPI::Parser.assignment_categories(@student_data["assignmentCategories"])
|
52
|
+
assignment_scores = PowerAPI::Parser.assignment_scores(@student_data["assignmentScores"])
|
53
|
+
final_grades = PowerAPI::Parser.final_grades(@student_data["finalGrades"])
|
54
|
+
reporting_terms = PowerAPI::Parser.reporting_terms(@student_data["reportingTerms"])
|
55
|
+
teachers = PowerAPI::Parser.teachers(@student_data["teachers"])
|
56
|
+
|
57
|
+
assignments = PowerAPI::Parser.assignments(@student_data["assignments"], assignment_categories, assignment_scores)
|
58
|
+
|
59
|
+
@sections = PowerAPI::Parser.sections(@student_data["sections"], assignments, final_grades, reporting_terms, teachers)
|
60
|
+
|
61
|
+
return 0
|
62
|
+
end
|
63
|
+
|
64
|
+
def sections
|
65
|
+
@sections
|
66
|
+
end
|
67
|
+
|
68
|
+
def information
|
69
|
+
if @student_data != nil
|
70
|
+
@student_data["student"]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/powerapi/parser.rb
CHANGED
@@ -8,7 +8,7 @@ module PowerAPI
|
|
8
8
|
assignments[assignment["sectionid"]] = []
|
9
9
|
end
|
10
10
|
|
11
|
-
assignments[assignment["sectionid"]] << PowerAPI::Assignment.new({
|
11
|
+
assignments[assignment["sectionid"]] << PowerAPI::Data::Assignment.new({
|
12
12
|
:assignment => assignment,
|
13
13
|
:category => assignment_categories[assignment["categoryId"]],
|
14
14
|
:score => assignment_scores[assignment["id"]],
|
@@ -72,7 +72,7 @@ module PowerAPI
|
|
72
72
|
next
|
73
73
|
end
|
74
74
|
|
75
|
-
sections << PowerAPI::Section.new({
|
75
|
+
sections << PowerAPI::Data::Section.new({
|
76
76
|
:assignments => assignments[section["id"]],
|
77
77
|
:final_grades => final_grades[section["id"]],
|
78
78
|
:reporting_terms => reporting_terms,
|
data/lib/powerapi/version.rb
CHANGED
data/powerapi.gemspec
CHANGED
@@ -22,7 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
24
|
spec.add_development_dependency "simplecov"
|
25
|
-
spec.add_development_dependency "
|
25
|
+
spec.add_development_dependency "webmock", "~> 1.20.0"
|
26
|
+
spec.add_development_dependency "codeclimate-test-reporter"
|
26
27
|
|
27
28
|
spec.add_runtime_dependency "savon", "~> 2.0"
|
28
29
|
spec.add_runtime_dependency "httpclient", "~> 2.4.0"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe PowerAPI::Assignment do
|
3
|
+
describe PowerAPI::Data::Assignment do
|
4
4
|
include Savon::SpecHelper
|
5
5
|
|
6
6
|
before(:all) {
|
@@ -33,7 +33,7 @@ describe PowerAPI::Assignment do
|
|
33
33
|
|
34
34
|
savon.expects(:get_student_data).with(message: message).returns(fixture)
|
35
35
|
|
36
|
-
student = PowerAPI::Student.new("http://powerschool.example", @session)
|
36
|
+
student = PowerAPI::Data::Student.new("http://powerschool.example", @session)
|
37
37
|
|
38
38
|
@assignment = student.sections[0].assignments[0]
|
39
39
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe PowerAPI::Section do
|
3
|
+
describe PowerAPI::Data::Section do
|
4
4
|
include Savon::SpecHelper
|
5
5
|
|
6
6
|
before(:all) {
|
@@ -33,7 +33,7 @@ describe PowerAPI::Section do
|
|
33
33
|
|
34
34
|
savon.expects(:get_student_data).with(message: message).returns(fixture)
|
35
35
|
|
36
|
-
student = PowerAPI::Student.new("http://powerschool.example", @session)
|
36
|
+
student = PowerAPI::Data::Student.new("http://powerschool.example", @session)
|
37
37
|
|
38
38
|
@section0 = student.sections[0]
|
39
39
|
@section1 = student.sections[1]
|
@@ -50,10 +50,10 @@ describe PowerAPI::Section do
|
|
50
50
|
).to be(1)
|
51
51
|
end
|
52
52
|
|
53
|
-
it "has a PowerAPI::Assignment instance at index 0" do
|
53
|
+
it "has a PowerAPI::Data::Assignment instance at index 0" do
|
54
54
|
expect(
|
55
55
|
@section0.assignments[0]
|
56
|
-
).to be_an_instance_of(PowerAPI::Assignment)
|
56
|
+
).to be_an_instance_of(PowerAPI::Data::Assignment)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe PowerAPI::Student do
|
3
|
+
describe PowerAPI::Data::Student do
|
4
4
|
include Savon::SpecHelper
|
5
5
|
|
6
6
|
before(:all) {
|
@@ -15,7 +15,7 @@ describe PowerAPI::Student do
|
|
15
15
|
|
16
16
|
describe "#initialize" do
|
17
17
|
before(:each) {
|
18
|
-
@student = PowerAPI::Student.new("http://powerschool.example", @session, false)
|
18
|
+
@student = PowerAPI::Data::Student.new("http://powerschool.example", @session, false)
|
19
19
|
}
|
20
20
|
|
21
21
|
after(:each) {
|
@@ -56,7 +56,7 @@ describe PowerAPI::Student do
|
|
56
56
|
|
57
57
|
savon.expects(:get_student_data).with(message: message).returns(fixture)
|
58
58
|
|
59
|
-
student = PowerAPI::Student.new("http://powerschool.example", @session, false)
|
59
|
+
student = PowerAPI::Data::Student.new("http://powerschool.example", @session, false)
|
60
60
|
|
61
61
|
transcript = student.fetch_transcript["return"]["studentDataVOs"]
|
62
62
|
|
@@ -73,7 +73,7 @@ describe PowerAPI::Student do
|
|
73
73
|
fixture = File.read("spec/fixtures/transcript.json")
|
74
74
|
fixture = JSON.parse(fixture)
|
75
75
|
|
76
|
-
@student = PowerAPI::Student.new("http://powerschool.example", @session, false)
|
76
|
+
@student = PowerAPI::Data::Student.new("http://powerschool.example", @session, false)
|
77
77
|
|
78
78
|
@student.parse_transcript(fixture)
|
79
79
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"district":{"id":1,"code":"SMPL","name":"Sample District","number":"SaMpLeDiStRiCt","state":"CA","city":"Lincoln","zip":96669,"server":{"apiVersion":"2.1.1","portNumber":8080,"serverAddress":"powerschool.example","sslEnabled":false},"validated":true,"remoteAuthDisabled":false,"remoteAuthMsg":""}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"district":{"id":1,"code":"SMPL","name":"Sample District","number":"SaMpLeDiStRiCt","state":"CA","city":"Lincoln","zip":96669,"server":{"apiVersion":"2.1.1","portNumber":80,"serverAddress":"powerschool.example","sslEnabled":false},"validated":true,"remoteAuthDisabled":false,"remoteAuthMsg":""}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"district":{"id":1,"code":"SMPL","name":"Sample District","number":"SaMpLeDiStRiCt","state":"CA","city":"Lincoln","zip":96669,"server":{"apiVersion":"2.1.1","portNumber":8181,"serverAddress":"powerschool.example","sslEnabled":true},"validated":true,"remoteAuthDisabled":false,"remoteAuthMsg":""}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"district":{"id":1,"code":"SMPL","name":"Sample District","number":"SaMpLeDiStRiCt","state":"CA","city":"Lincoln","zip":96669,"server":{"apiVersion":"2.1.1","portNumber":443,"serverAddress":"powerschool.example","sslEnabled":true},"validated":true,"remoteAuthDisabled":false,"remoteAuthMsg":""}}
|
data/spec/parser_spec.rb
CHANGED
@@ -130,13 +130,13 @@ describe PowerAPI::Parser do
|
|
130
130
|
it "contains a section at index 0" do
|
131
131
|
expect(
|
132
132
|
@sections[0]
|
133
|
-
).to be_a(PowerAPI::Section)
|
133
|
+
).to be_a(PowerAPI::Data::Section)
|
134
134
|
end
|
135
135
|
|
136
136
|
it "contains a section at index 1" do
|
137
137
|
expect(
|
138
138
|
@sections[0]
|
139
|
-
).to be_a(PowerAPI::Section)
|
139
|
+
).to be_a(PowerAPI::Data::Section)
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
data/spec/powerapi_spec.rb
CHANGED
@@ -31,7 +31,7 @@ describe PowerAPI do
|
|
31
31
|
|
32
32
|
expect(
|
33
33
|
PowerAPI.authenticate("http://powerschool.example", "student", "123456", false)
|
34
|
-
).to be_an_instance_of(PowerAPI::Student)
|
34
|
+
).to be_an_instance_of(PowerAPI::Data::Student)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -48,4 +48,55 @@ describe PowerAPI do
|
|
48
48
|
).to eq("https://powerschool.example")
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
describe "#district_lookup" do
|
53
|
+
it "doesn't find a district" do
|
54
|
+
stub_request(:get, /powersource.pearsonschoolsystems.com/).
|
55
|
+
to_return(status: 404, body: "", headers: {})
|
56
|
+
|
57
|
+
expect(
|
58
|
+
PowerAPI.district_lookup('SMPL')
|
59
|
+
).to eq(false)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "finds an HTTPS district" do
|
63
|
+
fixture = File.read("spec/fixtures/district/https_standard.json")
|
64
|
+
stub_request(:get, /powersource.pearsonschoolsystems.com/).
|
65
|
+
to_return(status: 200, body: fixture, headers: {})
|
66
|
+
|
67
|
+
expect(
|
68
|
+
PowerAPI.district_lookup('SMPL')
|
69
|
+
).to eq("https://powerschool.example")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "finds an nonstandard HTTPS district" do
|
73
|
+
fixture = File.read("spec/fixtures/district/https_nonstandard.json")
|
74
|
+
stub_request(:get, /powersource.pearsonschoolsystems.com/).
|
75
|
+
to_return(status: 200, body: fixture, headers: {})
|
76
|
+
|
77
|
+
expect(
|
78
|
+
PowerAPI.district_lookup('SMPL')
|
79
|
+
).to eq("https://powerschool.example:8181")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "finds an HTTP district" do
|
83
|
+
fixture = File.read("spec/fixtures/district/http_standard.json")
|
84
|
+
stub_request(:get, /powersource.pearsonschoolsystems.com/).
|
85
|
+
to_return(status: 200, body: fixture, headers: {})
|
86
|
+
|
87
|
+
expect(
|
88
|
+
PowerAPI.district_lookup('SMPL')
|
89
|
+
).to eq("http://powerschool.example")
|
90
|
+
end
|
91
|
+
|
92
|
+
it "finds an nonstandard HTTP district" do
|
93
|
+
fixture = File.read("spec/fixtures/district/http_nonstandard.json")
|
94
|
+
stub_request(:get, /powersource.pearsonschoolsystems.com/).
|
95
|
+
to_return(status: 200, body: fixture, headers: {})
|
96
|
+
|
97
|
+
expect(
|
98
|
+
PowerAPI.district_lookup('SMPL')
|
99
|
+
).to eq("http://powerschool.example:8080")
|
100
|
+
end
|
101
|
+
end
|
51
102
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require "simplecov"
|
2
2
|
|
3
|
-
# Only use
|
3
|
+
# Only use CodeClimate when being run in CI
|
4
4
|
if ENV["CI"]
|
5
|
-
require "
|
6
|
-
SimpleCov.formatter =
|
5
|
+
require "codeclimate-test-reporter"
|
6
|
+
SimpleCov.formatter = CodeClimate::TestReporter::Formatter
|
7
7
|
end
|
8
8
|
|
9
9
|
SimpleCov.start do
|
@@ -13,3 +13,6 @@ end
|
|
13
13
|
require "powerapi"
|
14
14
|
|
15
15
|
require "savon/mock/spec_helper"
|
16
|
+
|
17
|
+
require 'webmock/rspec'
|
18
|
+
WebMock.disable_net_connect!(:allow => [/localhost/, /codeclimate.com/])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: powerapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henri Watson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -67,7 +67,21 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.20.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.20.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: codeclimate-test-reporter
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - '>='
|
@@ -136,22 +150,26 @@ files:
|
|
136
150
|
- README.md
|
137
151
|
- Rakefile
|
138
152
|
- lib/powerapi.rb
|
139
|
-
- lib/powerapi/assignment.rb
|
153
|
+
- lib/powerapi/data/assignment.rb
|
154
|
+
- lib/powerapi/data/section.rb
|
155
|
+
- lib/powerapi/data/student.rb
|
140
156
|
- lib/powerapi/exception.rb
|
141
157
|
- lib/powerapi/parser.rb
|
142
|
-
- lib/powerapi/section.rb
|
143
|
-
- lib/powerapi/student.rb
|
144
158
|
- lib/powerapi/version.rb
|
145
159
|
- powerapi.gemspec
|
146
|
-
- spec/
|
160
|
+
- spec/data_assignment_spec.rb
|
161
|
+
- spec/data_section_spec.rb
|
162
|
+
- spec/data_student_spec.rb
|
147
163
|
- spec/fixtures/authentication/failure.xml
|
148
164
|
- spec/fixtures/authentication/success.xml
|
165
|
+
- spec/fixtures/district/http_nonstandard.json
|
166
|
+
- spec/fixtures/district/http_standard.json
|
167
|
+
- spec/fixtures/district/https_nonstandard.json
|
168
|
+
- spec/fixtures/district/https_standard.json
|
149
169
|
- spec/fixtures/transcript.json
|
150
170
|
- spec/parser_spec.rb
|
151
171
|
- spec/powerapi_spec.rb
|
152
|
-
- spec/section_spec.rb
|
153
172
|
- spec/spec_helper.rb
|
154
|
-
- spec/student_spec.rb
|
155
173
|
homepage: http://powerapi.henriwatson.com/
|
156
174
|
licenses:
|
157
175
|
- MIT
|
@@ -177,12 +195,16 @@ signing_key:
|
|
177
195
|
specification_version: 4
|
178
196
|
summary: Ruby API for PowerSchool.
|
179
197
|
test_files:
|
180
|
-
- spec/
|
198
|
+
- spec/data_assignment_spec.rb
|
199
|
+
- spec/data_section_spec.rb
|
200
|
+
- spec/data_student_spec.rb
|
181
201
|
- spec/fixtures/authentication/failure.xml
|
182
202
|
- spec/fixtures/authentication/success.xml
|
203
|
+
- spec/fixtures/district/http_nonstandard.json
|
204
|
+
- spec/fixtures/district/http_standard.json
|
205
|
+
- spec/fixtures/district/https_nonstandard.json
|
206
|
+
- spec/fixtures/district/https_standard.json
|
183
207
|
- spec/fixtures/transcript.json
|
184
208
|
- spec/parser_spec.rb
|
185
209
|
- spec/powerapi_spec.rb
|
186
|
-
- spec/section_spec.rb
|
187
210
|
- spec/spec_helper.rb
|
188
|
-
- spec/student_spec.rb
|
data/lib/powerapi/assignment.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module PowerAPI
|
2
|
-
class Assignment
|
3
|
-
def initialize(details)
|
4
|
-
@details = details
|
5
|
-
end
|
6
|
-
|
7
|
-
def category
|
8
|
-
@details[:category]["name"]
|
9
|
-
end
|
10
|
-
|
11
|
-
def description
|
12
|
-
@details[:assignment]["description"]
|
13
|
-
end
|
14
|
-
|
15
|
-
def name
|
16
|
-
@details[:assignment]["name"]
|
17
|
-
end
|
18
|
-
|
19
|
-
def percent
|
20
|
-
@details[:score]["percent"]
|
21
|
-
end
|
22
|
-
|
23
|
-
def score
|
24
|
-
@details[:score]["score"]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/powerapi/section.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
module PowerAPI
|
2
|
-
class Section
|
3
|
-
def initialize(details)
|
4
|
-
@details = details
|
5
|
-
|
6
|
-
# Occasionally, a section won't have any final_grades objects
|
7
|
-
if @details[:final_grades] != nil
|
8
|
-
@final_grades = {}
|
9
|
-
|
10
|
-
@details[:final_grades].each do |final_grade|
|
11
|
-
@final_grades[
|
12
|
-
@details[:reporting_terms][final_grade["reportingTermId"]]
|
13
|
-
] = final_grade["percent"]
|
14
|
-
end
|
15
|
-
else
|
16
|
-
@final_grades = nil
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def assignments
|
21
|
-
@details[:assignments]
|
22
|
-
end
|
23
|
-
|
24
|
-
def expression
|
25
|
-
@details[:section]["expression"]
|
26
|
-
end
|
27
|
-
|
28
|
-
def final_grades
|
29
|
-
@final_grades
|
30
|
-
end
|
31
|
-
|
32
|
-
def name
|
33
|
-
@details[:section]["schoolCourseTitle"]
|
34
|
-
end
|
35
|
-
|
36
|
-
def room_name
|
37
|
-
@details[:section]["roomName"]
|
38
|
-
end
|
39
|
-
|
40
|
-
def teacher
|
41
|
-
{
|
42
|
-
:first_name => @details[:teacher]["firstName"],
|
43
|
-
:last_name => @details[:teacher]["lastName"],
|
44
|
-
:email => @details[:teacher]["email"],
|
45
|
-
:school_phone => @details[:teacher]["schoolPhone"]
|
46
|
-
}
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/powerapi/student.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
module PowerAPI
|
2
|
-
class Student
|
3
|
-
def initialize(soap_url, soap_session, populate=true)
|
4
|
-
@soap_url = soap_url
|
5
|
-
@soap_session = soap_session
|
6
|
-
|
7
|
-
if populate
|
8
|
-
self.populate()
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def populate()
|
13
|
-
transcript = self.fetch_transcript
|
14
|
-
self.parse_transcript(transcript)
|
15
|
-
end
|
16
|
-
|
17
|
-
def fetch_transcript()
|
18
|
-
student_client = Savon.client(
|
19
|
-
endpoint: @soap_url + "/pearson-rest/services/PublicPortalServiceJSON?response=application/json",
|
20
|
-
namespace: "http://publicportal.rest.powerschool.pearson.com/xsd",
|
21
|
-
digest_auth: ["pearson", "m0bApP5"]
|
22
|
-
)
|
23
|
-
|
24
|
-
transcript_params = {
|
25
|
-
userSessionVO: {
|
26
|
-
userId: @soap_session[:user_id],
|
27
|
-
serviceTicket: @soap_session[:service_ticket],
|
28
|
-
serverInfo: {
|
29
|
-
apiVersion: @soap_session[:server_info][:api_version]
|
30
|
-
},
|
31
|
-
serverCurrentTime: "2012-12-26T21:47:23.792Z", # I really don't know.
|
32
|
-
userType: "2"
|
33
|
-
},
|
34
|
-
studentIDs: @soap_session[:student_i_ds],
|
35
|
-
qil: {
|
36
|
-
includes: "1"
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
transcript = student_client.call(:get_student_data, message: transcript_params).to_xml
|
41
|
-
|
42
|
-
JSON.parse(transcript)
|
43
|
-
end
|
44
|
-
|
45
|
-
def parse_transcript(transcript)
|
46
|
-
@student_data = transcript["return"]["studentDataVOs"]
|
47
|
-
|
48
|
-
@student_data["student"].delete("@type")
|
49
|
-
|
50
|
-
assignment_categories = PowerAPI::Parser.assignment_categories(@student_data["assignmentCategories"])
|
51
|
-
assignment_scores = PowerAPI::Parser.assignment_scores(@student_data["assignmentScores"])
|
52
|
-
final_grades = PowerAPI::Parser.final_grades(@student_data["finalGrades"])
|
53
|
-
reporting_terms = PowerAPI::Parser.reporting_terms(@student_data["reportingTerms"])
|
54
|
-
teachers = PowerAPI::Parser.teachers(@student_data["teachers"])
|
55
|
-
|
56
|
-
assignments = PowerAPI::Parser.assignments(@student_data["assignments"], assignment_categories, assignment_scores)
|
57
|
-
|
58
|
-
@sections = PowerAPI::Parser.sections(@student_data["sections"], assignments, final_grades, reporting_terms, teachers)
|
59
|
-
|
60
|
-
return 0
|
61
|
-
end
|
62
|
-
|
63
|
-
def sections
|
64
|
-
@sections
|
65
|
-
end
|
66
|
-
|
67
|
-
def information
|
68
|
-
if @student_data != nil
|
69
|
-
@student_data["student"]
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|