is_this_used 0.1.5 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +24 -0
- data/README.md +99 -10
- data/Rakefile +22 -4
- data/docker-compose.yml +39 -0
- data/gemfiles/rails_5.2.gemfile.lock +63 -65
- data/gemfiles/rails_6.0.gemfile.lock +76 -74
- data/gemfiles/rails_6.1.gemfile.lock +79 -77
- data/is_this_used.gemspec +1 -1
- data/lib/generators/is_this_used/migration_generator.rb +5 -0
- data/lib/generators/is_this_used/templates/create_potential_cruft_arguments.rb.erb +12 -0
- data/lib/generators/is_this_used/templates/create_potential_crufts.rb.erb +1 -0
- data/lib/is_this_used/cruft_cleaner.rb +16 -0
- data/lib/is_this_used/cruft_tracker.rb +27 -1
- data/lib/is_this_used/models/potential_cruft.rb +36 -0
- data/lib/is_this_used/models/potential_cruft_argument.rb +7 -0
- data/lib/is_this_used/railtie.rb +15 -0
- data/lib/is_this_used/registry.rb +21 -0
- data/lib/is_this_used/version.rb +1 -1
- data/lib/is_this_used.rb +6 -0
- data/wait-for-it.sh +182 -0
- metadata +15 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7333e18fec859a0754f59c6ae4c7abc28318a6d20397c2ffbc82296f648a8cbd
|
4
|
+
data.tar.gz: 7017a6db53df6f0ef4272fb8c261a49b20afebe7b0cd751642489032ce2a984b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b78237aeeec84048d107a105c65ea685c051dbf468155cd4b06444507d0b5ef19114a50d609f2268cab16fd461515468e0866082a6fad829a30cbe4908b9f4b0
|
7
|
+
data.tar.gz: b9b4701f1d3b36b7f1a9876772f2e0386ac34c861698a7c35095ea1b15d4cd9626fcc1bd191a3be78712234d142a3c07be1672499895d358a7f03d6d307de91b
|
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
|
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
|
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
|
-
|
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
|
-
|
2
|
-
require "rspec/core/rake_task"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
require "fileutils"
|
4
|
+
require "bundler"
|
5
|
+
require './spec/support/is_this_used_spec_migrator'
|
6
|
+
Bundler::GemHelper.install_tasks
|
5
7
|
|
6
|
-
|
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
|
data/docker-compose.yml
ADDED
@@ -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
|
+
is_this_used (0.1.9)
|
5
5
|
activerecord (>= 5.2)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
actioncable (5.2.
|
11
|
-
actionpack (= 5.2.
|
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.
|
15
|
-
actionpack (= 5.2.
|
16
|
-
actionview (= 5.2.
|
17
|
-
activejob (= 5.2.
|
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.
|
21
|
-
actionview (= 5.2.
|
22
|
-
activesupport (= 5.2.
|
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.
|
28
|
-
activesupport (= 5.2.
|
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.
|
34
|
-
activesupport (= 5.2.
|
33
|
+
activejob (5.2.6.2)
|
34
|
+
activesupport (= 5.2.6.2)
|
35
35
|
globalid (>= 0.3.6)
|
36
|
-
activemodel (5.2.
|
37
|
-
activesupport (= 5.2.
|
38
|
-
activerecord (5.2.
|
39
|
-
activemodel (= 5.2.
|
40
|
-
activesupport (= 5.2.
|
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.
|
43
|
-
actionpack (= 5.2.
|
44
|
-
activerecord (= 5.2.
|
45
|
-
marcel (~> 0.
|
46
|
-
activesupport (5.2.
|
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.
|
69
|
+
i18n (1.10.0)
|
70
70
|
concurrent-ruby (~> 1.0)
|
71
|
-
loofah (2.
|
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.
|
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.
|
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.
|
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.
|
102
|
-
actioncable (= 5.2.
|
103
|
-
actionmailer (= 5.2.
|
104
|
-
actionpack (= 5.2.
|
105
|
-
actionview (= 5.2.
|
106
|
-
activejob (= 5.2.
|
107
|
-
activemodel (= 5.2.
|
108
|
-
activerecord (= 5.2.
|
109
|
-
activestorage (= 5.2.
|
110
|
-
activesupport (= 5.2.
|
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.
|
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.
|
120
|
-
actionpack (= 5.2.
|
121
|
-
activesupport (= 5.2.
|
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.
|
125
|
+
regexp_parser (2.2.1)
|
128
126
|
rexml (3.2.5)
|
129
|
-
rspec (3.
|
130
|
-
rspec-core (~> 3.
|
131
|
-
rspec-expectations (~> 3.
|
132
|
-
rspec-mocks (~> 3.
|
133
|
-
rspec-core (3.
|
134
|
-
rspec-support (~> 3.
|
135
|
-
rspec-expectations (3.
|
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.
|
138
|
-
rspec-mocks (3.
|
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.
|
141
|
-
rspec-rails (5.0.
|
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.
|
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.
|
160
|
-
parser (>= 3.
|
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.
|
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
|
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.
|
204
|
+
2.1.4
|