teachers_pet 0.1.0 → 0.2.0

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