is_this_used 0.1.4 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d781ed2774ddda32adf7b68b87cc0666e6c08de682b07ab2fbec2daa45f02789
4
- data.tar.gz: fd32bc27fa9ece52099e5cc1214394c14753478c7677c70ab04e4b31ca92a3f6
3
+ metadata.gz: 6d99ea88778f65e0685fa42ec856e9a61b5414ad87e1963f21f8d8941ee62eea
4
+ data.tar.gz: 7f5bf7cb77f3688c14035480a1ed16130998f004a6add05afc125bd18f21b6fa
5
5
  SHA512:
6
- metadata.gz: 9da3a8cfda9bc44da06b7732e205d410709a2166568cbaacd8c17020b2960f40cfd2043ea82cd6dc96eb8a37aa7c08ae616669683cde524087b88f6f083fdb3c
7
- data.tar.gz: 8c0ae318620b3808a775c9c9d9301bc942d4426dea9981eba78433e5055d1b1484ddc717b836afdd9b9b12a5921b81cba39d839ee3bb3cb46af8d7a29600b4a9
6
+ metadata.gz: 5e7acfe828e892998c319ca07bc6bc2ff2bf91c5c2e9e65debbb67f7aacd9c07f9561af8e2fc37dfc140f2ade3d97530fcaf5b9e65a5c13b8a15c60320cc0c92
7
+ data.tar.gz: dc4363da4d9030568766e2d37cf2c932f5b5bf35d8c5b20d6587c45f12f3c4953357048155e9664523059da54e4d3f8e534578ebd9bc76d9e601c55bb46888b6
data/Dockerfile ADDED
@@ -0,0 +1,24 @@
1
+ FROM ruby:2.7.5-slim-bullseye
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt-get update -qq \
6
+ && apt-get install --no-install-recommends -y \
7
+ less \
8
+ nano \
9
+ mariadb-client-10.5 \
10
+ libmariadb-dev-compat \
11
+ libmariadb-dev \
12
+ build-essential \
13
+ git \
14
+ shared-mime-info
15
+
16
+ ARG BUNDLER_VERSION=2.1.4
17
+
18
+ ENV BUNDLE_PATH /bundle
19
+ ENV GEM_HOME /bundle
20
+
21
+ RUN gem update --system \
22
+ && gem install bundler -v ${BUNDLER_VERSION}
23
+
24
+ CMD /bin/bash
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Have you ever asked yourself, "Is this method even being used?!" Does your application use ActiveRecord? If the answers
1
+ Have you ever asked yourself, "Is this method even being used?!" Does your application use Rails and ActiveRecord? If the answers
2
2
  to these two questions are yes, this gem may be of use to you!
3
3
 
4
4
  Large applications can accrue cruft; old methods that might once have been important, but are now unused. Unfortunately,
@@ -59,7 +59,6 @@ You're unsure if the `some_old_method` method is actually being used. You only n
59
59
  Here's an example:
60
60
 
