rspec_profiling 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE/bug.yml +66 -0
- data/.github/ISSUE_TEMPLATE/config.yml +1 -0
- data/.github/ISSUE_TEMPLATE/docs.yml +18 -0
- data/.github/ISSUE_TEMPLATE/feature-request.yml +36 -0
- data/.github/ISSUE_TEMPLATE/question-support.yml +18 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- data/.github/dependabot.yaml +20 -0
- data/.github/workflows/auto-assign-author.yaml +13 -0
- data/.github/workflows/codeql.yaml +43 -0
- data/.github/workflows/release.yaml +40 -0
- data/.github/workflows/stale.yaml +38 -0
- data/.github/workflows/test.yaml +54 -0
- data/.gitignore +3 -0
- data/.ruby-version +1 -1
- data/CODE_OF_CONDUCT.md +130 -0
- data/CONTRIBUTING.md +37 -0
- data/EMERITUS.md +3 -0
- data/{LICENSE.txt → LICENSE.md} +2 -1
- data/Makefile +60 -0
- data/README.md +61 -19
- data/SECURITY.md +20 -0
- data/docker-compose.yml +13 -0
- data/lib/rspec_profiling/collectors/csv.rb +30 -7
- data/lib/rspec_profiling/collectors/json.rb +70 -0
- data/lib/rspec_profiling/collectors/psql.rb +1 -1
- data/lib/rspec_profiling/collectors/sql.rb +1 -1
- data/lib/rspec_profiling/config.rb +4 -2
- data/lib/rspec_profiling/example.rb +23 -1
- data/lib/rspec_profiling/rspec.rb +1 -1
- data/lib/rspec_profiling/run.rb +33 -5
- data/lib/rspec_profiling/vcs/git.rb +1 -1
- data/lib/rspec_profiling/version.rb +1 -1
- data/lib/rspec_profiling.rb +14 -2
- data/rspec_profiling.gemspec +9 -6
- metadata +45 -35
- data/.ruby-gemset +0 -1
- data/rspec_profiling +0 -0
- data/spec/collectors/psql_spec.rb +0 -90
- data/spec/collectors/sql_spec.rb +0 -90
- data/spec/run_spec.rb +0 -151
- data/spec/vcs/git_spec.rb +0 -27
- data/spec/vcs/svn_spec.rb +0 -25
data/README.md
CHANGED
@@ -5,6 +5,7 @@ with interesting attributes. For example, find the slowest specs, or the
|
|
5
5
|
spec which issues the most queries.
|
6
6
|
|
7
7
|
Collected attributes include:
|
8
|
+
|
8
9
|
- git commit SHA (or SVN revision) and date
|
9
10
|
- example file, line number and description
|
10
11
|
- example status (i.e. passed or failed)
|
@@ -21,29 +22,36 @@ RspecProfiling should work with Rails >= 3.2 and RSpec >= 2.14.
|
|
21
22
|
|
22
23
|
Add this line to your application's Gemfile:
|
23
24
|
|
24
|
-
```
|
25
|
+
```ruby
|
25
26
|
gem 'rspec_profiling'
|
26
27
|
```
|
27
28
|
|
28
29
|
And then execute:
|
29
30
|
|
30
|
-
```
|
31
|
+
```bash
|
31
32
|
bundle
|
32
33
|
```
|
33
34
|
|
34
35
|
Require the gem to your `spec_helper.rb`.
|
35
36
|
|
36
|
-
```
|
37
|
+
```ruby
|
37
38
|
require "rspec_profiling/rspec"
|
38
39
|
```
|
39
40
|
|
40
41
|
Lastly, run the installation rake tasks to initialize an empty database in
|
41
42
|
which results will be collected.
|
42
43
|
|
43
|
-
```
|
44
|
+
```bash
|
44
45
|
bundle exec rake rspec_profiling:install
|
45
46
|
```
|
46
47
|
|
48
|
+
If you are planning on using `sqlite` or `pg` ensure to add the dependency to your gemfile
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
gem 'sqlite', require: false
|
52
|
+
gem 'pg', require: false
|
53
|
+
```
|
54
|
+
|
47
55
|
## Usage
|
48
56
|
|
49
57
|
### Choose a version control system
|
@@ -74,19 +82,51 @@ RspecProfiling.configure do |config|
|
|
74
82
|
end
|
75
83
|
```
|
76
84
|
|
85
|
+
#### Custom Event Subscriptions
|
86
|
+
|
87
|
+
```Ruby
|
88
|
+
RspecProfiling.configure do |config|
|
89
|
+
config.events = %w[event1 event2]
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
Note that custom events are only currently reported by the CSV collector.
|
94
|
+
|
95
|
+
#### Custom Event Recording
|
96
|
+
|
97
|
+
It is possible to record the event metadata for a spec.
|
98
|
+
|
99
|
+
```Ruby
|
100
|
+
describe 'Records all active record queries', record_events: %w[sql.active_record] do
|
101
|
+
it 'Records Rails deprecations', record_events: %w[deprecation.rails] do
|
102
|
+
...
|
103
|
+
end
|
104
|
+
it 'Records nothing' do
|
105
|
+
...
|
106
|
+
end
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
77
110
|
### Choose a results collector
|
78
111
|
|
79
112
|
Results are collected just by running the specs.
|
80
113
|
|
81
114
|
#### SQLite3
|
82
115
|
|
83
|
-
|
84
|
-
|
116
|
+
Make sure you've run the installation rake task before attempting.
|
117
|
+
|
118
|
+
You can configure `RspecProfiling` to collect results in a SQL database in `config/initializers/rspec_profiling.rb`:
|
119
|
+
|
120
|
+
```Ruby
|
121
|
+
RspecProfiling.configure do |config|
|
122
|
+
config.collector = RspecProfiling::Collectors::SQL
|
123
|
+
end
|
124
|
+
```
|
85
125
|
|
86
126
|
You can review results by running the RspecProfiling console.
|
87
127
|
The console has a preloaded `results` variable.
|
88
128
|
|
89
|
-
```
|
129
|
+
```bash
|
90
130
|
bundle exec rake rspec_profiling:console
|
91
131
|
|
92
132
|
> results.count
|
@@ -95,14 +135,14 @@ bundle exec rake rspec_profiling:console
|
|
95
135
|
|
96
136
|
You can find the spec that runs the most queries:
|
97
137
|
|
98
|
-
```
|
138
|
+
```ruby
|
99
139
|
> results.order(:query_count).last.to_s
|
100
140
|
=> "Updating my account - ./spec/features/account_spec.rb:15"
|
101
141
|
```
|
102
142
|
|
103
143
|
Or find the spec that takes the most time:
|
104
144
|
|
105
|
-
```
|
145
|
+
```ruby
|
106
146
|
> results.order(:time).last.to_s
|
107
147
|
=> "Updating my account - ./spec/features/account_spec.rb:15"
|
108
148
|
```
|
@@ -112,7 +152,7 @@ debugging, such as `exception` and `status`.
|
|
112
152
|
|
113
153
|
#### CSV
|
114
154
|
|
115
|
-
You can configure `RspecProfiling` to collect results in a CSV in `config/initializers/rspec_profiling.rb`:
|
155
|
+
By default, profiles are collected in an a CSV file. You can configure `RspecProfiling` to collect results in a CSV in `config/initializers/rspec_profiling.rb`:
|
116
156
|
|
117
157
|
```Ruby
|
118
158
|
RspecProfiling.configure do |config|
|
@@ -177,16 +217,18 @@ To remove the results database, run `bundle exec rake rspec_profiling:uninstall`
|
|
177
217
|
|
178
218
|
## Contributing
|
179
219
|
|
180
|
-
|
181
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
182
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
183
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
184
|
-
5. Create new Pull Request
|
220
|
+
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
|
185
221
|
|
186
|
-
##
|
222
|
+
## Local Development
|
187
223
|
|
188
|
-
|
224
|
+
Local tools needed:
|
189
225
|
|
190
|
-
|
226
|
+
- docker
|
227
|
+
- docker-compose
|
228
|
+
- ruby
|
191
229
|
|
192
|
-
|
230
|
+
To run the specs:
|
231
|
+
|
232
|
+
```bash
|
233
|
+
make spec
|
234
|
+
```
|
data/SECURITY.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Security Policy
|
2
|
+
|
3
|
+
## Supported Versions
|
4
|
+
|
5
|
+
Ruby versions that are currently being supported with security updates.
|
6
|
+
|
7
|
+
| Version | Supported |
|
8
|
+
| ------- | ------------------ |
|
9
|
+
| <=2.6 | :x: |
|
10
|
+
| 2.7 | :white_check_mark: |
|
11
|
+
| 3.0 | :white_check_mark: |
|
12
|
+
| 3.1 | :white_check_mark: |
|
13
|
+
| 3.2 | :white_check_mark: |
|
14
|
+
| 3.3 | :white_check_mark: |
|
15
|
+
|
16
|
+
## Reporting a Vulnerability
|
17
|
+
|
18
|
+
Please click the `Report a vulnerability` button [here](https://github.com/procore-oss/rspec_profiling/security) to report a vulnerability.
|
19
|
+
|
20
|
+
A maintainer will respond to you as soon as possible and discuss the process to get the vulnerability fixed.
|
data/docker-compose.yml
ADDED
@@ -6,6 +6,7 @@ module RspecProfiling
|
|
6
6
|
HEADERS = %w{
|
7
7
|
branch
|
8
8
|
commit_hash
|
9
|
+
seed
|
9
10
|
date
|
10
11
|
file
|
11
12
|
line_number
|
@@ -17,6 +18,8 @@ module RspecProfiling
|
|
17
18
|
query_time
|
18
19
|
request_count
|
19
20
|
request_time
|
21
|
+
start_memory
|
22
|
+
end_memory
|
20
23
|
}
|
21
24
|
|
22
25
|
def self.install
|
@@ -31,24 +34,44 @@ module RspecProfiling
|
|
31
34
|
# no op
|
32
35
|
end
|
33
36
|
|
34
|
-
def initialize
|
35
|
-
|
37
|
+
def initialize(config=RspecProfiling.config)
|
38
|
+
config.csv_path ||= 'tmp/spec_benchmarks.csv'
|
39
|
+
|
40
|
+
@config = config
|
36
41
|
end
|
37
42
|
|
38
43
|
def insert(attributes)
|
39
|
-
output <<
|
40
|
-
attributes.fetch(field.to_sym)
|
41
|
-
end
|
44
|
+
output << static_cells(attributes) + event_cells(attributes)
|
42
45
|
end
|
43
46
|
|
44
47
|
private
|
45
48
|
|
49
|
+
attr_reader :config
|
50
|
+
|
46
51
|
def output
|
47
|
-
@output ||= ::CSV.open(path, "w").tap { |csv| csv << HEADERS }
|
52
|
+
@output ||= ::CSV.open(path, "w").tap { |csv| csv << HEADERS + event_headers }
|
48
53
|
end
|
49
54
|
|
50
55
|
def path
|
51
|
-
|
56
|
+
config.csv_path.call
|
57
|
+
end
|
58
|
+
|
59
|
+
def static_cells(attributes)
|
60
|
+
HEADERS.map do |field|
|
61
|
+
attributes.fetch(field.to_sym)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def event_headers
|
66
|
+
config.events.flat_map do |event|
|
67
|
+
["#{event}_count", "#{event}_time", "#{event}_events"]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def event_cells(attributes)
|
72
|
+
config.events.flat_map do |event|
|
73
|
+
[attributes[:event_counts][event], attributes[:event_times][event], attributes[:event_events][event].to_json]
|
74
|
+
end
|
52
75
|
end
|
53
76
|
end
|
54
77
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module RspecProfiling
|
2
|
+
module Collectors
|
3
|
+
class JSON
|
4
|
+
KEYS = %w{
|
5
|
+
branch
|
6
|
+
commit_hash
|
7
|
+
seed
|
8
|
+
date
|
9
|
+
file
|
10
|
+
line_number
|
11
|
+
description
|
12
|
+
status
|
13
|
+
exception
|
14
|
+
time
|
15
|
+
query_count
|
16
|
+
query_time
|
17
|
+
request_count
|
18
|
+
request_time
|
19
|
+
start_memory
|
20
|
+
end_memory
|
21
|
+
}
|
22
|
+
|
23
|
+
def self.install
|
24
|
+
# no op
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.uninstall
|
28
|
+
# no op
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.reset
|
32
|
+
# no op
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(config=RspecProfiling.config)
|
36
|
+
config.output_file_path ||= 'tmp/spec_benchmarks.json'
|
37
|
+
|
38
|
+
@config = config
|
39
|
+
end
|
40
|
+
|
41
|
+
def insert(attributes)
|
42
|
+
output << merge_attributes_and_events(attributes) + "\n"
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
attr_reader :config
|
48
|
+
|
49
|
+
def output
|
50
|
+
@output ||= ::File.open(path, "w")
|
51
|
+
end
|
52
|
+
|
53
|
+
def path
|
54
|
+
config.output_file_path.call
|
55
|
+
end
|
56
|
+
|
57
|
+
def merge_attributes_and_events(attributes)
|
58
|
+
config.events.flat_map do |event|
|
59
|
+
attributes["#{event}_counts"] = attributes[:event_counts][event]
|
60
|
+
attributes["#{event}_times"] = attributes[:event_times][event]
|
61
|
+
attributes["#{event}_events"] = attributes[:event_events][event]
|
62
|
+
end
|
63
|
+
|
64
|
+
attributes.merge!(config.additional_data)
|
65
|
+
|
66
|
+
attributes.except(:event_counts, :event_times, :event_events, :events).to_json
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -5,9 +5,11 @@ module RspecProfiling
|
|
5
5
|
|
6
6
|
def self.config
|
7
7
|
@config ||= OpenStruct.new({
|
8
|
-
collector: RspecProfiling::Collectors::
|
8
|
+
collector: RspecProfiling::Collectors::CSV,
|
9
9
|
vcs: RspecProfiling::VCS::Git,
|
10
|
-
table_name: 'spec_profiling_results'
|
10
|
+
table_name: 'spec_profiling_results',
|
11
|
+
events: [],
|
12
|
+
additional_data: {}
|
11
13
|
})
|
12
14
|
end
|
13
15
|
end
|
@@ -21,6 +21,9 @@ module RspecProfiling
|
|
21
21
|
def initialize(example)
|
22
22
|
@example = example
|
23
23
|
@counts = Hash.new(0)
|
24
|
+
@event_counts = Hash.new(0)
|
25
|
+
@event_times = Hash.new(0)
|
26
|
+
@event_events = Hash.new()
|
24
27
|
end
|
25
28
|
|
26
29
|
def file
|
@@ -38,7 +41,7 @@ module RspecProfiling
|
|
38
41
|
def status
|
39
42
|
execution_result.status
|
40
43
|
end
|
41
|
-
|
44
|
+
|
42
45
|
def exception
|
43
46
|
execution_result.exception
|
44
47
|
end
|
@@ -63,6 +66,8 @@ module RspecProfiling
|
|
63
66
|
counts[:request_time]
|
64
67
|
end
|
65
68
|
|
69
|
+
attr_reader :event_counts, :event_times, :event_events
|
70
|
+
|
66
71
|
def log_query(query, start, finish)
|
67
72
|
unless query[:sql] =~ IGNORED_QUERIES_PATTERN
|
68
73
|
counts[:query_count] += 1
|
@@ -75,6 +80,19 @@ module RspecProfiling
|
|
75
80
|
counts[:request_time] += request[:view_runtime].to_f
|
76
81
|
end
|
77
82
|
|
83
|
+
def log_event(event_name, event, start, finish)
|
84
|
+
event_counts[event_name] += 1
|
85
|
+
event_times[event_name] += (finish - start)
|
86
|
+
event_events[event_name] ||= []
|
87
|
+
if verbose_record_event?(event_name)
|
88
|
+
begin
|
89
|
+
event_events[event_name] << event.as_json
|
90
|
+
rescue => e
|
91
|
+
# no op
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
78
96
|
private
|
79
97
|
|
80
98
|
attr_reader :example, :counts
|
@@ -90,5 +108,9 @@ module RspecProfiling
|
|
90
108
|
def metadata
|
91
109
|
example.metadata
|
92
110
|
end
|
111
|
+
|
112
|
+
def verbose_record_event?(event_name)
|
113
|
+
metadata[:record_events].to_a.include?(event_name)
|
114
|
+
end
|
93
115
|
end
|
94
116
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "rspec_profiling"
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
|
-
runner = RspecProfiling::Run.new(RspecProfiling.config.collector.new,
|
4
|
+
runner = RspecProfiling::Run.new(RspecProfiling.config.collector.new,
|
5
5
|
RspecProfiling.config.vcs.new)
|
6
6
|
|
7
7
|
config.reporter.register_listener(
|
data/lib/rspec_profiling/run.rb
CHANGED
@@ -1,26 +1,31 @@
|
|
1
|
+
require "get_process_mem"
|
1
2
|
require "rspec_profiling/example"
|
2
3
|
require "rspec_profiling/vcs/git"
|
3
4
|
require "rspec_profiling/vcs/svn"
|
4
5
|
require "rspec_profiling/vcs/git_svn"
|
5
|
-
require "rspec_profiling/collectors/sql"
|
6
|
-
require "rspec_profiling/collectors/psql"
|
7
6
|
require "rspec_profiling/collectors/csv"
|
7
|
+
require "rspec_profiling/collectors/json"
|
8
8
|
|
9
9
|
module RspecProfiling
|
10
10
|
class Run
|
11
11
|
def initialize(collector = RspecProfiling.config.collector.new,
|
12
|
-
vcs = RspecProfiling.config.vcs.new
|
12
|
+
vcs = RspecProfiling.config.vcs.new,
|
13
|
+
events = RspecProfiling.config.events)
|
13
14
|
|
14
15
|
@collector = collector
|
15
16
|
@vcs = vcs
|
17
|
+
@events = events
|
18
|
+
@seed = RSpec.configuration.seed
|
16
19
|
end
|
17
20
|
|
18
21
|
def start(*args)
|
19
22
|
start_counting_queries
|
20
23
|
start_counting_requests
|
24
|
+
start_counting_events
|
21
25
|
end
|
22
26
|
|
23
27
|
def example_started(example)
|
28
|
+
start_recording_memory
|
24
29
|
example = example.example if example.respond_to?(:example)
|
25
30
|
@current_example = Example.new(example)
|
26
31
|
end
|
@@ -29,6 +34,7 @@ module RspecProfiling
|
|
29
34
|
collector.insert({
|
30
35
|
branch: vcs.branch,
|
31
36
|
commit_hash: vcs.sha,
|
37
|
+
seed: @seed,
|
32
38
|
date: vcs.time,
|
33
39
|
file: @current_example.file,
|
34
40
|
line_number: @current_example.line_number,
|
@@ -39,7 +45,13 @@ module RspecProfiling
|
|
39
45
|
query_count: @current_example.query_count,
|
40
46
|
query_time: @current_example.query_time,
|
41
47
|
request_count: @current_example.request_count,
|
42
|
-
request_time: @current_example.request_time
|
48
|
+
request_time: @current_example.request_time,
|
49
|
+
events: @events,
|
50
|
+
event_counts: @current_example.event_counts,
|
51
|
+
event_times: @current_example.event_times,
|
52
|
+
event_events: @current_example.event_events,
|
53
|
+
start_memory: @start_memory,
|
54
|
+
end_memory: end_memory
|
43
55
|
})
|
44
56
|
end
|
45
57
|
|
@@ -48,7 +60,15 @@ module RspecProfiling
|
|
48
60
|
|
49
61
|
private
|
50
62
|
|
51
|
-
attr_reader :collector, :vcs
|
63
|
+
attr_reader :collector, :vcs, :events, :seed, :start_memory
|
64
|
+
|
65
|
+
def end_memory
|
66
|
+
GetProcessMem.new.mb
|
67
|
+
end
|
68
|
+
|
69
|
+
def start_recording_memory
|
70
|
+
@start_memory = GetProcessMem.new.mb
|
71
|
+
end
|
52
72
|
|
53
73
|
def start_counting_queries
|
54
74
|
ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, query|
|
@@ -61,5 +81,13 @@ module RspecProfiling
|
|
61
81
|
@current_example.try(:log_request, request, start, finish)
|
62
82
|
end
|
63
83
|
end
|
84
|
+
|
85
|
+
def start_counting_events
|
86
|
+
events.each do |event_name|
|
87
|
+
ActiveSupport::Notifications.subscribe(event_name) do |name, start, finish, id, event|
|
88
|
+
@current_example.try(:log_event, event_name, event, start, finish)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
64
92
|
end
|
65
93
|
end
|
data/lib/rspec_profiling.rb
CHANGED
@@ -4,12 +4,24 @@ require "rspec_profiling/config"
|
|
4
4
|
require "rspec_profiling/version"
|
5
5
|
require "rspec_profiling/run"
|
6
6
|
require "rspec_profiling/collectors/csv"
|
7
|
-
require "rspec_profiling/collectors/sql"
|
8
|
-
require "rspec_profiling/collectors/psql"
|
9
7
|
require "rspec_profiling/vcs/git"
|
10
8
|
require "rspec_profiling/vcs/svn"
|
11
9
|
require "rspec_profiling/vcs/git_svn"
|
12
10
|
|
11
|
+
begin
|
12
|
+
require "rspec_profiling/collectors/sql"
|
13
|
+
rescue LoadError
|
14
|
+
#no op
|
15
|
+
end
|
16
|
+
|
17
|
+
begin
|
18
|
+
require "rspec_profiling/collectors/psql"
|
19
|
+
rescue LoadError
|
20
|
+
#no op
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
13
25
|
module RspecProfiling
|
14
26
|
class Railtie < Rails::Railtie
|
15
27
|
railtie_name :rspec_profiling
|
data/rspec_profiling.gemspec
CHANGED
@@ -6,24 +6,27 @@ require 'rspec_profiling/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "rspec_profiling"
|
8
8
|
spec.version = RspecProfiling::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
9
|
+
spec.authors = ["Procore Technologies, Inc."]
|
10
|
+
spec.email = ["opensource@procore.com"]
|
11
11
|
spec.description = %q{Profile RSpec test suites}
|
12
12
|
spec.summary = %q{Profile RSpec test suites}
|
13
|
-
spec.homepage = "https://github.com/
|
13
|
+
spec.homepage = "https://github.com/procore-oss/rspec_profiling"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "sqlite3"
|
22
21
|
spec.add_dependency "activerecord"
|
23
|
-
spec.add_dependency "
|
22
|
+
spec.add_dependency "get_process_mem"
|
24
23
|
spec.add_dependency "rails"
|
25
24
|
|
26
25
|
spec.add_development_dependency "bundler", "> 1.3"
|
26
|
+
spec.add_development_dependency "pry"
|
27
27
|
spec.add_development_dependency "rake"
|
28
28
|
spec.add_development_dependency "rspec"
|
29
|
+
|
30
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
31
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
29
32
|
end
|