teachers_pet 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 34f31b6d378cbb283cead5e47e9a115b04fc48dd
4
- data.tar.gz: c67ba2a5cb528af7e6a956b00162bbfe4b6d789b
3
+ metadata.gz: 910209118ec442713281982a1e518e1444cc59a9
4
+ data.tar.gz: 5db06d1c2a2df29f5fa6f9ceeec71d37c7b5c5a0
5
5
  SHA512:
6
- metadata.gz: 8abd43bf0409d38576a414321598658e8cc04edf95b3e1e3b287887b437e6e5da38ab548c52e544e89e78eb0e63cd3b531bd2f1534495f30777a4b2dead499d4
7
- data.tar.gz: 3e3137a1d275ea9381356aaa39bf3e784ecbdb11c88ecb213e96e2f2681350d46cc8240f21752ca2d2730831b4355d0058150a5a3a6488c6644d11c1a02fe649
6
+ metadata.gz: 7f158b180312b392af4c134264be6b7f250f950ac89012f067bf5605604eaf056702bf4d8474fe8f40efff5f1428b3937f74b947e8300af42b2e6abe71dcc8c7
7
+ data.tar.gz: 27c399025cd1d07af44e005fb35117b632a92a04d17428fe5c9dbbf996ed8a05b53bb7976b4ea57ec95c5c5ea1aa50ae676d5562d7ad06405307ed6f1941e5d3
data/README.md CHANGED
@@ -19,6 +19,12 @@ Each student is given a team in the organization. The team name is the same as t
19
19
  gem install teachers_pet
