haiku_grades 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/Gemfile +4 -0
- data/README.md +59 -0
- data/class_list.csv +3 -0
- data/config/authentication.yml.sample +5 -0
- data/entries_.csv +2 -0
- data/haiku_grades.gemspec +24 -0
- data/lib/class_export.rb +27 -0
- data/lib/full_grade.rb +36 -0
- data/lib/haiku_grades/version.rb +3 -0
- data/lib/haiku_grades.rb +87 -0
- data/lib/partial_grade.rb +37 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cdbd73188250edd455c807d94da8e130c6b4b41b
|
4
|
+
data.tar.gz: a6859d26ec24d7175f30ec333ae912f971331d92
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dd0dcc3bddbe411c27b820faa1cd5bf6db13182e191227b9c57599013ce9c4bccb4d75a239ab9a64aec546cee481c2406b2face73935a03edbdb3a49b8fc8ef4
|
7
|
+
data.tar.gz: cba863912853fda1c038722ec927a664bc62656437dc64763cfe38c04308f994082e1fde826a0b1bddd7b3c9d4226348787415592e7e0c0afb0463e91b967963
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
config/*.yml
|
10
|
+
coverage
|
11
|
+
doc/
|
12
|
+
lib/bundler/man
|
13
|
+
pkg
|
14
|
+
rdoc
|
15
|
+
spec/reports
|
16
|
+
test/tmp
|
17
|
+
test/version_tmp
|
18
|
+
tmp
|
19
|
+
*.bundle
|
20
|
+
*.so
|
21
|
+
*.o
|
22
|
+
*.a
|
23
|
+
mkmf.log
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Haiku Grades
|
2
|
+
|
3
|
+
This Ruby Gem allows you to connect to your Haiku Learning domain and export grades for a specific teacher into csv format.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your Application's Gemfile:
|
8
|
+
|
9
|
+
`gem 'haiku_grades'`
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
`$ bundle`
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
`$ gem install haiku_grades`
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Rename the authentication.yml.sample file to authentication.yml, adding in your domain's details, before running.
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it!
|
26
|
+
2. Create your feature branch: `git checkout -b my-new-feature`
|
27
|
+
3. Commit your changes: `git commit -am 'Add some feature'`
|
28
|
+
4. Push to the branch: `git push origin my-new-feature`
|
29
|
+
5. Submit a pull request :D
|
30
|
+
|
31
|
+
## History
|
32
|
+
|
33
|
+
TODO: Write history
|
34
|
+
|
35
|
+
## Credits
|
36
|
+
|
37
|
+
TODO: Write credits
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
Copyright (c) 2015 Haiku Learning
|
42
|
+
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
44
|
+
of this software and associated documentation files (the "Software"), to deal
|
45
|
+
in the Software without restriction, including without limitation the rights
|
46
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
47
|
+
copies of the Software, and to permit persons to whom the Software is
|
48
|
+
furnished to do so, subject to the following conditions:
|
49
|
+
|
50
|
+
The above copyright notice and this permission notice shall be included in
|
51
|
+
all copies or substantial portions of the Software.
|
52
|
+
|
53
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
54
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
55
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
56
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
57
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
58
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
59
|
+
THE SOFTWARE.
|
data/class_list.csv
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
id,name,code,term,year,end_date,shortname,start_date,description,for_student_only,term_schedule_id,external_id,portal_color_selected,portal_color_unselected,allow_student_to_student_messages,teacher,sections,links
|
2
|
+
5198679,Intro to English,ENG101,,2015-2016,,introtoenglish,,An Introduction to English,true,,eng101-2015,#bf3232,#e53939,false,"{""id""=>8974365, ""login""=>""andrew"", ""email""=>""Andrew@examplevillehs.com"", ""enabled""=>true, ""last_name""=>""Newman"", ""full_name""=>""Sketch Newman"", ""user_type""=>""Teacher"", ""domain_id""=>5677, ""display_id""=>""S233"", ""first_name""=>""Andrew"", ""avatar_url""=>""https://www.myhaikuclass.com/images/haiku_avatar_4.png"", ""display_login""=>""andrew"", ""time_zone_name""=>""Eastern Time (US & Canada)"", ""google_email_address""=>"""", ""external_id""=>""23986"", ""grade_levels""=>[]}",[],"[{""rel""=>""web_ui"", ""href""=>""https://no-real-data.haikulearning.com/andrew/introtoenglish""}]"
|
3
|
+
5401925,Intro to English - Manually Added,"",,2015-2016,,introtoenglish-manuallyadded,,"",true,,,#bfab32,#ccba33,false,"{""id""=>8974365, ""login""=>""andrew"", ""email""=>""Andrew@examplevillehs.com"", ""enabled""=>true, ""last_name""=>""Newman"", ""full_name""=>""Sketch Newman"", ""user_type""=>""Teacher"", ""domain_id""=>5677, ""display_id""=>""S233"", ""first_name""=>""Andrew"", ""avatar_url""=>""https://www.myhaikuclass.com/images/haiku_avatar_4.png"", ""display_login""=>""andrew"", ""time_zone_name""=>""Eastern Time (US & Canada)"", ""google_email_address""=>"""", ""external_id""=>""23986"", ""grade_levels""=>[]}","[{""id""=>1320339, ""grouping_id""=>298266, ""name""=>""A""}, {""id""=>1320340, ""grouping_id""=>298266, ""name""=>""B""}]","[{""rel""=>""web_ui"", ""href""=>""https://no-real-data.haikulearning.com/andrew/introtoenglish-manuallyadded""}]"
|
data/entries_.csv
ADDED
@@ -0,0 +1,2 @@
|
|
1
|
+
id,points,user_id,comment,finalized,created_at,updated_at,sticky_note,entered_score,displayed_percent_score,displayed_score,displayed_points,displayed_letter_notation,eclass_user_id,gradebook_entry_id,special_score_notation_id
|
2
|
+
88246478,98.0,8974327,,,2015-08-13T18:59:32Z,2015-08-13T18:59:32Z,,98.00,98.00,98.00,,A,147908846,6150046,
|
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'haiku_grades/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "haiku_grades"
|
7
|
+
spec.version = HaikuGrades::VERSION
|
8
|
+
spec.authors = ["Sam"]
|
9
|
+
spec.email = ["samf@haikulearning.com"]
|
10
|
+
spec.summary = %q{Pulls grades and exports them from a teacher within a Haiku Learning domain.}
|
11
|
+
spec.description = %q{Pulls grades and exports them from a teacher within a Haiku Learning domain.}
|
12
|
+
spec.homepage = "http://rubygems.org/gems/haiku_grades"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
21
|
+
spec.add_development_dependency 'rubocop'
|
22
|
+
spec.add_dependency 'hapi-client' # , git: 'git@github.com:haikulearning/hapi-client.git'
|
23
|
+
spec.add_dependency 'highline'
|
24
|
+
end
|
data/lib/class_export.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
class ClassExport
|
2
|
+
def self.class_list(client)
|
3
|
+
hash = client.user.eclasses_teaching['items']
|
4
|
+
|
5
|
+
# Pulls just the keys of the hash (the first values) to be used as
|
6
|
+
# column names
|
7
|
+
column_names = hash.first.keys
|
8
|
+
|
9
|
+
# Sets variable s to be a CSV, starts a loop
|
10
|
+
s = CSV.generate do |csv|
|
11
|
+
# For each item csv, adds a row (which is what '<<' does) with
|
12
|
+
# column_names (so one row)
|
13
|
+
csv << column_names
|
14
|
+
# For each item in hash (which is the list above that contains items
|
15
|
+
# within the classes the user teaches)
|
16
|
+
hash.each do |x|
|
17
|
+
# Add the values (remember, key-value pair in a hash) to a new row
|
18
|
+
# underneath the column headers
|
19
|
+
csv << x.values
|
20
|
+
end
|
21
|
+
end
|
22
|
+
# Writes the data (s) to a new file called "data.csv"
|
23
|
+
File.write('class_list.csv', s)
|
24
|
+
puts 'List exported to working directory.'
|
25
|
+
puts ''
|
26
|
+
end
|
27
|
+
end
|
data/lib/full_grade.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
class FullGrade
|
2
|
+
|
3
|
+
def self.full_list(client)
|
4
|
+
entries_columns = ''
|
5
|
+
gradebook_entries = ''
|
6
|
+
class_selection = ''
|
7
|
+
client.user.eclasses_teaching['items'].each do |eclass|
|
8
|
+
# Starts a loop to go through each element of the "items" hash within the client.user.eclasses_teaching method in the API
|
9
|
+
client.user.eclasses_teaching['items'].each do |eclass|
|
10
|
+
# Sets variable gradebooks equal to all gradebooks, accepts argument that says the eclass_id is equal to an "id" within "items" - in other words, it loops through and grabs gradebooks from each class belonging to the user
|
11
|
+
gradebooks = client.gradebooks.all(eclass_id: eclass['id'])
|
12
|
+
# Now that we have a list of gradebooks from all classes, go through the items hash in those gradebooks
|
13
|
+
gradebooks['items'].each do |gradebook|
|
14
|
+
# And, for each one, define entries within
|
15
|
+
gradebook_entries = client.gradebooks.entries(eclass_id: eclass['id'], gradebook_id: gradebook['id'], include_scores: true)
|
16
|
+
# Now we want to go through each entry and look int he items hash
|
17
|
+
gradebook_entries['items'].each do |entry|
|
18
|
+
# And we want to define columns (for use in a csv) as the keys for gradebook_entries - items, in the first array, then in the gradebook_entry_scores hash, then in the first array within that hash (since we just need column names)
|
19
|
+
entries_columns = gradebook_entries['items'][0]['gradebook_entry_scores'][0].keys
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
# Now, we need to make a csv for entries - we are using the shortname of the class to name the file so the same file is not overwritten each time,
|
24
|
+
# instead, a new file is created for each class
|
25
|
+
CSV.open("entries_.csv", 'wb') do |csv|
|
26
|
+
# Add a row for the column names defined above
|
27
|
+
csv << entries_columns
|
28
|
+
gradebook_entries['items'].each do |y|
|
29
|
+
y['gradebook_entry_scores'].each do |y|
|
30
|
+
csv << y.values
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/haiku_grades.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
$LOAD_PATH << '.'
|
2
|
+
|
3
|
+
require 'hapi-client'
|
4
|
+
require 'csv'
|
5
|
+
require 'highline/import'
|
6
|
+
require 'yaml'
|
7
|
+
require_relative 'full_grade'
|
8
|
+
require_relative 'partial_grade'
|
9
|
+
require_relative 'class_export'
|
10
|
+
|
11
|
+
# Authentication information
|
12
|
+
# USERNAME = 'andrew'
|
13
|
+
# PASSWORD = 'test1234'
|
14
|
+
|
15
|
+
# Commenting out for testing purposes
|
16
|
+
# puts "Enter your domain URL without www or https://
|
17
|
+
# (for example, test.haikulearning.com)"
|
18
|
+
# input_domain = gets.chomp
|
19
|
+
|
20
|
+
# puts "What is your API key?"
|
21
|
+
# input_apikey = gets.chomp
|
22
|
+
|
23
|
+
class HaikuGrades
|
24
|
+
|
25
|
+
attr_writer :config
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
# path can be either from root or for debugging from the curent class
|
29
|
+
if File.exists?('../../config/authentication.yml')
|
30
|
+
@config = YAML.load(File.open('../../config/authentication.yml'))
|
31
|
+
elsif File.exists?('./config/authentication.yml')
|
32
|
+
@config = YAML.load(File.open('./config/authentication.yml'))
|
33
|
+
else
|
34
|
+
raise StandardError, 'Cannot find configuration file. Please make sure you have edited authentication.yml.'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
input_domain = @config['haikugrades']['domain']
|
39
|
+
input_apikey = @config['haikugrades']['api_key']
|
40
|
+
|
41
|
+
puts 'What is your Haiku Learning username?'
|
42
|
+
input_username = gets.chomp
|
43
|
+
|
44
|
+
input_password = ask('What is your Haiku Learning password? ' + "\n") { |q| q.echo = false }
|
45
|
+
|
46
|
+
begin
|
47
|
+
# Instantiate a client using the information above
|
48
|
+
client = HapiClient::Client.new(api_key: input_apikey,
|
49
|
+
base_endpoint: "https://#{input_domain}", debug: 'true')
|
50
|
+
rescue
|
51
|
+
raise 'You entered an incorrect API key or domain name - please try again!'
|
52
|
+
end
|
53
|
+
|
54
|
+
begin
|
55
|
+
# Login as a single user
|
56
|
+
session = client.login_as(username: input_username,
|
57
|
+
password: input_password)
|
58
|
+
rescue
|
59
|
+
raise 'You entered an incorrect username or password - please try again!' if session.nil?
|
60
|
+
end
|
61
|
+
|
62
|
+
puts 'Would you like a list of your classes exported to csv? (y/n)'
|
63
|
+
export = gets.chomp
|
64
|
+
if export == 'y'
|
65
|
+
ClassExport.class_list(client)
|
66
|
+
else
|
67
|
+
puts ''
|
68
|
+
end
|
69
|
+
|
70
|
+
# Ask user which class they want grades for
|
71
|
+
puts "Your classes are: " + "\n"
|
72
|
+
client.user.eclasses_teaching['items'].each do |eclass|
|
73
|
+
puts "#{eclass['name']}" + " : #{eclass['id']} (id)"
|
74
|
+
end
|
75
|
+
|
76
|
+
puts ""
|
77
|
+
puts "Please enter the id of the class whose grade entries you'd like exported to CSV. If you'd like all classes, simply type 'all', without the single quotation marks."
|
78
|
+
class_selection = gets.chomp
|
79
|
+
|
80
|
+
if class_selection == 'all'
|
81
|
+
FullGrade.full_list(client)
|
82
|
+
else
|
83
|
+
PartialGrade.partial_list(class_selection, client)
|
84
|
+
end
|
85
|
+
|
86
|
+
puts 'Ran successfully.'
|
87
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class PartialGrade
|
2
|
+
|
3
|
+
def self.partial_list(class_selection, client)
|
4
|
+
entries_columns = ''
|
5
|
+
gradebook_entries = ''
|
6
|
+
# class_selection = ''
|
7
|
+
# partial_list - eventually will just be a method
|
8
|
+
# client.user.eclasses_teaching["items"].each do |eclass|
|
9
|
+
# Starts a loop to go through each element of the "items"
|
10
|
+
# hash within the client.user.eclasses_teaching method in the API
|
11
|
+
# client.user.eclasses_teaching["items"].each do |eclass|
|
12
|
+
# Sets variable gradebooks equal to all gradebooks, accepts argument
|
13
|
+
# that says the eclass_id is equal to an "id" within "items" - in other words, it loops through and grabs gradebooks from each class belonging to the user
|
14
|
+
gradebooks = client.gradebooks.all(eclass_id: class_selection)
|
15
|
+
gradebooks['items'].to_a.each do |gradebook|
|
16
|
+
# And, for each one, define entries within
|
17
|
+
gradebook_entries = client.gradebooks.entries(eclass_id: class_selection, gradebook_id: gradebook['id'], include_scores: true)
|
18
|
+
# Still 4 entries at this point
|
19
|
+
# Now we want to go through each entry and look int he items hash
|
20
|
+
gradebook_entries['items'].each do |entry|
|
21
|
+
# And we want to define columns (for use in a csv) as the keys for gradebook_entries - items, in the first array, then in the gradebook_entry_scores hash, then in the first array within that hash (since we just need column names)
|
22
|
+
entries_columns = gradebook_entries['items'][0]['gradebook_entry_scores'][0].keys
|
23
|
+
end
|
24
|
+
end
|
25
|
+
# Now, we need to make a csv for entries - we are using the shortname of the class to name the file so the same file is not overwritten each time,
|
26
|
+
# instead, a new file is created for each class
|
27
|
+
CSV.open("entries_#{class_selection}.csv", 'wb') do |csv|
|
28
|
+
# Add a row for the column names defined above
|
29
|
+
csv << entries_columns
|
30
|
+
gradebook_entries['items'].each do |y|
|
31
|
+
y['gradebook_entry_scores'].each do |y|
|
32
|
+
csv << y.values
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: haiku_grades
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sam
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hapi-client
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: highline
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Pulls grades and exports them from a teacher within a Haiku Learning
|
70
|
+
domain.
|
71
|
+
email:
|
72
|
+
- samf@haikulearning.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- Gemfile
|
79
|
+
- README.md
|
80
|
+
- class_list.csv
|
81
|
+
- config/authentication.yml.sample
|
82
|
+
- entries_.csv
|
83
|
+
- haiku_grades.gemspec
|
84
|
+
- lib/class_export.rb
|
85
|
+
- lib/full_grade.rb
|
86
|
+
- lib/haiku_grades.rb
|
87
|
+
- lib/haiku_grades/version.rb
|
88
|
+
- lib/partial_grade.rb
|
89
|
+
homepage: http://rubygems.org/gems/haiku_grades
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 2.4.6
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Pulls grades and exports them from a teacher within a Haiku Learning domain.
|
113
|
+
test_files: []
|