influx_reporter 1.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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +51 -0
  5. data/.travis.yml +42 -0
  6. data/.yardopts +3 -0
  7. data/Dockerfile +9 -0
  8. data/Gemfile +7 -0
  9. data/HISTORY.md +1 -0
  10. data/LICENSE +14 -0
  11. data/README.md +189 -0
  12. data/Rakefile +27 -0
  13. data/gemfiles/Gemfile.base +29 -0
  14. data/gemfiles/Gemfile.rails-3.2.x +4 -0
  15. data/gemfiles/Gemfile.rails-4.0.x +4 -0
  16. data/gemfiles/Gemfile.rails-4.1.x +4 -0
  17. data/gemfiles/Gemfile.rails-4.2.x +5 -0
  18. data/gemfiles/Gemfile.rails-5.0.x +5 -0
  19. data/gemfiles/Gemfile.rails-HEAD +7 -0
  20. data/influx_reporter.gemspec +26 -0
  21. data/lib/influx_reporter.rb +142 -0
  22. data/lib/influx_reporter/client.rb +306 -0
  23. data/lib/influx_reporter/configuration.rb +88 -0
  24. data/lib/influx_reporter/data_builders.rb +18 -0
  25. data/lib/influx_reporter/data_builders/error.rb +52 -0
  26. data/lib/influx_reporter/data_builders/transactions.rb +120 -0
  27. data/lib/influx_reporter/error.rb +7 -0
  28. data/lib/influx_reporter/error_message.rb +85 -0
  29. data/lib/influx_reporter/error_message/exception.rb +14 -0
  30. data/lib/influx_reporter/error_message/http.rb +73 -0
  31. data/lib/influx_reporter/error_message/stacktrace.rb +76 -0
  32. data/lib/influx_reporter/error_message/user.rb +25 -0
  33. data/lib/influx_reporter/filter.rb +66 -0
  34. data/lib/influx_reporter/http_client.rb +140 -0
  35. data/lib/influx_reporter/influx_db_client.rb +74 -0
  36. data/lib/influx_reporter/injections.rb +89 -0
  37. data/lib/influx_reporter/injections/json.rb +21 -0
  38. data/lib/influx_reporter/injections/net_http.rb +50 -0
  39. data/lib/influx_reporter/injections/redis.rb +25 -0
  40. data/lib/influx_reporter/injections/sequel.rb +37 -0
  41. data/lib/influx_reporter/injections/sinatra.rb +59 -0
  42. data/lib/influx_reporter/integration/delayed_job.rb +30 -0
  43. data/lib/influx_reporter/integration/rails/inject_exceptions_catcher.rb +25 -0
  44. data/lib/influx_reporter/integration/railtie.rb +56 -0
  45. data/lib/influx_reporter/integration/resque.rb +18 -0
  46. data/lib/influx_reporter/integration/sidekiq.rb +130 -0
  47. data/lib/influx_reporter/line_cache.rb +21 -0
  48. data/lib/influx_reporter/logging.rb +39 -0
  49. data/lib/influx_reporter/middleware.rb +63 -0
  50. data/lib/influx_reporter/normalizers.rb +65 -0
  51. data/lib/influx_reporter/normalizers/action_controller.rb +34 -0
  52. data/lib/influx_reporter/normalizers/action_view.rb +72 -0
  53. data/lib/influx_reporter/normalizers/active_record.rb +45 -0
  54. data/lib/influx_reporter/sql_summarizer.rb +31 -0
  55. data/lib/influx_reporter/subscriber.rb +80 -0
  56. data/lib/influx_reporter/tasks.rb +28 -0
  57. data/lib/influx_reporter/trace.rb +48 -0
  58. data/lib/influx_reporter/trace_helpers.rb +31 -0
  59. data/lib/influx_reporter/transaction.rb +114 -0
  60. data/lib/influx_reporter/util.rb +18 -0
  61. data/lib/influx_reporter/util/constantize.rb +56 -0
  62. data/lib/influx_reporter/util/inspector.rb +72 -0
  63. data/lib/influx_reporter/util/timestamp.rb +11 -0
  64. data/lib/influx_reporter/version.rb +5 -0
  65. data/lib/influx_reporter/worker.rb +56 -0
  66. data/spec/influx_reporter/client_spec.rb +264 -0
  67. data/spec/influx_reporter/configuration_spec.rb +42 -0
  68. data/spec/influx_reporter/data_builders/error_spec.rb +40 -0
  69. data/spec/influx_reporter/data_builders/transactions_spec.rb +48 -0
  70. data/spec/influx_reporter/error_message/exception_spec.rb +22 -0
  71. data/spec/influx_reporter/error_message/http_spec.rb +55 -0
  72. data/spec/influx_reporter/error_message/stacktrace_spec.rb +56 -0
  73. data/spec/influx_reporter/error_message/user_spec.rb +26 -0
  74. data/spec/influx_reporter/error_message_spec.rb +102 -0
  75. data/spec/influx_reporter/filter_spec.rb +33 -0
  76. data/spec/influx_reporter/injections/net_http_spec.rb +35 -0
  77. data/spec/influx_reporter/injections/sequel_spec.rb +33 -0
  78. data/spec/influx_reporter/injections/sinatra_spec.rb +13 -0
  79. data/spec/influx_reporter/injections_spec.rb +50 -0
  80. data/spec/influx_reporter/integration/delayed_job_spec.rb +37 -0
  81. data/spec/influx_reporter/integration/json_spec.rb +41 -0
  82. data/spec/influx_reporter/integration/rails_spec.rb +92 -0
  83. data/spec/influx_reporter/integration/redis_spec.rb +20 -0
  84. data/spec/influx_reporter/integration/resque_spec.rb +42 -0
  85. data/spec/influx_reporter/integration/sidekiq_spec.rb +40 -0
  86. data/spec/influx_reporter/integration/sinatra_spec.rb +99 -0
  87. data/spec/influx_reporter/line_cache_spec.rb +38 -0
  88. data/spec/influx_reporter/logging_spec.rb +49 -0
  89. data/spec/influx_reporter/middleware_spec.rb +32 -0
  90. data/spec/influx_reporter/normalizers/action_controller_spec.rb +37 -0
  91. data/spec/influx_reporter/normalizers/action_view_spec.rb +78 -0
  92. data/spec/influx_reporter/normalizers/active_record_spec.rb +70 -0
  93. data/spec/influx_reporter/normalizers_spec.rb +16 -0
  94. data/spec/influx_reporter/sql_summarizer_spec.rb +35 -0
  95. data/spec/influx_reporter/subscriber_spec.rb +83 -0
  96. data/spec/influx_reporter/trace_spec.rb +43 -0
  97. data/spec/influx_reporter/transaction_spec.rb +98 -0
  98. data/spec/influx_reporter/util/inspector_spec.rb +41 -0
  99. data/spec/influx_reporter/util_spec.rb +20 -0
  100. data/spec/influx_reporter/worker_spec.rb +54 -0
  101. data/spec/influx_reporter_spec.rb +50 -0
  102. data/spec/spec_helper.rb +86 -0
  103. metadata +188 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1b0c481adf3b258ec29fc1a2a526d2d4053fbb50