20
20
  ```
21
21
 
22
+ If you've used this tool before, get the newest version using
23
+
24
+ ```ruby
25
+ gem update teachers_pet
26
+ ```
27
+
22
28
  To use the latest-and-greatest code from this repository, see the instructions in [CONTRIBUTING.md](CONTRIBUTING.md).
23
29
 
24
30
  ## Basic Setup
@@ -64,6 +70,14 @@ While in the directory for the starter file repository, run the `push_repos` scr
64
70
 
65
71
  This works by creating a git remote for each repository and thing doing a push to that repository.
66
72
 
73
+ ### Opening issues
74
+
75
+ After running `create_repos`, instructors can open issues in repos with `open_issue`. This action requires an `issue.md` file containing the body of the issue. The issue title and optional tags are added at runtime.
76
+
77
+ One issue will be opened in every repo defined by the `students` file and repository name given by the user.
78
+
79
+ Open issues in student repos as a way to list requirements of the assignment, goals, or instructions for patching.
80
+
67
81
  ### Pulling repositories for grading
68
82
 
69
83
  When grading, use the `clone_repos` script to clone all the repositories in the organization that match the username-repository naming scheme that is generated when `create_repos` is run.
data/bin/open_issue ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
4
+ require 'teachers_pet/actions/open_issue'
5
+
6
+ TeachersPet::Actions::OpenIssue.new.run
@@ -1,6 +1,7 @@
1
1
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..')
2
2
 
3
3
  require 'configuration'
4
+ require 'octokit'
4
5
 
5
6
  ## Common code for the edugit scripts.
6
7
  module TeachersPet
@@ -9,7 +9,6 @@ require 'rubygems'
9
9
  require 'highline/question'
10
10
  require 'highline/import'
11
11
  require 'highline/compatibility'
12
- require 'octokit'
13
12
  require 'teachers_pet/actions/base'
14
13
 
15
14
  module TeachersPet
@@ -7,7 +7,6 @@ require 'rubygems'
7
7
  require 'highline/question'
8
8
  require 'highline/import'
9
9
  require 'highline/compatibility'
10
- require 'octokit'
11
10
  require 'teachers_pet/actions/base'
12
11
 
13
12
  module TeachersPet
@@ -18,7 +17,8 @@ module TeachersPet
18
17
  @organization = ask("What is the organization name?") { |q| q.default = TeachersPet::Configuration.organization }
19
18
  @student_file = self.get_students_file_path
20
19
  @instructor_file = self.get_instructors_file_path
21
- @add_init_files = confirm('Add .gitignore and README.md files? (skip this if you are pushing starter files.)', false)
20
+ @public_repos = confirm('Create repositories as public?', false)
21
+ @add_init_files = confirm('Add .gitignore and README.md files? (skip this if you are pushing starter files.)', false)
22
22
  end
23
23
 
24
24
  def load_files
@@ -27,7 +27,8 @@ module TeachersPet
27
27
  end
28
28
 
29
29
  def create
30
- confirm("Create #{@students.keys.size} repositories for students and give access to instructors?")
30
+ pub_private_text = @public_repos ? 'public' : 'private'
31
+ confirm("Create #{@students.keys.size} #{pub_private_text} repositories for students and give access to instructors?")
31
32
 
32
33
  # create a repo for each student
33
34
  self.init_client
@@ -56,11 +57,11 @@ module TeachersPet
56
57
 
57
58
  git_ignore_template = "C++" ## This is specific to my current class, you'll want to change
58
59
  git_ignore_template = '' unless @add_init_files
59
- puts " --> Creating '#{repo_name}'"
60
+ puts " --> Creating '#{repo_name}' public? #{@public_repos}"
60
61
  @client.create_repository(repo_name,
61
62
  {
62
63
  :description => "#{@repository} created for #{student}",
63
- :private => !TeachersPet::Configuration.reposPublic, ## Current default, repositories are private to the student & instructors
64
+ :private => !@public_repos,
64
65
  :has_issues => true, # seems like a resonable default
65
66
  :has_wiki => false,
66
67
  :has_downloads => false,
@@ -12,7 +12,6 @@ require 'rubygems'
12
12
  require 'highline/question'
13
13
  require 'highline/import'
14
14
  require 'highline/compatibility'
15
- require 'octokit'
16
15
 
17
16
  require 'teachers_pet/actions/base'
18
17
 
@@ -4,14 +4,13 @@ require 'rubygems'
4
4
  require 'highline/question'
5
5
  require 'highline/import'
6
6
  require 'highline/compatibility'
7
- require 'octokit'
8
7
  require 'teachers_pet/actions/base'
9
8
 
10
9
  module TeachersPet
11
10
  module Actions
12
11
  class ForkCollab < Base
13
12
  def read_info
14
- @repository = ask("Which repository? (name/owner)")
13
+ @repository = ask("Which repository? (owner/repo)")
15
14
  end
16
15
 
17
16
  def get_forks
@@ -0,0 +1,72 @@
1
+ # Opens a single issue in each repository. The body of the issue is loaded
2
+ # from a file and the user is prompted for the title.
3
+
4
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', '..')
5
+
6
+ require 'rubygems'
7
+ require 'highline/question'
8
+ require 'highline/import'
9
+ require 'teachers_pet/actions/base'
10
+
11
+ module TeachersPet
12
+ module Actions
13
+ class OpenIssue < Base
14
+ def read_info
15
+ @repository = ask("What repository will the issue be raised in?") { |q| q.validate = /\w+/ }
16
+ @organization = ask("What is the organization name?") { |q| q.default = TeachersPet::Configuration.organization }
17
+
18
+ @issue = {}
19
+ @issue[:title] = ask("What is the title of the issue?")
20
+ @issue_file = ask("What is the path to the file containing the issue body?")
21
+
22
+ # Add labels to issue
23
+ options = {}
24
+ options[:labels] = ask("Optionally add any labels, seperated by commas:")
25
+ @issue[:options] = options
26
+
27
+ @student_file = self.get_students_file_path
28
+ @instructor_file = self.get_instructors_file_path
29
+ end
30
+
31
+ def load_files
32
+ @students = read_file(@student_file, 'Students')
33
+ @instructors = read_file(@instructor_file, 'Instructors')
34
+ @issue[:body] = File.open(@issue_file).read
35
+ end
36
+
37
+ def create
38
+ confirm("Create issue '#{@issue[:title]}' in #{@students.keys.size} student repositories - '#{@repository}'?")
39
+ self.init_client
40
+
41
+ org_hash = read_organization(@organization)
42
+ abort('Organization could not be found') if org_hash.nil?
43
+ puts "Found organization at: #{org_hash[:login]}"
44
+
45
+ org_teams = get_teams_by_name(@organization)
46
+
47
+ puts "\nCreating issue in repositories..."
48
+ @students.keys.sort.each do |student|
49
+ unless org_teams.key?(student)
50
+ puts(" ** ERROR ** - no team for #{student}")
51
+ next
52
+ end
53
+ repo_name = "#{student}-#{@repository}"
54
+
55
+ unless repository?(@organization, repo_name)
56
+ puts " --> Repository not found, skipping '#{repo_name}'"
57
+ next
58
+ end
59
+
60
+ # Create the issue with octokit
61
+ @client.create_issue("#{@organization}/#{repo_name}", @issue[:title], @issue[:body], @issue[:options])
62
+ end
63
+ end
64
+
65
+ def run
66
+ self.read_info
67
+ self.load_files
68
+ self.create
69
+ end
70
+ end
71
+ end
72
+ end
@@ -4,7 +4,6 @@ require 'rubygems'
4
4
  require 'highline/question'
5
5
  require 'highline/import'
6
6
  require 'highline/compatibility'
7
- require 'octokit'
8
7
  require 'teachers_pet/actions/base'
9
8
 
10
9
  # This script should be run within a working directory that is a git repository.
@@ -40,14 +40,6 @@ module TeachersPet
40
40
  @@INSTRUCTORS_FILE
41
41
  end
42
42
 
43
- # The default is to create the repositories as public.
44
- # If you are using GitHub enterprise or a paid account, it make sense to make this private
45
- @@REPOS_PUBLIC = true
46
-
47
- def self.reposPublic
48
- @@REPOS_PUBLIC
49
- end
50
-
51
43
  # github.com - set to 'github.com'
52
44
  # GitHub Enterprise - 'yourserver.com'
53
45
  @@SSH_ENDPOINT = 'github.com'
@@ -1,3 +1,3 @@
1
1
  module TeachersPet
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe TeachersPet::Actions::CreateRepos do
4
+ let(:action) { TeachersPet::Actions::CreateRepos.new }
5
+
6
+ before do
7
+ # fallback
8
+ action.stub(:ask){|question| raise("can't ask \"#{question}\"") }
9
+ action.stub(:choose){ raise("can't choose()") }
10
+
11
+ action.stub(:confirm)
12
+ end
13
+
14
+ def common_test(create_as_public)
15
+ respond("What repository name should be created for each student?", 'testrepo')
16
+ respond("What is the organization name?", 'testorg')
17
+ respond("What is the filename of the list of students?", students_list_fixture_path)
18
+ respond("What is the filename of the list of instructors?", instructors_list_fixture_path)
19
+ confirm("Create repositories as public?", create_as_public)
20
+ confirm("Add .gitignore and README.md files? (skip this if you are pushing starter files.)", false)
21
+ mode = create_as_public ? 'public' : 'private'
22
+ respond("Create 3 #{mode} repositories for students and give access to instructors?", "1")
23
+ stub_github_config
24
+
25
+ request_stubs = []
26
+
27
+ request_stubs << stub_get_json('https://testteacher:abc123@api.github.com/orgs/testorg',
28
+ login: 'testorg',
29
+ url: 'https://api.github.com/orgs/testorg'
30
+ )
31
+ request_stubs << stub_get_json('https://testteacher:abc123@api.github.com/orgs/testorg/teams?per_page=100', student_teams)
32
+ student_usernames.each do |username|
33
+ # Check for the repos existing already
34
+ stub_request(:get, "https://testteacher:abc123@api.github.com/repos/testorg/#{username}-testrepo").
35
+ to_return(:status => 404, :body => "", :headers => {})
36
+ end
37
+
38
+ student_usernames.each do |username|
39
+ # actually create the repo
40
+ team_id = 0
41
+ student_teams.each do |st|
42
+ if st[:name].eql?(username)
43
+ team_id = st[:id]
44
+ end
45
+ end
46
+ stub_request(:post, "https://testteacher:abc123@api.github.com/orgs/testorg/repos").
47
+ with(:body => "{\"description\":\"testrepo created for #{username}\",\"private\":#{!create_as_public},\"has_issues\":true,\"has_wiki\":false,\"has_downloads\":false,\"team_id\":#{team_id},\"auto_init\":false,\"gitignore_template\":\"\",\"name\":\"#{username}-testrepo\"}").
48
+ to_return(:status => 200)
49
+ end
50
+
51
+ action.run
52
+
53
+ request_stubs.each do |request_stub|
54
+ expect(request_stub).to have_been_requested.once
55
+ end
56
+ end
57
+
58
+ it "create repos public" do
59
+ common_test(true)
60
+ end
61
+
62
+ it "create repos private" do
63
+ common_test(false)
64
+ end
65
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe TeachersPet::Actions::OpenIssue do
4
+ let(:action) { TeachersPet::Actions::OpenIssue.new }
5
+
6
+ before do
7
+ # fallback
8
+ action.stub(:ask){|question| raise("can't ask \"#{question}\"") }
9
+ action.stub(:choose){ raise("can't choose()") }
10
+
11
+ action.stub(:confirm)
12
+ end
13
+
14
+ def common_test(labels)
15
+
16
+ issue_title = "Issue Test"
17
+
18
+ # Respond to action prompts
19
+ respond("What repository will the issue be raised in?", 'testrepo')
20
+ respond("What is the organization name?", 'testorg')
21
+ respond("What is the title of the issue?", 'Issue Test')
22
+ respond("What is the path to the file containing the issue body?", issue_fixture_path)
23
+ respond("Optionally add any labels, seperated by commas:", labels)
24
+ respond("What is the filename of the list of students?", students_list_fixture_path)
25
+ respond("What is the filename of the list of instructors?", instructors_list_fixture_path)
26
+ respond("Create issue '#{issue_title}' in #{File.open(students_list_fixture_path).readlines.size} student repositories - 'testrepo'?", "1")
27
+ stub_github_config
28
+
29
+ request_stubs = []
30
+
31
+ request_stubs << stub_get_json('https://testteacher:abc123@api.github.com/orgs/testorg',
32
+ login: 'testorg',
33
+ url: 'https://api.github.com/orgs/testorg'
34
+ )
35
+ request_stubs << stub_get_json('https://testteacher:abc123@api.github.com/orgs/testorg/teams?per_page=100', student_teams)
36
+ student_usernames.each do |username|
37
+ # Action checks that repos exist already
38
+ stub_request(:get, "https://testteacher:abc123@api.github.com/repos/testorg/#{username}-testrepo").
39
+ to_return(:status => 200, :body => "", :headers => {})
40
+ end
41
+
42
+ # create the issue in each repo
43
+ student_usernames.each do |username|
44
+ team_id = 0
45
+ student_teams.each do |st|
46
+ if st[:name].eql?(username)
47
+ team_id = st[:id]
48
+ end
49
+ end
50
+ issue_body = File.read(issue_fixture_path).gsub("\n", "\\n")
51
+ labels_list = labels.split(",").map(&:strip).to_s.delete(' ')
52
+ stub_request(:post, "https://testteacher:abc123@api.github.com/repos/testorg/#{username}-testrepo/issues").
53
+ with(:body => "{\"labels\":#{labels_list},\"title\":\"Issue Test\",\"body\":\"#{issue_body}\"}").
54
+ to_return(:status => 201)
55
+ end
56
+
57
+ action.run
58
+
59
+ request_stubs.each do |request_stub|
60
+ expect(request_stub).to have_been_requested.once
61
+ end
62
+ end
63
+
64
+ it "open issue no labels" do
65
+ common_test("")
66
+ end
67
+
68
+ it "open issue with labels" do
69
+ common_test("bug, feature")
70
+ end
71
+ end
@@ -0,0 +1,4 @@
1
+ # This is a test
2
+ * Testing
3
+ * An
4
+ * Issue
data/spec/spec_helper.rb CHANGED
@@ -29,6 +29,10 @@ def instructors_list_fixture_path
29
29
  File.join(File.dirname(__FILE__), 'fixtures', 'instructors')
30
30
  end
31
31
 
32
+ def issue_fixture_path
33
+ File.join(File.dirname(__FILE__), 'fixtures', 'issue.md')
34
+ end
35
+
32
36
  def student_usernames
33
37
  CSV.read(students_list_fixture_path).flatten
34
38
  end
@@ -47,6 +51,10 @@ def respond(question, response)
47
51
  action.stub(:ask).with(question).and_return(response)
48
52
  end
49
53
 
54
+ def confirm(question, response)
55
+ action.stub(:confirm).with(question, false).and_return(response)
56
+ end
57
+
50
58
  def stub_github_config
51
59
  respond("What is the API endpoint?", TeachersPet::Configuration.apiEndpoint)
52
60
  respond("What is the Web endpoint?", TeachersPet::Configuration.webEndpoint)
data/teachers_pet.gemspec CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
19
  s.require_paths = ['lib']
20
20
 
21
+ s.required_ruby_version = '>= 1.9.3'
22
+
21
23
  s.add_dependency 'highline', '~> 1.6.21'
22
24
  s.add_dependency 'octokit', '~> 3.1.0'
23
25
 
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teachers_pet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Britton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-22 00:00:00.000000000 Z
11
+ date: 2014-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.6.21
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.6.21
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: octokit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 3.1.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.1.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: guard-rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '4.2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '4.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
89
  version: '2.14'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.14'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.17'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ~>
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.17'
111
111
  description:
@@ -115,13 +115,14 @@ executables:
115
115
  - create_repos
116
116
  - create_teams
117
117
  - fork_collab
118
+ - open_issue
118
119
  - push_files
119
120
  extensions: []
120
121
  extra_rdoc_files: []
121
122
  files:
122
- - ".gitignore"
123
- - ".rspec"
124
- - ".travis.yml"
123
+ - .gitignore
124
+ - .rspec
125
+ - .travis.yml
125
126
  - CONTRIBUTING.md
126
127
  - Gemfile
127
128
  - Guardfile
@@ -132,6 +133,7 @@ files:
132
133
  - bin/create_repos
133
134
  - bin/create_teams
134
135
  - bin/fork_collab
136
+ - bin/open_issue
135
137
  - bin/push_files
136
138
  - lib/teachers_pet.rb
137
139
  - lib/teachers_pet/actions/base.rb
@@ -139,12 +141,16 @@ files:
139
141
  - lib/teachers_pet/actions/create_repos.rb
140
142
  - lib/teachers_pet/actions/create_teams.rb
141
143
  - lib/teachers_pet/actions/fork_collab.rb
144
+ - lib/teachers_pet/actions/open_issue.rb
142
145
  - lib/teachers_pet/actions/push_files.rb
143
146
  - lib/teachers_pet/configuration.rb
144
147
  - lib/teachers_pet/version.rb
145
148
  - spec/actions/clone_repos_spec.rb
149
+ - spec/actions/create_repos_spec.rb
146
150
  - spec/actions/create_teams_spec.rb
151
+ - spec/actions/open_issue_spec.rb
147
152
  - spec/fixtures/instructors
153
+ - spec/fixtures/issue.md
148
154
  - spec/fixtures/students
149
155
  - spec/spec_helper.rb
150
156
  - teachers_pet.gemspec
@@ -158,24 +164,26 @@ require_paths:
158
164
  - lib
159
165
  required_ruby_version: !ruby/object:Gem::Requirement
160
166
  requirements:
161
- - - ">="
167
+ - - '>='
162
168
  - !ruby/object:Gem::Version
163
- version: '0'
169
+ version: 1.9.3
164
170
  required_rubygems_version: !ruby/object:Gem::Requirement
165
171
  requirements:
166
- - - ">="
172
+ - - '>='
167
173
  - !ruby/object:Gem::Version
168
174
  version: '0'
169
175
  requirements: []
170
176
  rubyforge_project:
171
- rubygems_version: 2.2.2
177
+ rubygems_version: 2.0.3
172
178
  signing_key:
173
179
  specification_version: 4
174
180
  summary: Command line tools to help teachers use GitHub in their classrooms
175
181
  test_files:
176
182
  - spec/actions/clone_repos_spec.rb
183
+ - spec/actions/create_repos_spec.rb
177
184
  - spec/actions/create_teams_spec.rb
185
+ - spec/actions/open_issue_spec.rb
178
186
  - spec/fixtures/instructors
187
+ - spec/fixtures/issue.md
179
188
  - spec/fixtures/students
180
189
  - spec/spec_helper.rb
181
- has_rdoc: