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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 482d71a9312b1b80aeee8af5c230e80ca9b5cd15
4
- data.tar.gz: 8e788b3145ab2874ff71f5a4fda3c2a8f89557a3
2
+ SHA256:
3
+ metadata.gz: 68085b2caf36fbd2af5d858a0fd98ce539d0c98a0c23b45e399eca378f17175b
4
+ data.tar.gz: 547ce4ef7686bb5a886a03e2f7c550a8602729608302aa1f9daeaacee9a26acd
5
5
  SHA512:
6
- metadata.gz: cbe5e47e926c147748387234219b18a2b330b526f2f7804a5e8bb9d1fbe4ef16c978a72437525bdbfbdcd95f2f62901d5b7f26a4eb637721d734ac87c0a0b354
7
- data.tar.gz: 8eda80c2a630d17eed37e66b8c15c30ae4eadf57d71430ba1ea1e3665d68c9514d39b8c75bcd1f4d8f8d86c0e550a53dd5bd1203f60438cd5759fffd2171e479
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
@@ -1,3 +1,5 @@
1
1
  .DS_Store
2
2
  *.gem
3
3
  coverage
4
+ /Gemfile.lock
5
+ /gemfiles/*.gemfile.lock
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.4.2
1
+ 2.7.4
data/Appraisals ADDED
@@ -0,0 +1,15 @@
1
+ appraise "rails-4.2" do
2
+ gem "rails", "~> 4.2.0"
3
+ end
4
+
5
+ appraise "rails-5.0" do
6
+ gem "rails", "~> 5.0.0"
7
+ end
8
+
9
+ appraise "rails-5.1" do
10
+ gem "rails", "~> 5.1.0"
11
+ end
12
+
13
+ appraise "rails-6.0" do
14
+ gem "rails", "~> 6.0"
15
+ end
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in github_webhook.gemspec
4
4
  gemspec
5
+
6
+ gem 'simplecov', require: false
data/README.md CHANGED
@@ -1,19 +1,27 @@
1
- [![Build Status](https://travis-ci.org/ssaunier/github_webhook.svg?branch=master)](https://travis-ci.org/ssaunier/github_webhook)
2
- [![Code Climate](https://codeclimate.com/github/ssaunier/github_webhook/badges/gpa.svg)](https://codeclimate.com/github/ssaunier/github_webhook)
1
+
3
2
  [![Gem Version](https://badge.fury.io/rb/github_webhook.svg)](http://badge.fury.io/rb/github_webhook)
4
3
 
5
4
 
6
- # GithubWebhook
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.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
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env rake
2
+ require "rubygems"
3
+ require "bundler/setup"
4
+
2
5
  require "bundler/gem_tasks"
3
6
 
4
7
  require 'rspec'
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.0.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -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 "bundler", "~> 1.5"
26
- spec.add_development_dependency "rake", "~> 10.1"
27
- spec.add_development_dependency "rspec", "~> 2.14"
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
- # var events = "ping";
17
- # $('h3').each(function(i, item) {
18
- # if ($(item).text().match(/webhook event name/i)) {
19
- # events = events + ' ' + $(item).next('p').find('code').html();
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
- download
30
- follow
28
+ discussion
29
+ discussion_comment
31
30
  fork
32
- fork_apply
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('sha1')
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 = "sha1=#{OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, request_body)}"
89
- if signature_header != expected_signature
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 GITHUB_EVENTS_WHITELIST.include?(request.headers['X-GitHub-Event'])
98
- raise UnsupportedGithubEventError.new("#{request.headers['X-GitHub-Event']} is not a whiltelisted GitHub event. See https://developer.github.com/v3/activity/events/types/")
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.json")
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
@@ -1,3 +1,3 @@
1
1
  module GithubWebhook
2
- VERSION = "1.1.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -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'] = "sha1=52b582138706ac0c597c315cfc1a1bf177408a4d"
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'] = "sha1=52b582138706ac0c597c315cfc1a1bf177408a4d"
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'] = "sha1=6986874ecdf710b04de7ef5a040161d41687407a"
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'] = "sha1=FOOBAR"
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'] = "sha1=52b582138706ac0c597c315cfc1a1bf177408a4d"
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
@@ -1,7 +1,7 @@
1
1
  ENV['RAILS_ENV'] ||= 'test'
2
2
 
3
- require "codeclimate-test-reporter"
4
- CodeClimate::TestReporter.start
3
+ require 'simplecov'
4
+ SimpleCov.start
5
5
 
6
6
  require "github_webhook"
7
7
 
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.1.0
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: 2017-10-03 00:00:00.000000000 Z
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: '10.1'
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: '10.1'
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: '2.14'
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: '2.14'
82
+ version: '3.9'
97
83
  - !ruby/object:Gem::Dependency
98
- name: codeclimate-test-reporter
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
- - ".travis.yml"
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
- rubyforge_project:
153
- rubygems_version: 2.6.13
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
@@ -1,7 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.4.2
4
- - 2.3.5
5
- addons:
6
- code_climate:
7
- repo_token: 50425d682162d68af0b65bd9e5160da8337d2159fc3ebc00d2a5b14386548ac5
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