61
61
  ```ruby
62
-
63
62
  class SomeOldClass
64
63
  include IsThisUsed::CruftTracker
65
64
 
@@ -74,9 +73,9 @@ end
74
73
  What do you get out of this? Well, as soon as Ruby loads the `SomeOldClass` class, is_this_used will create a new record
75
74
  in the `potential_crufts` table that looks like this:
76
75
 
77
- | id | owner_name | method_name | method_type | invocations | created_at | updated_at |
78
- | --- | ------------ | --------------- | --------------- | ----------- | ------------------- | ------------------- |
79
- | 1 | SomeOldClass | some_old_method | instance_method | 0 | 2022-01-21 14:07:48 | 2022-01-21 14:07:48 |
76
+ | id | owner_name | method_name | method_type | invocations | deleted_at | created_at | updated_at |
77
+ | --- | ------------ | --------------- | --------------- | ----------- | ---------- | ------------------- | ------------------- |
78
+ | 1 | SomeOldClass | some_old_method | instance_method | 0 | null | 2022-01-21 14:07:48 | 2022-01-21 14:07:48 |
80
79
 
81
80
  This is easily accessed using the `IsThisUsed::PotentialCruft` model class.
82
81
 
@@ -88,8 +87,9 @@ The fields are:
88
87
  - `method_type` - This is either "instance_method" or "class_method", which are the values of the corresponding
89
88
  constants, `IsThisUsed::CruftTracker::INSTANCE_METHOD` and `IsThisUsed::CruftTracker::CLASS_METHOD`.
90
89
  - `invocations` - The number of times the method has been invoked.
90
+ - `deleted_at` - When set, this indicates that the method is no longer being tracked.
91
91
  - `created_at` - The date/time we started tracking the method.
92
- - `updated_at` - The last time this record was updated.
92
+ - `updated_at` - The last time this record was updated. IE: the last time the tracked method was invoked.
93
93
 
94
94
  Looking at this, we can see that the `some_old_method` method has never been invoked. This is nice because it means that
95
95
  you can track uses of methods without changing their behavior. A similar record is created for every method you annotate
@@ -98,10 +98,12 @@ with `is_this_used?`.
98
98
  Assuming your production application eagerly loads classes, you should always have records for potentially crufty
99
99
  methods, even if the class itself is never explicitly used.
100
100
 
101
- So, having annotate the method, you can check this table after a while. If you see that there have been zero invocations
101
+ So, having annotated the method, you can check this table after a while. If you see that there have been zero invocations,
102
102
  you have a reasonably good hint that the method may not actually be used. Of course, you should consider that there are
103
103
  some processes that are not run frequently at all, so this gem isn't a panacea. Think before you delete!
104
104
 
105
+ ### Tracking Stacks
106
+
105
107
  In the case that a method _is_ actually invoked, the `invocations` value is incremented and a record is created in
106
108
  the `potential_cruft_stacks` table for each unique invocation stacktrace. This can be used to determine which methods
107
109
  and blocks are responsible for calling the method and are themselves being used. This is the structure of
@@ -113,11 +115,11 @@ the `potential_cruft_stacks` table:
113
115
  - `stack_hash` - This is an MD5 hash of the stack trace for the method's invocation. This is indexed for speedy lookups
114
116
  of stacks.
115
117
  - `stack` - This is a JSON field that stores an array of hashes (more on this in a sec) that is the stack trace for the
116
- method invocation. You can potentially use this to figure out what other methods and blocks involved in calling the
118
+ method invocation. You can potentially use this to figure out what other methods and blocks are involved in calling the
117
119
  not-actually-crufty method.
118
120
  - `occurrences` - This is the number of times the method has been invoked with exactly the same stack.
119
121
  - `created_at` - The date/time we first saw this stack.
120
- - `updated_at` - The last time this saw this stack.
122
+ - `updated_at` - The last time we saw this stack.
121
123
 
122
124
  As a note, if any of the files referenced in the stack are edited sufficiently to change line numbers, the stack will be
123
125
  different and a new record will be created.
@@ -146,7 +148,58 @@ The `label` and `base_label` fields come from Ruby's `Thread::Backtrace::Locatio
146
148
  difference is, as the docs simply say this about `base_label`: "Usually same as label, without decoration". 🤷 Anyhow,
147
149
  it's there if you need it.
148
150
 
