github_webhook 1.1.0 → 1.3.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 +5 -5
- data/.github/workflows/ruby.yml +24 -0
- data/.gitignore +2 -0
- data/.ruby-version +1 -1
- data/Appraisals +15 -0
- data/Gemfile +2 -0
- data/README.md +26 -4
- data/Rakefile +3 -0
- data/gemfiles/rails_4.2.gemfile +7 -0
- data/gemfiles/rails_5.0.gemfile +7 -0
- data/gemfiles/rails_5.1.gemfile +7 -0
- data/github_webhook.gemspec +3 -4
- data/lib/github_webhook/processor.rb +30 -23
- data/lib/github_webhook/version.rb +1 -1
- data/spec/github_webhook/processor_spec.rb +12 -5
- data/spec/spec_helper.rb +2 -2
- metadata +16 -28
- data/.travis.yml +0 -7
- data/Gemfile.lock +0 -92
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 68085b2caf36fbd2af5d858a0fd98ce539d0c98a0c23b45e399eca378f17175b
|
|
4
|
+
data.tar.gz: 547ce4ef7686bb5a886a03e2f7c550a8602729608302aa1f9daeaacee9a26acd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e4cd1c3ff4f074510e1228e950b9d71d2e663869cb78e5f7f98cc0028d365ece7ddacd447c0bfd1525ed04739d3b156ffe1cc8f9fde12a865212ab379eed5252
|
|
7
|
+
data.tar.gz: 549b72dcc5a79abddbd693c1771c96f51a35a58dd53012240bad08164f5217f71c399d71ca4c4d30aff3d8047775907bb1132515601c6d0f0eea37bce4bff519
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Ruby
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v2
|
|
16
|
+
- name: Set up Ruby 2.7
|
|
17
|
+
uses: actions/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: 2.7.x
|
|
20
|
+
- name: Build and test with Rake
|
|
21
|
+
run: |
|
|
22
|
+
gem install bundler
|
|
23
|
+
bundle install --jobs 4 --retry 3
|
|
24
|
+
bundle exec rake
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.4
|
|
1
|
+
2.7.4
|
data/Appraisals
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
[](https://codeclimate.com/github/ssaunier/github_webhook)
|
|
1
|
+
|
|
3
2
|
[](http://badge.fury.io/rb/github_webhook)
|
|
4
3
|
|
|
5
4
|
|
|
6
|
-
#
|
|
5
|
+
# Github Webhook for Rails
|
|
7
6
|
|
|
8
7
|
This gem will help you to quickly setup a route in your Rails application which listens
|
|
9
8
|
to a [GitHub webhook](https://developer.github.com/webhooks/)
|
|
10
9
|
|
|
10
|
+
## Alternatives
|
|
11
|
+
|
|
12
|
+
If you want to use this logic outside of Rails, you should consider the following gems (cf [#19](https://github.com/ssaunier/github_webhook/issues/19)):
|
|
13
|
+
|
|
14
|
+
- [`sinatra-github_webhooks`](https://github.com/chrismytton/sinatra-github_webhooks)
|
|
15
|
+
- [`rack-github_webhooks`](https://github.com/chrismytton/rack-github_webhooks)
|
|
16
|
+
|
|
17
|
+
If you are on Rails, please read on!
|
|
18
|
+
|
|
11
19
|
## Installation
|
|
12
20
|
|
|
13
21
|
Add this line to your application's Gemfile:
|
|
14
22
|
|
|
15
23
|
```ruby
|
|
16
|
-
gem 'github_webhook', '~> 1.
|
|
24
|
+
gem 'github_webhook', '~> 1.2'
|
|
17
25
|
```
|
|
18
26
|
|
|
19
27
|
And then execute:
|
|
@@ -93,3 +101,17 @@ You can have an overview of your webhooks at the following URL:
|
|
|
93
101
|
```
|
|
94
102
|
https://github.com/:username/:repo/settings/hooks
|
|
95
103
|
```
|
|
104
|
+
|
|
105
|
+
## Contributing
|
|
106
|
+
|
|
107
|
+
### Specs
|
|
108
|
+
|
|
109
|
+
This project uses [Appraisal](https://github.com/thoughtbot/appraisal) to test against multiple
|
|
110
|
+
versions of Rails.
|
|
111
|
+
|
|
112
|
+
On Travis, builds are also run on multiple versions of Ruby, each with multiple versions of Rails.
|
|
113
|
+
|
|
114
|
+
When you run `bundle install`, it will use the latest version of Rails.
|
|
115
|
+
You can then run `bundle exec rake spec` to run the test with that version of Rails.
|
|
116
|
+
|
|
117
|
+
To run the specs against each version of Rails, use `bundle exec appraisal rake spec`.
|
data/Rakefile
CHANGED
data/github_webhook.gemspec
CHANGED
|
@@ -22,8 +22,7 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.add_dependency "activesupport", ">= 4"
|
|
23
23
|
spec.add_dependency "railties", ">= 4"
|
|
24
24
|
|
|
25
|
-
spec.add_development_dependency "
|
|
26
|
-
spec.add_development_dependency "
|
|
27
|
-
spec.add_development_dependency "
|
|
28
|
-
spec.add_development_dependency "codeclimate-test-reporter"
|
|
25
|
+
spec.add_development_dependency "rake", "~> 12.3"
|
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.9"
|
|
27
|
+
spec.add_development_dependency "appraisal"
|
|
29
28
|
end
|
|
@@ -13,54 +13,61 @@ module GithubWebhook::Processor
|
|
|
13
13
|
|
|
14
14
|
# To fetch list from https://developer.github.com/v3/activity/events/types
|
|
15
15
|
# run this little JS code in the console:
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# });
|
|
22
|
-
# console.log(events);
|
|
23
|
-
GITHUB_EVENTS_WHITELIST = %w(
|
|
16
|
+
# document.querySelectorAll('.list-style-none li.lh-condensed a').forEach(e => console.log(e.text))
|
|
17
|
+
GITHUB_EVENTS = %w(
|
|
18
|
+
check_run
|
|
19
|
+
check_suite
|
|
20
|
+
code_scanning_alert
|
|
24
21
|
commit_comment
|
|
22
|
+
content_reference
|
|
25
23
|
create
|
|
26
24
|
delete
|
|
25
|
+
deploy_key
|
|
27
26
|
deployment
|
|
28
27
|
deployment_status
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
discussion
|
|
29
|
+
discussion_comment
|
|
31
30
|
fork
|
|
32
|
-
|
|
33
|
-
gist
|
|
31
|
+
github_app_authorization
|
|
34
32
|
gollum
|
|
35
33
|
installation
|
|
36
34
|
installation_repositories
|
|
37
|
-
integration_installation
|
|
38
|
-
integration_installation_repositories
|
|
39
|
-
issues
|
|
40
35
|
issue_comment
|
|
36
|
+
issues
|
|
41
37
|
label
|
|
42
38
|
marketplace_purchase
|
|
43
39
|
member
|
|
44
40
|
membership
|
|
41
|
+
meta
|
|
45
42
|
milestone
|
|
46
43
|
organization
|
|
47
44
|
org_block
|
|
45
|
+
package
|
|
48
46
|
page_build
|
|
49
47
|
ping
|
|
50
|
-
project
|
|
51
48
|
project_card
|
|
52
49
|
project_column
|
|
50
|
+
project
|
|
53
51
|
public
|
|
54
52
|
pull_request
|
|
55
53
|
pull_request_review
|
|
56
54
|
pull_request_review_comment
|
|
57
55
|
push
|
|
58
56
|
release
|
|
57
|
+
repository_dispatch
|
|
59
58
|
repository
|
|
59
|
+
repository_import
|
|
60
|
+
repository_vulnerability_alert
|
|
61
|
+
secret_scanning_alert
|
|
62
|
+
security_advisory
|
|
63
|
+
sponsorship
|
|
64
|
+
star
|
|
60
65
|
status
|
|
61
66
|
team
|
|
62
67
|
team_add
|
|
63
68
|
watch
|
|
69
|
+
workflow_dispatch
|
|
70
|
+
workflow_run
|
|
64
71
|
)
|
|
65
72
|
|
|
66
73
|
def create
|
|
@@ -79,14 +86,14 @@ module GithubWebhook::Processor
|
|
|
79
86
|
|
|
80
87
|
private
|
|
81
88
|
|
|
82
|
-
HMAC_DIGEST = OpenSSL::Digest.new('
|
|
89
|
+
HMAC_DIGEST = OpenSSL::Digest.new('sha256')
|
|
83
90
|
|
|
84
91
|
def authenticate_github_request!
|
|
85
92
|
raise UnspecifiedWebhookSecretError.new unless respond_to?(:webhook_secret, true)
|
|
86
93
|
secret = webhook_secret(json_body)
|
|
87
94
|
|
|
88
|
-
expected_signature = "
|
|
89
|
-
|
|
95
|
+
expected_signature = "sha256=#{OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, request_body)}"
|
|
96
|
+
unless ActiveSupport::SecurityUtils.secure_compare(signature_header, expected_signature)
|
|
90
97
|
GithubWebhook.logger && GithubWebhook.logger.warn("[GithubWebhook::Processor] signature "\
|
|
91
98
|
"invalid, actual: #{signature_header}, expected: #{expected_signature}")
|
|
92
99
|
raise SignatureError
|
|
@@ -94,8 +101,8 @@ module GithubWebhook::Processor
|
|
|
94
101
|
end
|
|
95
102
|
|
|
96
103
|
def check_github_event!
|
|
97
|
-
unless
|
|
98
|
-
raise UnsupportedGithubEventError.new("#{request.headers['X-GitHub-Event']} is not a
|
|
104
|
+
unless GITHUB_EVENTS.include?(request.headers['X-GitHub-Event'])
|
|
105
|
+
raise UnsupportedGithubEventError.new("#{request.headers['X-GitHub-Event']} is not a whitelisted GitHub event. See https://developer.github.com/v3/activity/events/types/")
|
|
99
106
|
end
|
|
100
107
|
end
|
|
101
108
|
|
|
@@ -117,14 +124,14 @@ module GithubWebhook::Processor
|
|
|
117
124
|
payload = request_body
|
|
118
125
|
else
|
|
119
126
|
raise UnsupportedContentTypeError.new(
|
|
120
|
-
"Content-Type #{content_type} is not supported. Use 'application/x-www-form-urlencoded' or 'application
|
|
127
|
+
"Content-Type #{content_type} is not supported. Use 'application/x-www-form-urlencoded' or 'application/json")
|
|
121
128
|
end
|
|
122
129
|
ActiveSupport::HashWithIndifferentAccess.new(JSON.load(payload))
|
|
123
130
|
)
|
|
124
131
|
end
|
|
125
132
|
|
|
126
133
|
def signature_header
|
|
127
|
-
@signature_header ||= request.headers['X-Hub-Signature']
|
|
134
|
+
@signature_header ||= request.headers['X-Hub-Signature-256'] || ''
|
|
128
135
|
end
|
|
129
136
|
|
|
130
137
|
def event_method
|
|
@@ -65,7 +65,7 @@ module GithubWebhook
|
|
|
65
65
|
it "calls the #push method in controller" do
|
|
66
66
|
expect(controller).to receive(:github_push)
|
|
67
67
|
controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
|
|
68
|
-
controller.request.headers['X-Hub-Signature'] = "
|
|
68
|
+
controller.request.headers['X-Hub-Signature-256'] = "sha256=3f3ab3986b656abb17af3eb1443ed6c08ef8fff9fea83915909d1b421aec89be"
|
|
69
69
|
controller.request.headers['X-GitHub-Event'] = 'push'
|
|
70
70
|
controller.request.headers['Content-Type'] = 'application/json'
|
|
71
71
|
controller.send :authenticate_github_request! # Manually as we don't have the before_filter logic in our Mock object
|
|
@@ -75,7 +75,7 @@ module GithubWebhook
|
|
|
75
75
|
|
|
76
76
|
it "calls the #push method in controller (json)" do
|
|
77
77
|
controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
|
|
78
|
-
controller.request.headers['X-Hub-Signature'] = "
|
|
78
|
+
controller.request.headers['X-Hub-Signature-256'] = "sha256=3f3ab3986b656abb17af3eb1443ed6c08ef8fff9fea83915909d1b421aec89be"
|
|
79
79
|
controller.request.headers['X-GitHub-Event'] = 'push'
|
|
80
80
|
controller.request.headers['Content-Type'] = 'application/json'
|
|
81
81
|
controller.send :authenticate_github_request! # Manually as we don't have the before_action logic in our Mock object
|
|
@@ -86,7 +86,7 @@ module GithubWebhook
|
|
|
86
86
|
it "calls the #push method (x-www-form-urlencoded encoded)" do
|
|
87
87
|
body = "payload=" + CGI::escape({ :foo => "bar" }.to_json.to_s)
|
|
88
88
|
controller.request.body = StringIO.new(body)
|
|
89
|
-
controller.request.headers['X-Hub-Signature'] = "
|
|
89
|
+
controller.request.headers['X-Hub-Signature-256'] = "sha256=cefe60b775fcb22483ceece8f20be4869868a20fb4aa79829e53c1de61b99d01"
|
|
90
90
|
controller.request.headers['X-GitHub-Event'] = 'push'
|
|
91
91
|
controller.request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
92
92
|
controller.send :authenticate_github_request! # Manually as we don't have the before_action logic in our Mock object
|
|
@@ -96,7 +96,7 @@ module GithubWebhook
|
|
|
96
96
|
|
|
97
97
|
it "raises an error when signature does not match" do
|
|
98
98
|
controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
|
|
99
|
-
controller.request.headers['X-Hub-Signature'] = "
|
|
99
|
+
controller.request.headers['X-Hub-Signature-256'] = "sha256=FOOBAR"
|
|
100
100
|
controller.request.headers['X-GitHub-Event'] = 'push'
|
|
101
101
|
controller.request.headers['Content-Type'] = 'application/json'
|
|
102
102
|
expect { controller.send :authenticate_github_request! }.to raise_error(Processor::SignatureError)
|
|
@@ -116,11 +116,18 @@ module GithubWebhook
|
|
|
116
116
|
|
|
117
117
|
it "raises an error when the content type is not correct" do
|
|
118
118
|
controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
|
|
119
|
-
controller.request.headers['X-Hub-Signature'] = "
|
|
119
|
+
controller.request.headers['X-Hub-Signature-256'] = "sha256=3f3ab3986b656abb17af3eb1443ed6c08ef8fff9fea83915909d1b421aec89be"
|
|
120
120
|
controller.request.headers['X-GitHub-Event'] = 'ping'
|
|
121
121
|
controller.request.headers['Content-Type'] = 'application/xml'
|
|
122
122
|
expect { controller.send :authenticate_github_request! }.to raise_error(Processor::UnsupportedContentTypeError)
|
|
123
123
|
end
|
|
124
|
+
|
|
125
|
+
it 'raises SignatureError when the X-Hub-Signature header is missing' do
|
|
126
|
+
controller.request.body = StringIO.new('{}')
|
|
127
|
+
controller.request.headers['Content-Type'] = 'application/json'
|
|
128
|
+
controller.request.headers['X-GitHub-Event'] = 'ping'
|
|
129
|
+
expect { controller.send :authenticate_github_request! }.to raise_error(Processor::SignatureError)
|
|
130
|
+
end
|
|
124
131
|
end
|
|
125
132
|
end
|
|
126
133
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: github_webhook
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sebastien Saunier
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-12-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -52,50 +52,36 @@ dependencies:
|
|
|
52
52
|
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '4'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: bundler
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '1.5'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '1.5'
|
|
69
55
|
- !ruby/object:Gem::Dependency
|
|
70
56
|
name: rake
|
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
|
72
58
|
requirements:
|
|
73
59
|
- - "~>"
|
|
74
60
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
61
|
+
version: '12.3'
|
|
76
62
|
type: :development
|
|
77
63
|
prerelease: false
|
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
65
|
requirements:
|
|
80
66
|
- - "~>"
|
|
81
67
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
68
|
+
version: '12.3'
|
|
83
69
|
- !ruby/object:Gem::Dependency
|
|
84
70
|
name: rspec
|
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
|
86
72
|
requirements:
|
|
87
73
|
- - "~>"
|
|
88
74
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
75
|
+
version: '3.9'
|
|
90
76
|
type: :development
|
|
91
77
|
prerelease: false
|
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
79
|
requirements:
|
|
94
80
|
- - "~>"
|
|
95
81
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
82
|
+
version: '3.9'
|
|
97
83
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
84
|
+
name: appraisal
|
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
|
100
86
|
requirements:
|
|
101
87
|
- - ">="
|
|
@@ -115,14 +101,17 @@ executables: []
|
|
|
115
101
|
extensions: []
|
|
116
102
|
extra_rdoc_files: []
|
|
117
103
|
files:
|
|
104
|
+
- ".github/workflows/ruby.yml"
|
|
118
105
|
- ".gitignore"
|
|
119
106
|
- ".ruby-version"
|
|
120
|
-
-
|
|
107
|
+
- Appraisals
|
|
121
108
|
- Gemfile
|
|
122
|
-
- Gemfile.lock
|
|
123
109
|
- LICENSE.txt
|
|
124
110
|
- README.md
|
|
125
111
|
- Rakefile
|
|
112
|
+
- gemfiles/rails_4.2.gemfile
|
|
113
|
+
- gemfiles/rails_5.0.gemfile
|
|
114
|
+
- gemfiles/rails_5.1.gemfile
|
|
126
115
|
- github_webhook.gemspec
|
|
127
116
|
- lib/github_webhook.rb
|
|
128
117
|
- lib/github_webhook/processor.rb
|
|
@@ -134,7 +123,7 @@ homepage: https://github.com/ssaunier/github_webhook
|
|
|
134
123
|
licenses:
|
|
135
124
|
- MIT
|
|
136
125
|
metadata: {}
|
|
137
|
-
post_install_message:
|
|
126
|
+
post_install_message:
|
|
138
127
|
rdoc_options: []
|
|
139
128
|
require_paths:
|
|
140
129
|
- lib
|
|
@@ -149,9 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
149
138
|
- !ruby/object:Gem::Version
|
|
150
139
|
version: '0'
|
|
151
140
|
requirements: []
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
signing_key:
|
|
141
|
+
rubygems_version: 3.1.6
|
|
142
|
+
signing_key:
|
|
155
143
|
specification_version: 4
|
|
156
144
|
summary: Process GitHub Webhooks in your Rails app (Controller mixin)
|
|
157
145
|
test_files:
|
data/.travis.yml
DELETED
data/Gemfile.lock
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
github_webhook (1.1.0)
|
|
5
|
-
activesupport (>= 4)
|
|
6
|
-
rack (>= 1.3)
|
|
7
|
-
railties (>= 4)
|
|
8
|
-
|
|
9
|
-
GEM
|
|
10
|
-
remote: https://rubygems.org/
|
|
11
|
-
specs:
|
|
12
|
-
actionpack (5.1.4)
|
|
13
|
-
actionview (= 5.1.4)
|
|
14
|
-
activesupport (= 5.1.4)
|
|
15
|
-
rack (~> 2.0)
|
|
16
|
-
rack-test (>= 0.6.3)
|
|
17
|
-
rails-dom-testing (~> 2.0)
|
|
18
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
19
|
-
actionview (5.1.4)
|
|
20
|
-
activesupport (= 5.1.4)
|
|
21
|
-
builder (~> 3.1)
|
|
22
|
-
erubi (~> 1.4)
|
|
23
|
-
rails-dom-testing (~> 2.0)
|
|
24
|
-
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
|
25
|
-
activesupport (5.1.4)
|
|
26
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
27
|
-
i18n (~> 0.7)
|
|
28
|
-
minitest (~> 5.1)
|
|
29
|
-
tzinfo (~> 1.1)
|
|
30
|
-
builder (3.2.3)
|
|
31
|
-
codeclimate-test-reporter (0.4.8)
|
|
32
|
-
simplecov (>= 0.7.1, < 1.0.0)
|
|
33
|
-
concurrent-ruby (1.0.5)
|
|
34
|
-
crass (1.0.2)
|
|
35
|
-
diff-lcs (1.2.5)
|
|
36
|
-
docile (1.1.5)
|
|
37
|
-
erubi (1.6.1)
|
|
38
|
-
i18n (0.8.6)
|
|
39
|
-
json (1.8.6)
|
|
40
|
-
loofah (2.1.1)
|
|
41
|
-
crass (~> 1.0.2)
|
|
42
|
-
nokogiri (>= 1.5.9)
|
|
43
|
-
method_source (0.9.0)
|
|
44
|
-
mini_portile2 (2.3.0)
|
|
45
|
-
minitest (5.10.3)
|
|
46
|
-
nokogiri (1.8.1)
|
|
47
|
-
mini_portile2 (~> 2.3.0)
|
|
48
|
-
rack (2.0.3)
|
|
49
|
-
rack-test (0.7.0)
|
|
50
|
-
rack (>= 1.0, < 3)
|
|
51
|
-
rails-dom-testing (2.0.3)
|
|
52
|
-
activesupport (>= 4.2.0)
|
|
53
|
-
nokogiri (>= 1.6)
|
|
54
|
-
rails-html-sanitizer (1.0.3)
|
|
55
|
-
loofah (~> 2.0)
|
|
56
|
-
railties (5.1.4)
|
|
57
|
-
actionpack (= 5.1.4)
|
|
58
|
-
activesupport (= 5.1.4)
|
|
59
|
-
method_source
|
|
60
|
-
rake (>= 0.8.7)
|
|
61
|
-
thor (>= 0.18.1, < 2.0)
|
|
62
|
-
rake (10.3.1)
|
|
63
|
-
rspec (2.14.1)
|
|
64
|
-
rspec-core (~> 2.14.0)
|
|
65
|
-
rspec-expectations (~> 2.14.0)
|
|
66
|
-
rspec-mocks (~> 2.14.0)
|
|
67
|
-
rspec-core (2.14.8)
|
|
68
|
-
rspec-expectations (2.14.5)
|
|
69
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
|
70
|
-
rspec-mocks (2.14.6)
|
|
71
|
-
simplecov (0.11.2)
|
|
72
|
-
docile (~> 1.1.0)
|
|
73
|
-
json (~> 1.8)
|
|
74
|
-
simplecov-html (~> 0.10.0)
|
|
75
|
-
simplecov-html (0.10.0)
|
|
76
|
-
thor (0.20.0)
|
|
77
|
-
thread_safe (0.3.6)
|
|
78
|
-
tzinfo (1.2.3)
|
|
79
|
-
thread_safe (~> 0.1)
|
|
80
|
-
|
|
81
|
-
PLATFORMS
|
|
82
|
-
ruby
|
|
83
|
-
|
|
84
|
-
DEPENDENCIES
|
|
85
|
-
bundler (~> 1.5)
|
|
86
|
-
codeclimate-test-reporter
|
|
87
|
-
github_webhook!
|
|
88
|
-
rake (~> 10.1)
|
|
89
|
-
rspec (~> 2.14)
|
|
90
|
-
|
|
91
|
-
BUNDLED WITH
|
|
92
|
-
1.16.0.pre.2
|