problem_child 2.1.1 → 3.0.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 +4 -4
- data/.rubocop.yml +11 -0
- data/README.md +0 -8
- data/Rakefile +3 -3
- data/config.ru +1 -1
- data/lib/problem_child/helpers.rb +25 -34
- data/lib/problem_child/version.rb +1 -1
- data/lib/problem_child.rb +25 -36
- data/problem_child.gemspec +22 -23
- data/script/cibuild +1 -0
- data/spec/problem_child_helpers_spec.rb +140 -147
- data/spec/problem_child_spec.rb +71 -77
- data/spec/spec_helper.rb +5 -5
- metadata +18 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ced371fbdeea3928bd926e3f1af3e9f472b18c5
|
4
|
+
data.tar.gz: 9b4d65b7429a1bbce244ba69b93ec9533e0bf761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66c12bc11831546f120a1d7a4c315c4fdfddcc78d9e8cad3cfccf5b7e3e49a4b36663b59078037f385801c2eb1a21411b9355c0b2b47ae98eae9863ab3bc4545
|
7
|
+
data.tar.gz: eaad18bf0333c3e90c11b89576417b1851f3fe90f4f4d1b2cf0455e0ddeb5162ed4f66c4d55d8e9862bb58063e2c6f5785582900b6af94c4f2374197b51d7150
|
data/.rubocop.yml
ADDED
data/README.md
CHANGED
@@ -22,14 +22,6 @@ run ProblemChild::App
|
|
22
22
|
|
23
23
|
Then, follow the configuration options below.
|
24
24
|
|
25
|
-
## Requirements
|
26
|
-
|
27
|
-
If you have OAuth (e.g., non-anonymous submission), you'll need to have [Redis](http://redis.io/) running to properly maintain sessions and support submissions larger than 4k:
|
28
|
-
|
29
|
-
On OS X, run `brew install redis` to install, followed by `redis-server` to run the redis server. The site should work fine, but for tests to pass, you'll want to add `REDIS_URL=redis://localhost:6379` to your `.env` file.
|
30
|
-
|
31
|
-
On Heroku you'll want to run `heroku addons:create heroku-redis:hobby-dev` to add a free Redis instance to your app (Heroku will set `REDIS_URL` for you).
|
32
|
-
|
33
25
|
## Configuring
|
34
26
|
|
35
27
|
First, you must set the following environmental variable:
|
data/Rakefile
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
2
|
require 'rspec/core/rake_task'
|
3
3
|
|
4
|
-
desc
|
4
|
+
desc 'Run specs'
|
5
5
|
RSpec::Core::RakeTask.new do |t|
|
6
6
|
t.pattern = 'spec/**/*_spec.rb'
|
7
|
-
t.rspec_opts = [
|
7
|
+
t.rspec_opts = ['--order', 'rand', '--color']
|
8
8
|
end
|
data/config.ru
CHANGED
@@ -1,56 +1,55 @@
|
|
1
1
|
module ProblemChild
|
2
2
|
module Helpers
|
3
|
-
|
4
3
|
def repo
|
5
|
-
ENV[
|
4
|
+
ENV['GITHUB_REPO']
|
6
5
|
end
|
7
6
|
|
8
7
|
def anonymous_submissions?
|
9
|
-
|
8
|
+
!ENV['GITHUB_TOKEN'].to_s.empty?
|
10
9
|
end
|
11
10
|
|
12
11
|
def token
|
13
12
|
if anonymous_submissions?
|
14
|
-
ENV[
|
13
|
+
ENV['GITHUB_TOKEN']
|
15
14
|
elsif !github_user.nil?
|
16
15
|
github_user.token
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def client
|
21
|
-
@client ||= Octokit::Client.new :
|
20
|
+
@client ||= Octokit::Client.new access_token: token
|
22
21
|
end
|
23
22
|
|
24
|
-
def render_template(template, locals={})
|
25
|
-
halt erb template, :
|
23
|
+
def render_template(template, locals = {})
|
24
|
+
halt erb template, layout: :layout, locals: locals.merge(template: template)
|
26
25
|
end
|
27
26
|
|
28
27
|
def issue_title
|
29
|
-
form_data[
|
28
|
+
form_data['title']
|
30
29
|
end
|
31
30
|
|
32
31
|
def issue_body
|
33
|
-
form_data.reject { |key, value| key ==
|
32
|
+
form_data.reject { |key, value| key == 'title' || value.empty? || key == 'labels' || value.is_a?(Hash) }.map { |key, value| "* **#{key.humanize}**: #{value}" }.join("\n")
|
34
33
|
end
|
35
34
|
|
36
35
|
# abstraction to allow cached form data to be used in place of default params
|
37
36
|
def form_data
|
38
|
-
session[
|
37
|
+
session['form_data'].nil? ? params : JSON.parse(session['form_data'])
|
39
38
|
end
|
40
39
|
|
41
40
|
def labels
|
42
|
-
form_data[
|
41
|
+
form_data['labels'].join(',') if form_data['labels']
|
43
42
|
end
|
44
43
|
|
45
44
|
def uploads
|
46
|
-
form_data.select do |
|
47
|
-
value.is_a?(Hash) &&
|
45
|
+
form_data.select do |_key, value|
|
46
|
+
value.is_a?(Hash) && value.key?(:tempfile) && value[:tempfile].is_a?(Tempfile)
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
50
|
def create_issue
|
52
|
-
issue = client.create_issue(repo, form_data[
|
53
|
-
issue[
|
51
|
+
issue = client.create_issue(repo, form_data['title'], issue_body, labels: labels)
|
52
|
+
issue['number'] if issue
|
54
53
|
end
|
55
54
|
|
56
55
|
# Returns array of Octokit branch objects
|
@@ -72,11 +71,11 @@ module ProblemChild
|
|
72
71
|
# Starts with patch-1 and keeps going until it finds one not taken
|
73
72
|
def patch_branch
|
74
73
|
num = 1
|
75
|
-
branch_name = form_data[
|
74
|
+
branch_name = form_data['title'].parameterize
|
76
75
|
return branch_name unless branch_exists?(branch_name)
|
77
76
|
branch = "#{branch_name}-#{num}"
|
78
|
-
while branch_exists?(branch)
|
79
|
-
num
|
77
|
+
while branch_exists?(branch)
|
78
|
+
num += 1
|
80
79
|
branch = "#{branch_name}-#{num}"
|
81
80
|
end
|
82
81
|
branch
|
@@ -95,32 +94,25 @@ module ProblemChild
|
|
95
94
|
uploads.each do |key, upload|
|
96
95
|
client.create_contents(
|
97
96
|
repo,
|
98
|
-
upload[
|
99
|
-
"Create #{upload[
|
100
|
-
|
101
|
-
:
|
97
|
+
upload[:filename],
|
98
|
+
"Create #{upload[:filename]}",
|
99
|
+
branch: branch,
|
100
|
+
file: upload[:tempfile]
|
102
101
|
)
|
103
102
|
session["file_#{key}"] = nil
|
104
103
|
end
|
105
104
|
end
|
106
|
-
pr = client.create_pull_request(repo,
|
107
|
-
pr[
|
105
|
+
pr = client.create_pull_request(repo, 'master', branch, form_data['title'], issue_body, labels: labels)
|
106
|
+
pr['number'] if pr
|
108
107
|
end
|
109
108
|
|
110
109
|
def repo_access?
|
111
110
|
return true unless anonymous_submissions?
|
112
|
-
!client.repository(repo)[
|
111
|
+
!client.repository(repo)['private']
|
113
112
|
rescue
|
114
113
|
false
|
115
114
|
end
|
116
115
|
|
117
|
-
def cache_form_data
|
118
|
-
uploads.each do |key, upload|
|
119
|
-
session["file_#{key}"] = File.open(upload[:tempfile]).read
|
120
|
-
end
|
121
|
-
session[:form_data] = params.to_json
|
122
|
-
end
|
123
|
-
|
124
116
|
def auth!
|
125
117
|
if anonymous_submissions?
|
126
118
|
true
|
@@ -129,8 +121,7 @@ module ProblemChild
|
|
129
121
|
elsif ENV['GITHUB_ORG_ID']
|
130
122
|
github_organization_authenticate!(ENV['GITHUB_ORG_ID'])
|
131
123
|
else
|
132
|
-
raise
|
133
|
-
halt 401
|
124
|
+
raise 'Must define GITHUB_TEAM_ID, GITHUB_ORG_ID, OR GITHUB_TOKEN'
|
134
125
|
end
|
135
126
|
end
|
136
127
|
end
|
data/lib/problem_child.rb
CHANGED
@@ -3,21 +3,18 @@ require 'sinatra'
|
|
3
3
|
require 'sinatra_auth_github'
|
4
4
|
require 'dotenv'
|
5
5
|
require 'json'
|
6
|
-
require 'redis'
|
7
|
-
require 'rack/session/moneta'
|
8
6
|
require 'active_support'
|
9
7
|
require 'active_support/core_ext/string'
|
10
|
-
require
|
11
|
-
require
|
8
|
+
require 'problem_child/version'
|
9
|
+
require 'problem_child/helpers'
|
12
10
|
|
13
11
|
module ProblemChild
|
14
|
-
|
15
12
|
def self.root
|
16
|
-
File.expand_path
|
13
|
+
File.expand_path './problem_child', File.dirname(__FILE__)
|
17
14
|
end
|
18
15
|
|
19
16
|
def self.views_dir
|
20
|
-
@views_dir ||= File.expand_path
|
17
|
+
@views_dir ||= File.expand_path 'views', ProblemChild.root
|
21
18
|
end
|
22
19
|
|
23
20
|
def self.views_dir=(dir)
|
@@ -25,7 +22,7 @@ module ProblemChild
|
|
25
22
|
end
|
26
23
|
|
27
24
|
def self.public_dir
|
28
|
-
@public_dir ||= File.expand_path
|
25
|
+
@public_dir ||= File.expand_path 'public', ProblemChild.root
|
29
26
|
end
|
30
27
|
|
31
28
|
def self.public_dir=(dir)
|
@@ -33,18 +30,12 @@ module ProblemChild
|
|
33
30
|
end
|
34
31
|
|
35
32
|
class App < Sinatra::Base
|
36
|
-
|
37
33
|
include ProblemChild::Helpers
|
38
34
|
|
39
|
-
set :github_options,
|
40
|
-
:scopes => "repo,read:org"
|
41
|
-
}
|
35
|
+
set :github_options, scopes: 'repo,read:org'
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
else
|
46
|
-
use Rack::Session::Cookie
|
47
|
-
end
|
37
|
+
use Rack::Session::Cookie, http_only: true,
|
38
|
+
secret: ENV['SESSION_SECRET'] || SecureRandom.hex
|
48
39
|
|
49
40
|
configure :production do
|
50
41
|
require 'rack-ssl-enforcer'
|
@@ -54,34 +45,32 @@ module ProblemChild
|
|
54
45
|
ENV['WARDEN_GITHUB_VERIFIER_SECRET'] ||= SecureRandom.hex
|
55
46
|
register Sinatra::Auth::Github
|
56
47
|
|
57
|
-
set :views,
|
58
|
-
set :root,
|
59
|
-
set :public_folder,
|
48
|
+
set :views, proc { ProblemChild.views_dir }
|
49
|
+
set :root, proc { ProblemChild.root }
|
50
|
+
set :public_folder, proc { ProblemChild.public_dir }
|
60
51
|
|
61
|
-
get
|
52
|
+
get '/' do
|
62
53
|
flash = nil
|
63
54
|
issue = nil
|
64
55
|
access = false
|
65
56
|
|
66
|
-
|
67
|
-
if issue_title.empty?
|
68
|
-
flash = 'Please enter a title.'
|
69
|
-
else
|
70
|
-
issue = uploads.empty? ? create_issue : create_pull_request
|
71
|
-
session[:form_data] = nil
|
72
|
-
access = repo_access?
|
73
|
-
end
|
74
|
-
else
|
75
|
-
auth!
|
76
|
-
end
|
57
|
+
auth!
|
77
58
|
|
78
|
-
halt erb :form, :
|
59
|
+
halt erb :form, layout: :layout, locals: { repo: repo, anonymous: anonymous_submissions?, flash: flash, issue: issue, access: access }
|
79
60
|
end
|
80
61
|
|
81
|
-
post
|
82
|
-
cache_form_data
|
62
|
+
post '/' do
|
83
63
|
auth! unless anonymous_submissions?
|
84
|
-
|
64
|
+
|
65
|
+
if issue_title.empty?
|
66
|
+
flash = 'Please enter a title.'
|
67
|
+
else
|
68
|
+
issue = uploads.empty? ? create_issue : create_pull_request
|
69
|
+
session[:form_data] = nil
|
70
|
+
access = repo_access?
|
71
|
+
end
|
72
|
+
|
73
|
+
halt erb :form, layout: :layout, locals: { repo: repo, anonymous: anonymous_submissions?, flash: flash, issue: issue, access: access }
|
85
74
|
end
|
86
75
|
end
|
87
76
|
end
|
data/problem_child.gemspec
CHANGED
@@ -4,34 +4,33 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'problem_child/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'problem_child'
|
8
8
|
spec.version = ProblemChild::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.homepage =
|
13
|
-
spec.license =
|
9
|
+
spec.authors = ['Ben Balter']
|
10
|
+
spec.email = ['ben.balter@github.com']
|
11
|
+
spec.summary = 'Allows authenticated or anonymous users to fill out a standard web form to creat GitHub issues.'
|
12
|
+
spec.homepage = 'https://github.com/benbalter/problem_child'
|
13
|
+
spec.license = 'MIT'
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = [
|
18
|
+
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_dependency
|
21
|
-
spec.add_dependency
|
22
|
-
spec.add_dependency
|
23
|
-
spec.add_dependency
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency "redis", "~> 3.2"
|
28
|
-
spec.add_dependency "moneta", "~> 0.8"
|
20
|
+
spec.add_dependency 'sinatra', '~> 1.4'
|
21
|
+
spec.add_dependency 'octokit', '~> 3.7'
|
22
|
+
spec.add_dependency 'dotenv', '~> 1.0'
|
23
|
+
spec.add_dependency 'rack-ssl-enforcer', '~> 0.2'
|
24
|
+
spec.add_dependency 'sinatra_auth_github', '~> 1.0'
|
25
|
+
spec.add_dependency 'activesupport', '~> 4.2'
|
26
|
+
spec.add_dependency 'rack', '1.6'
|
29
27
|
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
29
|
+
spec.add_development_dependency 'rack-test', '~> 0.6'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 1.2 '
|
31
|
+
spec.add_development_dependency 'foreman', '~> 0.77'
|
32
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
33
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
34
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 0.41'
|
37
36
|
end
|
data/script/cibuild
CHANGED
@@ -1,98 +1,84 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
describe "ProblemChild::Helpers" do
|
1
|
+
require 'spec_helper'
|
4
2
|
|
3
|
+
describe 'ProblemChild::Helpers' do
|
5
4
|
class TestHelper
|
6
5
|
include ProblemChild::Helpers
|
7
6
|
|
8
7
|
attr_accessor :session, :params
|
9
8
|
|
10
|
-
def initialize(path=nil)
|
9
|
+
def initialize(path = nil)
|
11
10
|
@path = path
|
12
11
|
end
|
13
12
|
|
14
13
|
def request
|
15
|
-
Rack::Request.new(
|
14
|
+
Rack::Request.new('PATH_INFO' => @path)
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
18
|
before(:each) do
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
@helper = TestHelper.new
|
20
|
+
@helper.session = {}
|
21
|
+
@helper.params = {}
|
23
22
|
end
|
24
23
|
|
25
|
-
it
|
26
|
-
with_env
|
27
|
-
expect(@helper.repo).to eql(
|
24
|
+
it 'knows the github repo' do
|
25
|
+
with_env 'GITHUB_REPO', 'foo/bar' do
|
26
|
+
expect(@helper.repo).to eql('foo/bar')
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
|
-
it
|
32
|
-
with_env
|
30
|
+
it 'knows to allow anonymous submisssions when a token is passed' do
|
31
|
+
with_env 'GITHUB_TOKEN', 'asdf' do
|
33
32
|
expect(@helper.anonymous_submissions?).to be(true)
|
34
33
|
end
|
35
34
|
|
36
|
-
with_env
|
35
|
+
with_env 'GITHUB_TOKEN', '' do
|
37
36
|
expect(@helper.anonymous_submissions?).to be(false)
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
it
|
42
|
-
with_env
|
40
|
+
it 'knows not to allow anonymous submisssions when no token is passed' do
|
41
|
+
with_env 'GITHUB_TOKEN', '' do
|
43
42
|
expect(@helper.anonymous_submissions?).to be(false)
|
44
43
|
end
|
45
44
|
|
46
|
-
with_env
|
45
|
+
with_env 'GITHUB_TOKEN', nil do
|
47
46
|
expect(@helper.anonymous_submissions?).to be(false)
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
it
|
52
|
-
with_env
|
53
|
-
expect(@helper.token).to eql(
|
50
|
+
it 'uses a token if passed' do
|
51
|
+
with_env 'GITHUB_TOKEN', 'asdf' do
|
52
|
+
expect(@helper.token).to eql('asdf')
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
|
-
it
|
58
|
-
with_env
|
56
|
+
it 'inits the octokit client' do
|
57
|
+
with_env 'GITHUB_TOKEN', 'asdf' do
|
59
58
|
expect(@helper.client.class).to eql(Octokit::Client)
|
60
|
-
expect(@helper.client.access_token).to eql(
|
59
|
+
expect(@helper.client.access_token).to eql('asdf')
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
64
|
-
it
|
65
|
-
|
66
|
-
@helper.cache_form_data
|
67
|
-
expect(@helper.form_data["foo"]).to eql("bar")
|
68
|
-
end
|
69
|
-
|
70
|
-
it "grabs the form data from the session" do
|
71
|
-
expected = {"title" => "title", "foo" => "bar"}
|
72
|
-
@helper.session["form_data"] = expected.to_json
|
73
|
-
expect(@helper.form_data).to eql(expected)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "grabs the form data when posted" do
|
77
|
-
expected = {"title" => "title", "foo" => "bar"}
|
63
|
+
it 'grabs the form data when posted' do
|
64
|
+
expected = { 'title' => 'title', 'foo' => 'bar' }
|
78
65
|
@helper.params = expected
|
79
66
|
expect(@helper.form_data).to eql(expected)
|
80
67
|
end
|
81
68
|
|
82
|
-
it
|
83
|
-
expected = {
|
69
|
+
it 'builds the issue body' do
|
70
|
+
expected = { 'title' => 'title', 'foo' => 'bar' }
|
84
71
|
@helper.params = expected
|
85
|
-
expect(@helper.issue_body).to eql(
|
72
|
+
expect(@helper.issue_body).to eql('* **Foo**: bar')
|
86
73
|
end
|
87
74
|
|
88
|
-
it
|
89
|
-
@helper.params = {
|
90
|
-
with_env
|
91
|
-
with_env
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
to_return(:status => 200, :body => '{"number": 1234}', :headers => { 'Content-Type' => 'application/json' })
|
75
|
+
it 'submits the issue' do
|
76
|
+
@helper.params = { 'title' => 'title', 'foo' => 'bar', 'labels' => %w(foo bar) }
|
77
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
78
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
79
|
+
stub = stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/issues')
|
80
|
+
.with(body: '{"labels":["foo","bar"],"title":"title","body":"* **Foo**: bar"}')
|
81
|
+
.to_return(status: 200, body: '{"number": 1234}', headers: { 'Content-Type' => 'application/json' })
|
96
82
|
|
97
83
|
expect(@helper.create_issue).to eql(1234)
|
98
84
|
expect(stub).to have_been_requested
|
@@ -101,158 +87,165 @@ describe "ProblemChild::Helpers" do
|
|
101
87
|
end
|
102
88
|
|
103
89
|
it "knows auth'd users can access a repo" do
|
104
|
-
stub_request(:get,
|
105
|
-
to_return(:
|
90
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
91
|
+
.to_return(status: 200, body: '{"private": true}', headers: { 'Content-Type' => 'application/json' })
|
106
92
|
|
107
|
-
with_env
|
108
|
-
with_env
|
93
|
+
with_env 'GITHUB_TOKEN', nil do
|
94
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
109
95
|
expect(@helper.repo_access?).to eql(true)
|
110
96
|
end
|
111
97
|
end
|
112
98
|
end
|
113
99
|
|
114
|
-
it
|
115
|
-
stub_request(:get,
|
116
|
-
to_return(:
|
100
|
+
it 'knows anonymous users can access public repos' do
|
101
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
102
|
+
.to_return(status: 200, body: '{"private": false}', headers: { 'Content-Type' => 'application/json' })
|
117
103
|
|
118
|
-
with_env
|
119
|
-
with_env
|
104
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
105
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
120
106
|
expect(@helper.repo_access?).to eql(true)
|
121
107
|
end
|
122
108
|
end
|
123
109
|
end
|
124
110
|
|
125
111
|
it "knows anonymous users can't access private repos" do
|
126
|
-
stub_request(:get,
|
127
|
-
to_return(:
|
112
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
113
|
+
.to_return(status: 200, body: '{"private": true}', headers: { 'Content-Type' => 'application/json' })
|
128
114
|
|
129
|
-
with_env
|
130
|
-
with_env
|
115
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
116
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
131
117
|
expect(@helper.repo_access?).to eql(false)
|
132
118
|
end
|
133
119
|
end
|
134
120
|
end
|
135
121
|
|
136
|
-
it
|
137
|
-
@helper.params[
|
138
|
-
expect(@helper.labels).to eql(
|
122
|
+
it 'knows the labels' do
|
123
|
+
@helper.params['labels'] = %w(foo bar)
|
124
|
+
expect(@helper.labels).to eql('foo,bar')
|
139
125
|
end
|
140
126
|
|
141
|
-
context
|
142
|
-
it
|
143
|
-
|
144
|
-
|
127
|
+
context 'uploads' do
|
128
|
+
it 'can identify uploads' do
|
129
|
+
Tempfile.open do |tempfile|
|
130
|
+
tempfile.write("FOO\n")
|
131
|
+
tempfile.rewind
|
132
|
+
file = { filename: 'foo.md', tempfile: tempfile }
|
133
|
+
@helper.params = { 'title' => 'title', 'file' => file }
|
134
|
+
expect(@helper.uploads.first[0]).to eql('file')
|
135
|
+
end
|
145
136
|
end
|
146
137
|
|
147
|
-
it
|
148
|
-
stub_request(:get,
|
149
|
-
|
138
|
+
it 'fetches the branches' do
|
139
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
140
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '1' } }])
|
150
141
|
|
151
|
-
with_env
|
152
|
-
with_env
|
153
|
-
expect(@helper.branches[0][:name]).to eql(
|
142
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
143
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
144
|
+
expect(@helper.branches[0][:name]).to eql('master')
|
154
145
|
end
|
155
146
|
end
|
156
147
|
end
|
157
148
|
|
158
|
-
it
|
159
|
-
stub_request(:get,
|
160
|
-
|
149
|
+
it 'fetches the base sha' do
|
150
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
151
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '123' } }])
|
161
152
|
|
162
|
-
|
163
|
-
|
164
|
-
|
153
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
154
|
+
.to_return(status: 200, body: { default_branch: 'master' }.to_json,
|
155
|
+
headers: { 'Content-Type' => 'application/json' })
|
165
156
|
|
166
|
-
with_env
|
167
|
-
with_env
|
168
|
-
expect(@helper.base_sha).to eql(
|
157
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
158
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
159
|
+
expect(@helper.base_sha).to eql('123')
|
169
160
|
end
|
170
161
|
end
|
171
162
|
end
|
172
163
|
|
173
|
-
it
|
174
|
-
stub_request(:get,
|
175
|
-
|
176
|
-
|
164
|
+
it 'knows if a branch exists' do
|
165
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
166
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '123' } }].to_json,
|
167
|
+
headers: { 'Content-Type' => 'application/json' })
|
177
168
|
|
178
|
-
with_env
|
179
|
-
with_env
|
180
|
-
expect(@helper.branch_exists?(
|
181
|
-
expect(@helper.branch_exists?(
|
169
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
170
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
171
|
+
expect(@helper.branch_exists?('master')).to eql(true)
|
172
|
+
expect(@helper.branch_exists?('master2')).to eql(false)
|
182
173
|
end
|
183
174
|
end
|
184
175
|
end
|
185
176
|
|
186
|
-
it
|
187
|
-
stub_request(:get,
|
188
|
-
|
189
|
-
|
177
|
+
it 'creates the branch name' do
|
178
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
179
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '123' } }].to_json,
|
180
|
+
headers: { 'Content-Type' => 'application/json' })
|
190
181
|
|
191
|
-
with_env
|
192
|
-
with_env
|
193
|
-
@helper.params = {
|
194
|
-
expect(@helper.patch_branch).to eql(
|
182
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
183
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
184
|
+
@helper.params = { 'title' => 'My title' }
|
185
|
+
expect(@helper.patch_branch).to eql('my-title')
|
195
186
|
|
196
|
-
@helper.params = {
|
197
|
-
expect(@helper.patch_branch).to eql(
|
187
|
+
@helper.params = { 'title' => 'master' }
|
188
|
+
expect(@helper.patch_branch).to eql('master-1')
|
198
189
|
end
|
199
190
|
end
|
200
191
|
end
|
201
192
|
|
202
|
-
it
|
203
|
-
stub_request(:get,
|
204
|
-
|
205
|
-
|
193
|
+
it 'creates a branch' do
|
194
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
195
|
+
.to_return(status: 200, body: { default_branch: 'master' }.to_json,
|
196
|
+
headers: { 'Content-Type' => 'application/json' })
|
206
197
|
|
207
|
-
|
208
|
-
|
209
|
-
|
198
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
199
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '123' } }].to_json,
|
200
|
+
headers: { 'Content-Type' => 'application/json' })
|
210
201
|
|
211
|
-
stub = stub_request(:post,
|
212
|
-
|
202
|
+
stub = stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/git/refs')
|
203
|
+
.with(body: '{"ref":"refs/heads/my-branch","sha":"123"}')
|
213
204
|
|
214
|
-
with_env
|
215
|
-
with_env
|
216
|
-
@helper.create_branch(
|
205
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
206
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
207
|
+
@helper.create_branch('my-branch')
|
217
208
|
expect(stub).to have_been_requested
|
218
209
|
end
|
219
210
|
end
|
220
211
|
end
|
221
212
|
|
222
|
-
it
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
213
|
+
it 'creates the pull request' do
|
214
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
215
|
+
.to_return(status: 200, body: { default_branch: 'master' }.to_json,
|
216
|
+
headers: { 'Content-Type' => 'application/json' })
|
217
|
+
|
218
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/branches')
|
219
|
+
.to_return(status: 200, body: [{ name: 'master', commit: { sha: '123' } }].to_json,
|
220
|
+
headers: { 'Content-Type' => 'application/json' })
|
221
|
+
|
222
|
+
stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/git/refs')
|
223
|
+
.with(body: '{"ref":"refs/heads/title","sha":"123"}')
|
224
|
+
.to_return(status: 200)
|
225
|
+
|
226
|
+
push = stub_request(:put, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/contents/file.txt')
|
227
|
+
.with(body: {
|
228
|
+
branch: 'title',
|
229
|
+
content: 'Rk9PCg==',
|
230
|
+
message: 'Create file.txt'
|
231
|
+
}.to_json)
|
232
|
+
|
233
|
+
pr = stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/pulls')
|
234
|
+
.with(body: '{"labels":null,"base":"master","head":"title","title":"title","body":"* **Foo**: bar"}')
|
235
|
+
|
236
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
237
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
238
|
+
Tempfile.open do |tempfile|
|
239
|
+
tempfile.write("FOO\n")
|
240
|
+
tempfile.rewind
|
241
|
+
@helper.params = { 'title' => 'title', 'some_file' => {
|
242
|
+
filename: 'file.txt',
|
243
|
+
tempfile: tempfile
|
244
|
+
}, 'foo' => 'bar' }
|
245
|
+
@helper.create_pull_request
|
246
|
+
expect(push).to have_been_requested
|
247
|
+
expect(pr).to have_been_requested
|
248
|
+
end
|
256
249
|
end
|
257
250
|
end
|
258
251
|
end
|
data/spec/problem_child_spec.rb
CHANGED
@@ -1,34 +1,33 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
it
|
5
|
-
|
6
|
-
|
3
|
+
describe 'ProblemChild' do
|
4
|
+
it 'knows the root' do
|
5
|
+
expected = File.expand_path '../lib/problem_child', File.dirname(__FILE__)
|
6
|
+
expect(ProblemChild.root).to eql(expected)
|
7
7
|
end
|
8
8
|
|
9
|
-
it
|
10
|
-
|
11
|
-
|
9
|
+
it 'knows the views dir' do
|
10
|
+
expected = File.expand_path '../lib/problem_child/views', File.dirname(__FILE__)
|
11
|
+
expect(ProblemChild.views_dir).to eql(expected)
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
it 'allows users to set the views dir' do
|
15
|
+
old = ProblemChild.views_dir
|
16
|
+
ProblemChild.views_dir = './foo'
|
17
|
+
expect(ProblemChild.views_dir).to eql('./foo')
|
18
|
+
ProblemChild.views_dir = old
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe
|
23
|
-
|
22
|
+
describe 'logged in user' do
|
24
23
|
before(:each) do
|
25
24
|
@user = make_user('login' => 'benbaltertest')
|
26
25
|
login_as @user
|
27
26
|
|
28
|
-
ENV[
|
29
|
-
ENV[
|
30
|
-
ENV[
|
31
|
-
ENV[
|
27
|
+
ENV['GITHUB_TEAM_ID'] = nil
|
28
|
+
ENV['GITHUB_ORG_ID'] = nil
|
29
|
+
ENV['GITHUB_TOKEN'] = nil
|
30
|
+
ENV['GITHUB_REPO'] = nil
|
32
31
|
end
|
33
32
|
|
34
33
|
include Rack::Test::Methods
|
@@ -37,59 +36,57 @@ describe "logged in user" do
|
|
37
36
|
ProblemChild::App
|
38
37
|
end
|
39
38
|
|
40
|
-
it
|
41
|
-
with_env
|
42
|
-
get
|
39
|
+
it 'shows the securocat when github returns an oauth error' do
|
40
|
+
with_env 'GITHUB_ORG_ID', 'balter-test-org' do
|
41
|
+
get '/auth/github/callback?error=redirect_uri_mismatch'
|
43
42
|
follow_redirect!
|
44
|
-
expect(last_response.body).to match(
|
43
|
+
expect(last_response.body).to match(/securocat\.png/)
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
48
47
|
it "shows the form when properly org auth'd" do
|
49
|
-
with_env
|
50
|
-
stub_request(:get,
|
51
|
-
|
48
|
+
with_env 'GITHUB_ORG_ID', 'balter-test-org' do
|
49
|
+
stub_request(:get, 'https://api.github.com/orgs/balter-test-org/members/benbaltertest')
|
50
|
+
.to_return(status: 204)
|
52
51
|
|
53
|
-
get
|
52
|
+
get '/'
|
54
53
|
expect(last_response.status).to eql(200)
|
55
54
|
expect(last_response.body).to match(/Submit an issue/)
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
58
|
it "shows the form when properly team auth'd" do
|
60
|
-
with_env
|
61
|
-
stub_request(:get,
|
62
|
-
|
59
|
+
with_env 'GITHUB_TEAM_ID', '1234' do
|
60
|
+
stub_request(:get, 'https://api.github.com/teams/1234/members/benbaltertest')
|
61
|
+
.to_return(status: 204)
|
63
62
|
|
64
|
-
get
|
63
|
+
get '/'
|
65
64
|
expect(last_response.status).to eql(200)
|
66
65
|
expect(last_response.body).to match(/Submit an issue/)
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
70
|
-
it
|
71
|
-
with_env
|
72
|
-
with_env
|
73
|
-
with_env
|
74
|
-
expect{get
|
69
|
+
it 'refuses to show the site with no auth strategy' do
|
70
|
+
with_env 'GITHUB_TEAM_ID', nil do
|
71
|
+
with_env 'GITHUB_ORG_ID', nil do
|
72
|
+
with_env 'GITHUB_TOKEN', nil do
|
73
|
+
expect { get '/' }.to raise_error(/Must define GITHUB_TEAM_ID, GITHUB_ORG_ID, OR GITHUB_TOKEN/)
|
75
74
|
end
|
76
75
|
end
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
80
|
-
it
|
81
|
-
with_env
|
82
|
-
with_env
|
83
|
-
|
84
|
-
|
85
|
-
to_return(:status => 204)
|
79
|
+
it 'allows the user to create an issue' do
|
80
|
+
with_env 'GITHUB_ORG_ID', 'balter-test-org' do
|
81
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
82
|
+
stub_request(:get, 'https://api.github.com/orgs/balter-test-org/members/benbaltertest')
|
83
|
+
.to_return(status: 204)
|
86
84
|
|
87
|
-
stub_request(:post,
|
88
|
-
with(:
|
89
|
-
to_return(:
|
85
|
+
stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/issues')
|
86
|
+
.with(body: '{"labels":[],"title":"title","body":"* **Foo**: bar"}')
|
87
|
+
.to_return(status: 200, body: '{"number": 1234}', headers: { 'Content-Type' => 'application/json' })
|
90
88
|
|
91
|
-
post
|
92
|
-
follow_redirect!
|
89
|
+
post '/', title: 'title', foo: 'bar'
|
93
90
|
|
94
91
|
expect(last_response.status).to eql(200)
|
95
92
|
expected = '<a href="http://github.com/benbalter/test-repo-ignore-me/issues/1234">benbalter/test-repo-ignore-me#1234</a>'
|
@@ -99,44 +96,42 @@ describe "logged in user" do
|
|
99
96
|
end
|
100
97
|
end
|
101
98
|
|
102
|
-
describe
|
99
|
+
describe 'logged out user' do
|
103
100
|
include Rack::Test::Methods
|
104
101
|
|
105
102
|
def app
|
106
103
|
ProblemChild::App
|
107
104
|
end
|
108
105
|
|
109
|
-
it
|
110
|
-
with_env
|
111
|
-
with_env
|
112
|
-
get
|
106
|
+
it 'asks the user to log in' do
|
107
|
+
with_env 'GITHUB_ORG_ID', 'balter-test-org' do
|
108
|
+
with_env 'GITHUB_TOKEN', nil do
|
109
|
+
get '/'
|
113
110
|
expect(last_response.status).to eql(302)
|
114
111
|
expect(last_response.headers['Location']).to match(%r{^https://github\.com/login/oauth/authorize})
|
115
112
|
end
|
116
113
|
end
|
117
114
|
end
|
118
115
|
|
119
|
-
it
|
120
|
-
with_env
|
121
|
-
get
|
116
|
+
it 'allows anonymous users to see the form' do
|
117
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
118
|
+
get '/'
|
122
119
|
expect(last_response.status).to eql(200)
|
123
120
|
expect(last_response.body).to match(/Submit an issue/)
|
124
121
|
end
|
125
122
|
end
|
126
123
|
|
127
|
-
it
|
128
|
-
with_env
|
129
|
-
with_env
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
to_return(:status => 200, :body => '{"number": 1234}', :headers => { 'Content-Type' => 'application/json' })
|
124
|
+
it 'allows anonymous submissions' do
|
125
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
126
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
127
|
+
stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/issues')
|
128
|
+
.with(body: '{"labels":[],"title":"title","body":"* **Foo**: bar"}')
|
129
|
+
.to_return(status: 200, body: '{"number": 1234}', headers: { 'Content-Type' => 'application/json' })
|
134
130
|
|
135
|
-
stub_request(:get,
|
136
|
-
to_return(:
|
131
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
132
|
+
.to_return(status: 200, body: '{"private": true}', headers: { 'Content-Type' => 'application/json' })
|
137
133
|
|
138
|
-
post
|
139
|
-
follow_redirect!
|
134
|
+
post '/', title: 'title', foo: 'bar'
|
140
135
|
|
141
136
|
expect(last_response.status).to eql(200)
|
142
137
|
expect(last_response.body).to match(/Your issue was successfully submitted\./)
|
@@ -144,20 +139,19 @@ describe "logged out user" do
|
|
144
139
|
end
|
145
140
|
end
|
146
141
|
|
147
|
-
it
|
148
|
-
with_env
|
149
|
-
with_env
|
150
|
-
long_string =
|
142
|
+
it 'supports submissions > 4k' do
|
143
|
+
with_env 'GITHUB_TOKEN', '1234' do
|
144
|
+
with_env 'GITHUB_REPO', 'benbalter/test-repo-ignore-me' do
|
145
|
+
long_string = '0' * 5000
|
151
146
|
|
152
|
-
stub_request(:post,
|
153
|
-
with(:
|
154
|
-
to_return(:
|
147
|
+
stub_request(:post, 'https://api.github.com/repos/benbalter/test-repo-ignore-me/issues')
|
148
|
+
.with(body: "{\"labels\":[],\"title\":\"title\",\"body\":\"* **Foo**: #{long_string}\"}")
|
149
|
+
.to_return(status: 200, body: '{"number": 1234}', headers: { 'Content-Type' => 'application/json' })
|
155
150
|
|
156
|
-
stub_request(:get,
|
157
|
-
to_return(:
|
151
|
+
stub_request(:get, 'https://api.github.com/repos/benbalter/test-repo-ignore-me')
|
152
|
+
.to_return(status: 200, body: '{"private": true}', headers: { 'Content-Type' => 'application/json' })
|
158
153
|
|
159
|
-
post
|
160
|
-
follow_redirect!
|
154
|
+
post '/', title: 'title', foo: long_string
|
161
155
|
|
162
156
|
expect(last_response.status).to eql(200)
|
163
157
|
expect(last_response.body).to match(/Your issue was successfully submitted\./)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/setup'
|
2
2
|
|
3
3
|
ENV['RACK_ENV'] = 'test'
|
4
|
-
|
4
|
+
$LOAD_PATH.push File.join(File.dirname(__FILE__), '..', 'lib')
|
5
5
|
|
6
6
|
require 'rack/test'
|
7
7
|
require 'sinatra/auth/github'
|
8
8
|
require 'sinatra/auth/github/test/test_helper'
|
9
9
|
require 'webmock/rspec'
|
10
10
|
|
11
|
-
require_relative
|
11
|
+
require_relative '../lib/problem_child'
|
12
12
|
WebMock.disable_net_connect!
|
13
13
|
|
14
14
|
RSpec.configure do |config|
|
15
15
|
config.include(Sinatra::Auth::Github::Test::Helper)
|
16
16
|
end
|
17
17
|
|
18
|
-
ENV[
|
19
|
-
ENV[
|
18
|
+
ENV['GITHUB_CLIENT_ID'] = '1234'
|
19
|
+
ENV['GITHUB_CLIENT_SECRET'] = 'asdf'
|
20
20
|
|
21
21
|
def with_env(key, value)
|
22
22
|
old_env = ENV[key]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: problem_child
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Balter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -108,34 +108,6 @@ dependencies:
|
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.6'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: redis
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '3.2'
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '3.2'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: moneta
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0.8'
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0.8'
|
139
111
|
- !ruby/object:Gem::Dependency
|
140
112
|
name: rspec
|
141
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,6 +206,20 @@ dependencies:
|
|
234
206
|
- - "~>"
|
235
207
|
- !ruby/object:Gem::Version
|
236
208
|
version: '0.10'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: rubocop
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0.41'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0.41'
|
237
223
|
description:
|
238
224
|
email:
|
239
225
|
- ben.balter@github.com
|
@@ -243,6 +229,7 @@ extra_rdoc_files: []
|
|
243
229
|
files:
|
244
230
|
- ".bowerrc"
|
245
231
|
- ".gitignore"
|
232
|
+
- ".rubocop.yml"
|
246
233
|
- ".travis.yml"
|
247
234
|
- Gemfile
|
248
235
|
- LICENSE.txt
|
@@ -330,7 +317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
330
317
|
version: '0'
|
331
318
|
requirements: []
|
332
319
|
rubyforge_project:
|
333
|
-
rubygems_version: 2.
|
320
|
+
rubygems_version: 2.6.6
|
334
321
|
signing_key:
|
335
322
|
specification_version: 4
|
336
323
|
summary: Allows authenticated or anonymous users to fill out a standard web form to
|
@@ -340,4 +327,3 @@ test_files:
|
|
340
327
|
- spec/problem_child_helpers_spec.rb
|
341
328
|
- spec/problem_child_spec.rb
|
342
329
|
- spec/spec_helper.rb
|
343
|
-
has_rdoc:
|