149
- The `IsThisUsed::PotentialCruftStack` model is handy for accessing this data.
151
+ ### Tracking Arguments
152
+
153
+ In addition to tracking stacks, you can track details about arguments provided to tracked methods. For example, let's say you have the following method:
154
+
155
+ ```ruby
156
+ def some_old_method(arg1, arg2)
157
+ # do things
158
+ end
159
+ ```
160
+
161
+ Let's say that, for some reason you want to know what arguments are provided to this method. You could add `track_arguments: true` to your `is_this_used?` invocation like so:
162
+
163
+ ```ruby
164
+ is_this_used? :some_old_method, track_arguments: true
165
+ ```
166
+
167
+ Now, as `some_old_method` is invoked, a record will be created in `potential_cruft_arguments` for each unique set of arguments. Similar to `potential_cruft_stacks`, the record contains a hash of the JSON-serialized arguments, the JSON-serialized arguments, and the number of occurrences of the particular combination of arguments.
168
+
169
+ Tracking all arguments might be a really bad idea. Let's say your method actually gets invoked a lot and receives lots of different combinations of arguments, you could be writing a lot of potentially useless information into the `potential_cruft_arguments` table. For this reason arguments are not tracked by default.
170
+
171
+ Instead of tracking all arguments, you can also provide a lambda to `track_arguments` to track only specific details about arguments. The lambda will receive an array of arguments that were provided to the tracked method. Whatever is returned from the lambda is what is tracked in the `potential_cruft_arguments` table. This might be useful in a situation where you have a method that receives an options hash. Maybe you want to know what keys are in that options hash. You could track the unique combination of keys like this:
172
+
173
+ ```ruby
174
+ def ye_olde_method(some_argument, options_hash)
175
+ # do things
176
+ end
177
+
178
+ is_this_used? :some_old_method, track_arguments: ->(args) { args.last.keys.sort }
179
+ ```
180
+
181
+ As `ye_olde_method` is invoked is_this_used will track the unique combination of keys in the `options_hash`. Let's say it's invoked as follows:
182
+
183
+
184
+ ```ruby
185
+ ye_olde_method("Fred", favorite_color: "blue", locality: 'Antartica')
186
+ ye_olde_method("Zelda", locality: 'Hyrule', favorite_color: "green")
187
+ ye_olde_method("Korg", color: 'Rebecca Purple', locality: 'Sakaar')
188
+ ye_olde_method("Liz", status: :favorite_person)
189
+ ```
190
+
191
+ The above would result in the following records in `potential_cruft_arguments` (ignoring the id, potential cruft reference, and timestamps):
192
+
193
+ | arguments_hash | arguments | occurrences |
194
+ | -------------------------------- | ------------------------------ | ----------- |
195
+ | d5d98f761a14b1845a74ce3f1a298c98 | ["favorite_color", "locality"] | 2 |
196
+ | 1619ec6af47253461e87ebf1923a8a83 | ["color", "locality"] | 1 |
197
+ | 88c8205498de97d4ef06b249006bb68b | ["status"] | 1 |
198
+
199
+
200
+
201
+
202
+ ## Models
150
203
 
151
204
  ### `IsThisUsed::PotentialCruft`
152
205
 
@@ -158,8 +211,13 @@ invocations of the method, if any.
158
211
  This is a model representing potential cruft stacks. Its `potential_cruft` method provides an association back to the
159
212
  owning potentially-crufty method.
160
213
 
214
+ ### `IsThisUsed::PotentialCruftArgument`
215
+
216
+ This model represents information about arguments provided to a specific `potential_cruft` method. It is conditionally populated when the `track_arguments` method is provided with either true or a lambda.
217
+
161
218
  ## Dependencies
162
219
 
220
+ * Rails - Versions 5.2, 6, and 6.1 are supported.
163
221
  * ActiveRecord - ActiveRecord is used to persist information about potentially crufty methods. This gem should happily
164
222
  work with AR 5.2, 6, and 6.1.
165
223
  * MySQL - As of now, only MySQL is supported. PRs are welcome to add support for Postgres, etc.
@@ -208,6 +266,37 @@ bundle exec appraisal rails-6.0 rake
208
266
 
209
267
  bundle exec appraisal rails-6.1 rake
210
268
 
269
+ ## Developing with Docker
270
+
271
+ A Docker / docker-compose environment is available to simplify development. Assuming you already have Docker installed, you can spin up a MySQL and open a bash console on a container with Ruby installed like this:
272
+
273
+ ```bash
274
+ docker-compose run --rm ruby bash
275
+ ```
276
+
277
+ The MySQL server has its port exposed as 13306. Note that the first time you spin up these containers it may take a moment for mysql to successfully spin up.
278
+
279
+ The gem's source is mapped to `/app`, which is also the working directory.
280
+
281
+ Once you have a bash console open, you can install dependencies with:
282
+
283
+ ```bash
284
+ bundle install
285
+ bundle exec appraisal install
286
+ ```
287
+
288
+ You can copy the provided MySQL DB config file to be the one to use in the test app:
289
+
290
+ ```bash
291
+ cp spec/dummy_app/config/database.mysql.yml spec/dummy_app/config/database.yml
292
+ ```
293
+
294
+ And now you should be able to run tests against whichever version of Rails you wish, like so:
295
+
296
+ ```bash
297
+ bundle exec appraisal rails-6.1 rake
298
+ ```
299
+
211
300
  ## Contributing
212
301
 
213
302
  Bug reports and pull requests are welcome on GitHub at https://github.com/dhughes/is_this_used.
data/Rakefile CHANGED
@@ -1,6 +1,24 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
3
2
 