4
+ data.tar.gz: f1fce2792f3ff3b7be73160c81aa9ce05dbd81d7
5
+ SHA512:
6
+ metadata.gz: 345a3d341374f25b18ceed08ffd6ca770019e05b43c5391b716aec17ae3c63eb95af2287fa69e65a078feae930f2a6d4fc84be441b40143ead5df96e5a4d18cf
7
+ data.tar.gz: 54528657a0b66f92a36392f5dd768efd5137997ec8f1a1dc84d4174ec0982a320ca157000d594ff2a7cfa9fd186e100e5a221c2c50cba32e90f3101c74b155f4
@@ -0,0 +1,7 @@
1
+ doc
2
+ coverage
3
+ Gemfile.lock
4
+ influx_reporter*.gem
5
+ .yardoc
6
+ profile-*
7
+ pkg
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format documentation
@@ -0,0 +1,51 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+ TargetRailsVersion: 4.2
4
+ Exclude:
5
+ - 'Dangerfile'
6
+ - 'vendor/**.rb'
7
+ Layout/AlignParameters:
8
+ EnforcedStyle: with_fixed_indentation
9
+ IndentationWidth: 4
10
+ Layout/CaseIndentation:
11
+ EnforcedStyle: end
12
+ IndentOneStep: true
13
+ # Enabled: false
14
+ Layout/FirstParameterIndentation:
15
+ IndentationWidth: 4
16
+ Layout/IndentHash:
17
+ IndentationWidth: 4
18
+ Layout/MultilineMethodCallIndentation:
19
+ IndentationWidth: 4
20
+ EnforcedStyle: indented_relative_to_receiver
21
+ Style/Alias:
22
+ EnforcedStyle: prefer_alias_method
23
+ Style/EmptyElse:
24
+ EnforcedStyle: empty
25
+ Style/FormatStringToken:
26
+ EnforcedStyle: template
27
+ Metrics/LineLength:
28
+ Max: 180
29
+ Metrics/ClassLength:
30
+ Max: 150
31
+ Metrics/CyclomaticComplexity:
32
+ Max: 7
33
+ Metrics/MethodLength:
34
+ Max: 20
35
+ Metrics/ModuleLength:
36
+ Max: 150
37
+ Metrics/ParameterLists:
38
+ Max: 5
39
+ CountKeywordArgs: true
40
+ Metrics/PerceivedComplexity:
41
+ Max: 8
42
+ Metrics/AbcSize:
43
+ Max: 17
44
+ Metrics/BlockLength:
45
+ ExcludedMethods:
46
+ - context
47
+ - describe
48
+ - namespace
49
+ - resources
50
+ - it
51
+ - configure
@@ -0,0 +1,42 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ env:
5
+ - CI=true
6
+ before_install:
7
+ - gem install bundler
8
+ rvm:
9
+ - 2.0.0
10
+ - 2.1.6
11
+ - 2.2.3
12
+ - 2.3.3
13
+ - 2.4.0
14
+ gemfile:
15
+ - gemfiles/Gemfile.rails-3.2.x
16
+ - gemfiles/Gemfile.rails-4.0.x
17
+ - gemfiles/Gemfile.rails-4.1.x
18
+ - gemfiles/Gemfile.rails-4.2.x
19
+ - gemfiles/Gemfile.rails-5.0.x
20
+ matrix:
21
+ include:
22
+ - rvm: 2.3.3
23
+ gemfile: gemfiles/Gemfile.rails-HEAD
24
+
25
+ exclude:
26
+ - rvm: 2.0.0
27
+ gemfile: gemfiles/Gemfile.rails-5.0.x
28
+ - rvm: 2.1.6
29
+ gemfile: gemfiles/Gemfile.rails-5.0.x
30
+ - rvm: 2.4.0
31
+ gemfile: gemfiles/Gemfile.rails-3.2.x
32
+ - rvm: 2.4.0
33
+ gemfile: gemfiles/Gemfile.rails-4.0.x
34
+ - rvm: 2.4.0
35
+ gemfile: gemfiles/Gemfile.rails-4.1.x
36
+ - rvm: 2.4.0
37
+ gemfile: gemfiles/Gemfile.rails-4.2.x
38
+
39
+ notifications:
40
+ email: false
41
+ slack:
42
+ secure: IniiL3PdFsht2zykTwd/z5Et/L1U6GzsmMC1LrgccKCrvLsdcdlBU3VrAgIb1GT9FPEFpb5sl7FEBN80p6uW15uO57onUawFaSWDhSA3eXG1ImmunVPJ20U4NkJvMbnUdZXQ9XXqOw1ggkR7GrD0PM9Nzr4puWaaGq42UJjdaq0=
@@ -0,0 +1,3 @@
1
+ --hide-api private
2
+ --exclude lib/influx_reporter/integration
3
+ lib/**/*.rb
@@ -0,0 +1,9 @@
1
+ FROM ruby:alpine
2
+
3
+ RUN apk upgrade --update && \
4
+ apk add --no-cache git libffi build-base zlib g++ ncurses readline yaml sqlite-dev ca-certificates \
5
+ tzdata libxml2-dev && \
6
+ mkdir -p /app
7
+ WORKDIR /app
8
+ COPY . /app/
9
+ RUN bundle install
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ eval_gemfile 'gemfiles/Gemfile.rails-5.0.x'
4
+
5
+ gem 'pry'
6
+ gem 'ruby-debug-ide'
7
+ gem 'debase'
@@ -0,0 +1 @@
1
+ # 1.0.0
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2018, GenieBelt ApS
2
+ All rights reserved.
3
+
4
+ Library use code copyrighted by Opbeat Inc.
5
+
6
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
11
+
12
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,189 @@
1
+ ## Installation
2
+
3
+ Add the following to your `Gemfile`:
4
+
5
+ ```ruby
6
+ gem 'influx_reporter', '~> 1.0.0'
7
+ ```
8
+
9
+ The InfluxReporter gem adheres to [Semantic
10
+ Versioning](http://guides.rubygems.org/patterns/#semantic-versioning)
11
+ and so you can safely trust all minor and patch versions (e.g. 1.x.x) to
12
+ be backwards compatible.
13
+
14
+ ## Usage
15
+
16
+ ### Rails 3/4/5
17
+
18
+ Add the following to your `config/environments/production.rb`:
19
+
20
+ ```ruby
21
+ Rails.application.configure do |config|
22
+ # ...
23
+ config.influx_reporter.database = 'endpoints'
24
+ config.influx_reporter.influx_db = {
25
+ host: 'influxdb.local',
26
+ port: '8080'
27
+ }
28
+ ```
29
+
30
+ ### Rack
31
+
32
+ ```ruby
33
+ require 'influx_reporter'
34
+
35
+ # set up an InfluxReporter configuration
36
+ config = InfluxReporter::Configuration.new do |conf|
37
+ conf.influx_reporter.database = 'endpoints'
38
+ conf.influx_reporter.influx_db = {
39
+ host: 'influxdb.local',
40
+ port: '8080'
41
+ }
42
+ conf.tags = {
43
+ environment: ENV['RACK_ENV']
44
+ }
45
+ end
46
+
47
+ # start the InfluxReporter client
48
+ InfluxReporter.start! config
49
+
50
+ # install the InfluxReporter middleware
51
+ use InfluxReporter::Middleware
52
+
53
+ ```
54
+
55
+ ## Configuration
56
+
57
+ InfluxReporter works with just the InfluxDB host configuration.
58
+
59
+ #### Enable in development and other environments
60
+
61
+ As a default InfluxReporter only runs in production. You can make it run in other environments by adding them to the `enabled_environments` whitelist.
62
+
63
+ ```ruby
64
+ config.influx_reporter.enabled_environments += %w{development}
65
+ ```
66
+
67
+ #### Ignore specific exceptions
68
+
69
+ ```ruby
70
+ config.influx_reporter.excluded_exceptions += %w{
71
+ ActiveRecord::RecordNotFound
72
+ ActionController::RoutingError
73
+ }
74
+ ```
75
+
76
+ ### Sanitizing data
77
+
78
+ InfluxReporter can strip certain data points from the reports it sends like passwords or other sensitive information. If you're on Rails the list will automatically include what you have in `config.filter_parameters`.
79
+
80
+ Add or modify the list using the `filter_parameters` configuration:
81
+
82
+ ```ruby
83
+ config.influx_reporter.filter_parameters += [/regex(p)?/, "string", :symbol]
84
+ ```
85
+
86
+ ### User information
87
+
88
+ InfluxReporter can automatically add user information to errors. By default it looks for at method called `current_user` on the current controller. To change the method use `current_user_method`.
89
+
90
+ ```ruby
91
+ config.influx_reporter.current_user_method = :current_employee
92
+ ```
93
+
94
+ ### Error context
95
+
96
+ You may specify extra context for errors ahead of time by using `InfluxReporter.set_context` eg:
97
+
98
+ ```ruby
99
+ class DashboardController < ApplicationController
100
+ before_action do
101
+ InfluxReporter.set_context(tags: { timezone: current_user.timezone }, values: { my_value: 11 })
102
+ end
103
+ end
104
+ ```
105
+
106
+ or by specifying it as a block using `InfluxReporter.with_context` eg:
107
+
108
+ ```ruby
109
+ InfluxReporter.with_context(values: { user_id: @user.id }) do
110
+ UserMailer.welcome_email(@user).deliver_now
111
+ end
112
+ ```
113
+
114
+ ### Transaction context
115
+ You may specify extra context for performance transaction
116
+
117
+ ```ruby
118
+ InfluxReporter.client&.current_transaction&.extra_tags do |tags|
119
+ tags[:locale] = I18n.locale
120
+ end
121
+ InfluxReporter.client&.current_transaction&.extra_values do |values|
122
+ values[:uuid] = request.uuid
123
+ end
124
+ ```
125
+
126
+
127
+ ## Background processing
128
+
129
+ InfluxReporter automatically catches exceptions in [delayed_job](https://github.com/collectiveidea/delayed_job) or [sidekiq](http://sidekiq.org/).
130
+
131
+ To enable InfluxReporter for [resque](https://github.com/resque/resque), add the following (for example in `config/initializers/influx_reporter_resque.rb`):
132
+
133
+ ```ruby
134
+ require "resque/failure/multiple"
135
+ require "influx_reporter/integration/resque"
136
+
137
+ Resque::Failure::Multiple.classes = [InfluxReporter::Integration::Resque]
138
+ Resque::Failure.backend = Resque::Failure::Multiple
139
+ ```
140
+
141
+ ## Manual profiling
142
+
143
+ It's easy to add performance tracking wherever you want using the `InfluxReporter` module.
144
+
145
+ Basically you have to know about two concepts: `Transaction` and `Trace`.
146
+
147
+ **Transactions** are a bundles of transactions. In a typical webapp every request is wrapped in a transaction. If you're instrumenting worker jobs, a single job run would be a transaction.
148
+
149
+ **Traces** are spans of time that happen during a transaction. Like a call to the database, a render of a view or a HTTP request. InfluxReporter will automatically trace the libraries that it knows of and you can manually trace whatever else you'd like to.
150
+
151
+ The basic api looks like this:
152
+
153
+ ```ruby
154
+ InfluxReporter.transaction "Transaction identifier" do
155
+ data = InfluxReporter.trace "Preparation" do
156
+ prepare_data
157
+ end
158
+ InfluxReporter.trace "Description", "kind" do
159
+ perform_expensive_task data
160
+ end
161
+ end.done(200)
162
+ ```
163
+
164
+ If you are inside a web request, you are already inside a transaction so you only need to use trace:
165
+
166
+ ```ruby
167
+ class UsersController < ApplicationController
168
+
169
+ def extend_profiles
170
+ users = User.all
171
+
172
+ InfluxReporter.trace "prepare users" do
173
+ users.each { |user| user.extend_profile! }
174
+ end
175
+
176
+ render text: 'ok'
177
+ end
178
+
179
+ end
180
+ ```
181
+
182
+ ## Testing and development
183
+
184
+ ```bash
185
+ $ bundle install
186
+ $ rspec spec
187
+ ```
188
+
189
+ ## Resources
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems/package_task'
4
+ gemspec = Gem::Specification.load(Dir['*.gemspec'].first)
5
+ Gem::PackageTask.new(gemspec).define
6
+
7
+ require 'rspec/core/rake_task'
8
+ RSpec::Core::RakeTask.new(:spec) do |spec|
9
+ spec.pattern = 'spec/**/*_spec.rb'
10
+ end
11
+ task default: :spec
12
+
13
+ require 'yard'
14
+ YARD::Rake::YardocTask.new
15
+
16
+ task :mem_profile do
17
+ require 'memory_profiler'
18
+ $LOAD_PATH.unshift Dir.pwd + '/lib'
19
+
20
+ filename = "profile-#{Time.now.to_i}.txt"
21
+
22
+ MemoryProfiler.report(allow_files: /influx_reporter/i) do
23
+ require 'influx_reporter'
24
+ end.pretty_print(to_file: filename)
25
+
26
+ filename
27
+ end
@@ -0,0 +1,29 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec path: File.expand_path('../..', __FILE__)
4
+
5
+ ruby RUBY_VERSION
6
+
7
+ gem 'rake'
8
+ gem 'rspec'
9
+ gem 'timecop'
10
+ gem 'webmock'
11
+ gem 'rack-test'
12
+
13
+ gem 'yard'
14
+ gem 'simplecov'
15
+
16
+ # external libs
17
+
18
+ gem 'redis'
19
+ gem 'fakeredis'
20
+ gem 'sqlite3', platform: :mri
21
+ gem 'sequel'
22
+
23
+ gem 'delayed_job', require: false
24
+ gem 'resque', require: false
25
+
26
+ # Freeze Sidekiq to < 5 in Ruby 2.2 Gemfiles
27
+ if RUBY_VERSION >= '2'
28
+ gem 'sidekiq', (RUBY_VERSION >= '2.2.2' ? '~> 5' : '~> 4'), require: false
29
+ end
@@ -0,0 +1,4 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rails', '~> 3.2.0'
4
+ gem 'sinatra'
@@ -0,0 +1,4 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rails', '~> 4.0.0'
4
+ gem 'sinatra'
@@ -0,0 +1,4 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rails', '~> 4.1.0'
4
+ gem 'sinatra'
@@ -0,0 +1,5 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+ gem 'nokogiri', '< 1.7'
5
+ gem 'sinatra'
@@ -0,0 +1,5 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rails', '~> 5.0.0'
4
+ gem 'tzinfo-data'
5
+ gem 'sinatra'
@@ -0,0 +1,7 @@
1
+ eval_gemfile File.expand_path('../Gemfile.base', __FILE__)
2
+
3
+ gem 'rack', git: 'https://github.com/rack/rack.git'
4
+ gem 'arel', git: 'https://github.com/rails/arel.git'
5
+ gem 'rails', git: 'https://github.com/rails/rails.git'
6
+ gem 'sinatra', git: 'https://github.com/sinatra/sinatra.git'
7
+