4
- RSpec::Core::RakeTask.new(:spec)
3
+ require "fileutils"
4
+ require "bundler"
5
+ require './spec/support/is_this_used_spec_migrator'
6
+ Bundler::GemHelper.install_tasks
5
7
 
6
- task :default => :spec
8
+ desc "Create the database."
9
+ task :create_db do
10
+ ENV['RAILS_ENV'] = 'test'
11
+ system "mysqladmin -f -h #{ENV.fetch('IS_THIS_USED_DB_HOST', 'localhost')} -P #{ENV.fetch('IS_THIS_USED_DB_PORT', 3306)} -u #{ENV.fetch('IS_THIS_USED_DB_USER', 'root')} --password=#{ENV.fetch('IS_THIS_USED_DB_PASSWORD', 'dev')} drop is_this_used_test"
12
+ system "mysqladmin -h #{ENV.fetch('IS_THIS_USED_DB_HOST', 'localhost')} -P #{ENV.fetch('IS_THIS_USED_DB_PORT', 3306)} -u #{ENV.fetch('IS_THIS_USED_DB_USER', 'root')} --password=#{ENV.fetch('IS_THIS_USED_DB_PASSWORD', 'dev')} create is_this_used_test"
13
+
14
+ Bundler.setup
15
+ require 'active_record/railtie'
16
+ require 'is_this_used'
17
+ require 'rspec/rails'
18
+
19
+ require File.expand_path('spec/dummy_app/config/environment', __dir__)
20
+ ::IsThisUsedSpecMigrator.new.migrate
21
+ end
22
+
23
+ desc "Default: run all available test suites"
24
+ task default: :spec
@@ -0,0 +1,39 @@
1
+ version: '3'
2
+ services:
3
+ mysql:
4
+ image: mysql:8
5
+ container_name: square-mysql
6
+ command: --default-authentication-plugin=mysql_native_password
7
+ volumes:
8
+ - db_data:/var/lib/mysql
9
+ environment:
10
+ MYSQL_ROOT_PASSWORD: dev
11
+ MYSQL_DATABASE: is_this_used_test
12
+ ports:
13
+ - "13306:3306"
14
+
15
+ ruby:
16
+ build:
17
+ context: .
18
+ dockerfile: ./Dockerfile
19
+ depends_on:
20
+ - mysql
21
+ working_dir: /app
22
+ volumes:
23
+ - .:/app
24
+ - bundle:/bundle
25
+ - ./wait-for-it.sh:/usr/sbin/wait-for-it.sh:ro
26
+ environment:
27
+ - IS_THIS_USED_DATABASE=is_this_used_test
28
+ - IS_THIS_USED_DB_USER=root
29
+ - IS_THIS_USED_DB_HOST=mysql
30
+ - IS_THIS_USED_DB_PASSWORD=dev
31
+ links:
32
+ - mysql
33
+ tty: true
34
+ stdin_open: true
35
+
36
+ volumes:
37
+ db_data:
38
+ bundle:
39
+
@@ -1,49 +1,49 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- is_this_used (0.1.4)
4
+ is_this_used (0.1.7)
5
5
  activerecord (>= 5.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (5.2.4.6)
11
- actionpack (= 5.2.4.6)
10
+ actioncable (5.2.6.2)
11
+ actionpack (= 5.2.6.2)
12
12
  nio4r (~> 2.0)
13
13
  websocket-driver (>= 0.6.1)
14
- actionmailer (5.2.4.6)
15
- actionpack (= 5.2.4.6)
16
- actionview (= 5.2.4.6)
17
- activejob (= 5.2.4.6)
14
+ actionmailer (5.2.6.2)
15
+ actionpack (= 5.2.6.2)
16
+ actionview (= 5.2.6.2)
17
+ activejob (= 5.2.6.2)
18
18
  mail (~> 2.5, >= 2.5.4)
19
19
  rails-dom-testing (~> 2.0)
20
- actionpack (5.2.4.6)
21
- actionview (= 5.2.4.6)
22
- activesupport (= 5.2.4.6)
20
+ actionpack (5.2.6.2)
21
+ actionview (= 5.2.6.2)
22
+ activesupport (= 5.2.6.2)
23
23
  rack (~> 2.0, >= 2.0.8)
24
24
  rack-test (>= 0.6.3)
25
25
  rails-dom-testing (~> 2.0)
26
26
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (5.2.4.6)
28
- activesupport (= 5.2.4.6)
27
+ actionview (5.2.6.2)
28
+ activesupport (= 5.2.6.2)
29
29
  builder (~> 3.1)
30
30
  erubi (~> 1.4)
31
31
  rails-dom-testing (~> 2.0)
32
32
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
- activejob (5.2.4.6)
34
- activesupport (= 5.2.4.6)
33
+ activejob (5.2.6.2)
34
+ activesupport (= 5.2.6.2)
35
35
  globalid (>= 0.3.6)
36
- activemodel (5.2.4.6)
37
- activesupport (= 5.2.4.6)
38
- activerecord (5.2.4.6)
39
- activemodel (= 5.2.4.6)
40
- activesupport (= 5.2.4.6)
36
+ activemodel (5.2.6.2)
37
+ activesupport (= 5.2.6.2)
38
+ activerecord (5.2.6.2)
39
+ activemodel (= 5.2.6.2)
40
+ activesupport (= 5.2.6.2)
41
41
  arel (>= 9.0)
42
- activestorage (5.2.4.6)
43
- actionpack (= 5.2.4.6)
44
- activerecord (= 5.2.4.6)
45
- marcel (~> 0.3.1)
46
- activesupport (5.2.4.6)
42
+ activestorage (5.2.6.2)
43
+ actionpack (= 5.2.6.2)
44
+ activerecord (= 5.2.6.2)
45
+ marcel (~> 1.0.0)
46
+ activesupport (5.2.6.2)
47
47
  concurrent-ruby (~> 1.0, >= 1.0.2)
48
48
  i18n (>= 0.7, < 2)
49
49
  minitest (~> 5.1)
@@ -66,27 +66,25 @@ GEM
66
66
  railties (>= 3.0.0)
67
67
  globalid (1.0.0)
68
68
  activesupport (>= 5.0)
69
- i18n (1.8.11)
69
+ i18n (1.10.0)
70
70
  concurrent-ruby (~> 1.0)
71
- loofah (2.13.0)
71
+ loofah (2.14.0)
72
72
  crass (~> 1.0.2)
73
73
  nokogiri (>= 1.5.9)
74
74
  mail (2.7.1)
75
75
  mini_mime (>= 0.1.1)
76
- marcel (0.3.3)
77
- mimemagic (~> 0.3.2)
76
+ marcel (1.0.2)
78
77
  method_source (1.0.0)
79
- mimemagic (0.3.10)
80
- nokogiri (~> 1)
81
- rake
82
78
  mini_mime (1.1.2)
79
+ mini_portile2 (2.8.0)
83
80
  minitest (5.15.0)
84
81
  mysql2 (0.5.3)
85
82
  nio4r (2.5.8)
86
- nokogiri (1.13.1-x86_64-darwin)
83
+ nokogiri (1.13.3)
84
+ mini_portile2 (~> 2.8.0)
87
85
  racc (~> 1.4)
88
86
  parallel (1.21.0)
89
- parser (3.1.0.0)
87
+ parser (3.1.1.0)
90
88
  ast (~> 2.4.1)
91
89
  pry (0.13.1)
92
90
  coderay (~> 1.1)
@@ -98,47 +96,47 @@ GEM
98
96
  rack (2.2.3)
99
97
  rack-test (1.1.0)
100
98
  rack (>= 1.0, < 3)
101
- rails (5.2.4.6)
102
- actioncable (= 5.2.4.6)
103
- actionmailer (= 5.2.4.6)
104
- actionpack (= 5.2.4.6)
105
- actionview (= 5.2.4.6)
106
- activejob (= 5.2.4.6)
107
- activemodel (= 5.2.4.6)
108
- activerecord (= 5.2.4.6)
109
- activestorage (= 5.2.4.6)
110
- activesupport (= 5.2.4.6)
99
+ rails (5.2.6.2)
100
+ actioncable (= 5.2.6.2)
101
+ actionmailer (= 5.2.6.2)
102
+ actionpack (= 5.2.6.2)
103
+ actionview (= 5.2.6.2)
104
+ activejob (= 5.2.6.2)
105
+ activemodel (= 5.2.6.2)
106
+ activerecord (= 5.2.6.2)
107
+ activestorage (= 5.2.6.2)
108
+ activesupport (= 5.2.6.2)
111
109
  bundler (>= 1.3.0)
112
- railties (= 5.2.4.6)
110
+ railties (= 5.2.6.2)
113
111
  sprockets-rails (>= 2.0.0)
114
112
  rails-dom-testing (2.0.3)
115
113
  activesupport (>= 4.2.0)
116
114
  nokogiri (>= 1.6)
117
115
  rails-html-sanitizer (1.4.2)
118
116
  loofah (~> 2.3)
119
- railties (5.2.4.6)
120
- actionpack (= 5.2.4.6)
121
- activesupport (= 5.2.4.6)
117
+ railties (5.2.6.2)
118
+ actionpack (= 5.2.6.2)
119
+ activesupport (= 5.2.6.2)
122
120
  method_source
123
121
  rake (>= 0.8.7)
124
122
  thor (>= 0.19.0, < 2.0)
125
123
  rainbow (3.1.1)
126
124
  rake (10.5.0)
127
- regexp_parser (2.2.0)
125
+ regexp_parser (2.2.1)
128
126
  rexml (3.2.5)
129
- rspec (3.10.0)
130
- rspec-core (~> 3.10.0)
131
- rspec-expectations (~> 3.10.0)
132
- rspec-mocks (~> 3.10.0)
133
- rspec-core (3.10.1)
134
- rspec-support (~> 3.10.0)
135
- rspec-expectations (3.10.2)
127
+ rspec (3.11.0)
128
+ rspec-core (~> 3.11.0)
129
+ rspec-expectations (~> 3.11.0)
130
+ rspec-mocks (~> 3.11.0)
131
+ rspec-core (3.11.0)
132
+ rspec-support (~> 3.11.0)
133
+ rspec-expectations (3.11.0)
136
134
  diff-lcs (>= 1.2.0, < 2.0)
137
- rspec-support (~> 3.10.0)
138
- rspec-mocks (3.10.2)
135
+ rspec-support (~> 3.11.0)
136
+ rspec-mocks (3.11.0)
139
137
  diff-lcs (>= 1.2.0, < 2.0)
140
- rspec-support (~> 3.10.0)
141
- rspec-rails (5.0.2)
138
+ rspec-support (~> 3.11.0)
139
+ rspec-rails (5.0.3)
142
140
  actionpack (>= 5.2)
143
141
  activesupport (>= 5.2)
144
142
  railties (>= 5.2)
@@ -146,7 +144,7 @@ GEM
146
144
  rspec-expectations (~> 3.10)
147
145
  rspec-mocks (~> 3.10)
148
146
  rspec-support (~> 3.10)
149
- rspec-support (3.10.3)
147
+ rspec-support (3.11.0)
150
148
  rubocop (1.22.3)
151
149
  parallel (~> 1.10)
152
150
  parser (>= 3.0.0.0)
@@ -156,8 +154,8 @@ GEM
156
154
  rubocop-ast (>= 1.12.0, < 2.0)
157
155
  ruby-progressbar (~> 1.7)
158
156
  unicode-display_width (>= 1.4.0, < 3.0)
159
- rubocop-ast (1.15.1)
160
- parser (>= 3.0.1.1)
157
+ rubocop-ast (1.16.0)
158
+ parser (>= 3.1.1.0)
161
159
  rubocop-rails (2.12.4)
162
160
  activesupport (>= 4.2.0)
163
161
  rack (>= 1.1)
@@ -167,7 +165,7 @@ GEM
167
165
  rubocop-rspec (2.5.0)
168
166
  rubocop (~> 1.19)
169
167
  ruby-progressbar (1.11.0)
170
- sprockets (4.0.2)
168
+ sprockets (4.0.3)
171
169
  concurrent-ruby (~> 1.0)
172
170
  rack (> 1, < 3)
173
171
  sprockets-rails (3.4.2)
@@ -188,7 +186,7 @@ PLATFORMS
188
186
 
189
187
  DEPENDENCIES
190
188
  appraisal (~> 2.4.1)
191
- bundler (~> 1.17)
189
+ bundler (~> 2.1)
192
190
  generator_spec (~> 0.9.4)
193
191
  is_this_used!
194
192
  mysql2 (~> 0.5.3)
@@ -203,4 +201,4 @@ DEPENDENCIES
203
201
  rubocop-rspec (~> 2.5.0)
204
202
 
205
203
  BUNDLED WITH
206
- 1.17.2
204
+ 2.1.4