gem_footprint_analyzer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 01fceb1ae268426dbc40be479314460b27a4640b869ae5d4d644f7e2cdee5f70
4
+ data.tar.gz: 4bede18980190bd8c3aa847e96d9075610263f3d9453946f4f375223cffeb958
5
+ SHA512:
6
+ metadata.gz: 4b1692cd24a9f7c6b3223f4896130cb64d1d4e0fbcc397e0615a669ec314280de7f2d15e83144defd656dcc16f8c7071ff1e2ef3cc1c8062d620fdc9b635cb8c
7
+ data.tar.gz: 7b68b3d7dd7ec50087a200a46e99cefbfed19e09711ba3bc2cb5c7b6ba7814d406adc7f4b557b4a1201c6e9ea36695649742ecde73037ef545331292f275beaa
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.1
7
+ before_install: gem install bundler -v 1.16.4
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at maciek@dubinski.net. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in gem_footprint_analyzer.gemspec
6
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Maciek Dubiński
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,424 @@
1
+ # GemFootprintAnalyzer
2
+
3
+ A tool for analyzing time and RSS footprint of gems or standard library requires, it's currently in a 'work in progress' state (developed on ruby-2.5.1 / macOS).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'gem_footprint_analyzer'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install gem_footprint_analyzer
20
+
21
+ ## Usage
22
+
23
+ Analyze a standard library require or a gem. In the gem case, make sure it's included in the Gemfile.
24
+
25
+ Example usages:
26
+
27
+ ### timeout
28
+ ```
29
+ $ bundle exec analyze_requires timeout
30
+ name time RSS after
31
+ -----------------------------
32
+ timeout 0.0032s 2140KB
33
+ ```
34
+
35
+ ### net/http
36
+ ```
37
+ $ bundle exec analyze_requires net/http
38
+ name time RSS after
39
+ -------------------------------
40
+ socket.so 0.0019s 4920KB
41
+ io/wait 0.0009s 5296KB
42
+ socket 0.0108s 5296KB
43
+ timeout 0.0014s 5736KB
44
+ zlib 0.0012s 5924KB
45
+ -------------------------------
46
+ net/http 0.0476s 6712KB
47
+ ```
48
+
49
+ ### activesupport/all
50
+ ```
51
+ $ bundle exec analyze_requires activesupport active_support/all
52
+ name time RSS after
53
+ --------------------------------------------------------------------------------------
54
+ securerandom 0.0022s 2728KB
55
+ concurrent/constants 0.0005s 4168KB
56
+ concurrent/utility/engine 0.0006s 4268KB
57
+ concurrent/synchronization/abstract_object 0.0006s 4360KB
58
+ concurrent/utility/native_extension_loader 0.0015s 5008KB
59
+ concurrent/synchronization/mri_object 0.0006s 5132KB
60
+ concurrent/synchronization/jruby_object 0.0006s 5172KB
61
+ concurrent/synchronization/rbx_object 0.0006s 5212KB
62
+ concurrent/synchronization/truffle_object 0.0007s 5312KB
63
+ concurrent/synchronization/object 0.0010s 5416KB
64
+ concurrent/synchronization/volatile 0.0006s 5536KB
65
+ concurrent/synchronization/abstract_lockable_object 0.0007s 5656KB
66
+ concurrent/synchronization/mri_lockable_object 0.0008s 5776KB
67
+ concurrent/synchronization/jruby_lockable_object 0.0005s 5840KB
68
+ concurrent/synchronization/rbx_lockable_object 0.0007s 5864KB
69
+ concurrent/synchronization/truffle_lockable_object 0.0004s 5884KB
70
+ concurrent/synchronization/lockable_object 0.0005s 5936KB
71
+ concurrent/synchronization/condition 0.0007s 5984KB
72
+ concurrent/synchronization/lock 0.0005s 6012KB
73
+ concurrent/synchronization 0.0745s 6012KB
74
+ concurrent/collection/map/non_concurrent_map_backend 0.0010s 6144KB
75
+ concurrent/collection/map/mri_map_backend 0.0018s 6144KB
76
+ concurrent/map 0.0894s 6144KB
77
+ active_support/core_ext/array/prepend_and_append 0.0004s 6156KB
78
+ active_support/core_ext/regexp 0.0004s 6180KB
79
+ active_support/core_ext/hash/deep_merge 0.0005s 6280KB
80
+ active_support/core_ext/hash/except 0.0005s 6304KB
81
+ active_support/core_ext/hash/slice 0.0006s 6424KB
82
+ i18n/version 0.0003s 6512KB
83
+ i18n/exceptions 0.0012s 6688KB
84
+ i18n/interpolate/ruby 0.0006s 6776KB
85
+ i18n 0.0114s 6776KB
86
+ active_support/lazy_load_hooks 0.0006s 6812KB
87
+ i18n/config 0.0009s 6932KB
88
+ active_support/i18n 0.0374s 6932KB
89
+ singleton 0.0006s 6992KB
90
+ active_support/core_ext/kernel/singleton_class 0.0005s 7048KB
91
+ active_support/core_ext/module/delegation 0.0020s 7208KB
92
+ active_support/deprecation/instance_delegator 0.0068s 7208KB
93
+ active_support/notifications/instrumenter 0.0008s 7332KB
94
+ mutex_m 0.0005s 7428KB
95
+ active_support/notifications/fanout 0.0053s 7460KB
96
+ active_support/per_thread_registry 0.0005s 7480KB
97
+ active_support/notifications 0.0146s 7480KB
98
+ active_support/deprecation/behaviors 0.0153s 7480KB
99
+ active_support/deprecation/reporting 0.0010s 7560KB
100
+ active_support/deprecation/constant_accessor 0.0007s 7688KB
101
+ active_support/core_ext/module/aliasing 0.0005s 7732KB
102
+ active_support/core_ext/array/extract_options 0.0004s 7748KB
103
+ active_support/deprecation/method_wrappers 0.0052s 7748KB
104
+ active_support/deprecation/proxy_wrappers 0.0010s 7832KB
105
+ active_support/core_ext/module/deprecation 0.0005s 8276KB
106
+ active_support/deprecation 0.0723s 8276KB
107
+ active_support/inflector/inflections 0.2265s 8276KB
108
+ active_support/inflections 0.2285s 8276KB
109
+ active_support/inflector/methods 0.2426s 8284KB
110
+ active_support/dependencies/autoload 0.2438s 8284KB
111
+ active_support/version 0.0006s 8308KB
112
+ active_support/concern 0.0007s 8620KB
113
+ active_support/core_ext/module/attribute_accessors 0.0011s 8688KB
114
+ concurrent/version 0.0003s 8728KB
115
+ concurrent/errors 0.0006s 8768KB
116
+ timeout 0.0009s 9052KB
117
+ concurrent/atomic/event 0.0008s 9080KB
118
+ concurrent/concern/dereferenceable 0.0006s 9116KB
119
+ concurrent/concern/obligation 0.0107s 9116KB
120
+ logger 0.0024s 9632KB
121
+ concurrent/concern/logging 0.0029s 9632KB
122
+ concurrent/executor/executor_service 0.0035s 9632KB
123
+ concurrent/utility/at_exit 0.0010s 9640KB
124
+ concurrent/executor/abstract_executor_service 0.0173s 9640KB
125
+ concurrent/executor/serial_executor_service 0.0005s 9640KB
126
+ concurrent/executor/immediate_executor 0.0263s 9640KB
127
+ concurrent/delay 0.0523s 9648KB
128
+ concurrent/atomic_reference/concurrent_update_error 0.0004s 9656KB
129
+ concurrent/atomic_reference/direct_update 0.0005s 9672KB
130
+ concurrent/atomic_reference/numeric_cas_wrapper 0.0005s 9680KB
131
+ concurrent/atomic_reference/mutex_atomic 0.0054s 9680KB
132
+ concurrent/atomic_reference/ruby 0.0004s 9688KB
133
+ concurrent/atomic/atomic_reference 0.0179s 9688KB
134
+ concurrent/utility/processor_counter 0.0012s 9728KB
135
+ concurrent/configuration 0.0837s 9728KB
136
+ concurrent/atomic/mutex_atomic_boolean 0.0006s 9732KB
137
+ concurrent/atomic/atomic_boolean 0.0049s 9732KB
138
+ concurrent/utility/native_integer 0.0006s 9800KB
139
+ concurrent/atomic/mutex_atomic_fixnum 0.0013s 9800KB
140
+ concurrent/atomic/atomic_fixnum 0.0093s 9800KB
141
+ concurrent/atomic/cyclic_barrier 0.0010s 9816KB
142
+ concurrent/atomic/mutex_count_down_latch 0.0006s 9820KB
143
+ concurrent/atomic/java_count_down_latch 0.0005s 9832KB
144
+ concurrent/atomic/count_down_latch 0.0091s 9832KB
145
+ concurrent/atomic/read_write_lock 0.0014s 9876KB
146
+ concurrent/atomic/abstract_thread_local_var 0.0006s 9920KB
147
+ concurrent/atomic/ruby_thread_local_var 0.0015s 9920KB
148
+ concurrent/atomic/java_thread_local_var 0.0008s 9948KB
149
+ concurrent/atomic/thread_local_var 0.0145s 9956KB
150
+ concurrent/atomic/reentrant_read_write_lock 0.0162s 9956KB
151
+ concurrent/atomic/mutex_semaphore 0.0012s 10164KB
152
+ concurrent/atomic/semaphore 0.0057s 10164KB
153
+ concurrent/atomics 0.0782s 10164KB
154
+ concurrent/executor/ruby_executor_service 0.0008s 10192KB
155
+ concurrent/utility/monotonic_time 0.0006s 10208KB
156
+ concurrent/executor/ruby_thread_pool_executor 0.0070s 10208KB
157
+ concurrent/executor/thread_pool_executor 0.0076s 10208KB
158
+ concurrent/executor/cached_thread_pool 0.0083s 10208KB
159
+ concurrent/executor/fixed_thread_pool 0.0007s 10212KB
160
+ concurrent/executor/simple_executor_service 0.0008s 10236KB
161
+ concurrent/executor/indirect_immediate_executor 0.0015s 10236KB
162
+ concurrent/executor/java_executor_service 0.0009s 10260KB
163
+ concurrent/executor/java_single_thread_executor 0.0005s 10268KB
164
+ concurrent/executor/java_thread_pool_executor 0.0007s 10292KB
165
+ concurrent/executor/ruby_single_thread_executor 0.0005s 10292KB
166
+ concurrent/executor/safe_task_executor 0.0006s 10292KB
167
+ concurrent/executor/serialized_execution 0.0011s 10368KB
168
+ concurrent/executor/serialized_execution_delegator 0.0008s 10376KB
169
+ concurrent/executor/single_thread_executor 0.0006s 10380KB
170
+ concurrent/collection/copy_on_write_observer_set 0.0008s 10460KB
171
+ concurrent/collection/copy_on_notify_observer_set 0.0008s 10508KB
172
+ concurrent/concern/observable 0.0053s 10508KB
173
+ concurrent/ivar 0.0148s 10512KB
174
+ concurrent/options 0.0006s 10512KB
175
+ concurrent/scheduled_task 0.0203s 10512KB
176
+ concurrent/collection/java_non_concurrent_priority_queue 0.0006s 10564KB
177
+ concurrent/collection/ruby_non_concurrent_priority_queue 0.0008s 10564KB
178
+ concurrent/collection/non_concurrent_priority_queue 0.0096s 10640KB
179
+ concurrent/executor/timer_set 0.0420s 10644KB
180
+ concurrent/executors 0.1153s 10644KB
181
+ concurrent/agent 0.0023s 10748KB
182
+ concurrent/atom 0.0012s 10768KB
183
+ concurrent/thread_safe/util 0.0004s 10772KB
184
+ concurrent/array 0.0019s 10772KB
185
+ concurrent/hash 0.0007s 10776KB
186
+ concurrent/tuple 0.0007s 10780KB
187
+ concurrent/async 0.0012s 10780KB
188
+ concurrent/future 0.0011s 10784KB
189
+ concurrent/dataflow 0.0057s 10784KB
190
+ concurrent/maybe 0.0007s 10796KB
191
+ concurrent/exchanger 0.0063s 10796KB
192
+ concurrent/synchronization/abstract_struct 0.0009s 10848KB
193
+ concurrent/immutable_struct 0.0054s 10852KB
194
+ concurrent/mutable_struct 0.0011s 10880KB
195
+ concurrent/mvar 0.0011s 10884KB
196
+ concurrent/promise 0.0021s 10888KB
197
+ concurrent/settable_struct 0.0012s 10896KB
198
+ concurrent/timer_task 0.0016s 10940KB
199
+ concurrent/tvar 0.0013s 10984KB
200
+ concurrent/thread_safe/synchronized_delegator 0.0007s 10984KB
201
+ concurrent 0.4029s 10988KB
202
+ active_support/logger_silence 0.4127s 10988KB
203
+ active_support/logger_thread_safe_level 0.0006s 10996KB
204
+ active_support/logger 0.4257s 11084KB
205
+ active_support/core_ext/date_and_time/compatibility 0.0006s 11144KB
206
+ active_support 0.6941s 11144KB
207
+ date_core 0.0013s 11520KB
208
+ date 0.0020s 11520KB
209
+ time 0.0025s 11616KB
210
+ active_support/core_ext/object/acts_like 0.0003s 11616KB
211
+ active_support/core_ext/time/acts_like 0.0008s 11616KB
212
+ base64 0.0005s 11768KB
213
+ bigdecimal 0.0010s 11808KB
214
+ active_support/multibyte 0.0004s 11812KB
215
+ active_support/core_ext/string/multibyte 0.0008s 11812KB
216
+ active_support/inflector/transliterate 0.0086s 11816KB
217
+ active_support/core_ext/string/inflections 0.0095s 11816KB
218
+ active_support/core_ext/date_time/calculations 0.0011s 11848KB
219
+ active_support/core_ext/kernel/reporting 0.0008s 11888KB
220
+ active_support/core_ext/object/blank 0.0017s 11888KB
221
+ active_support/xml_mini/rexml 0.0113s 11888KB
222
+ active_support/xml_mini 0.0429s 11888KB
223
+ active_support/core_ext/hash/keys 0.0010s 11924KB
224
+ active_support/core_ext/object/to_query 0.0007s 11924KB
225
+ active_support/core_ext/object/to_param 0.0011s 11924KB
226
+ active_support/core_ext/array/conversions 0.0638s 11924KB
227
+ active_support/core_ext/string/filters 0.0007s 11936KB
228
+ active_support/duration 0.0740s 11936KB
229
+ tzinfo/ruby_core_support 0.0009s 12152KB
230
+ tzinfo/offset_rationals 0.0006s 12196KB
231
+ tzinfo/time_or_datetime 0.0012s 12224KB
232
+ tzinfo/timezone_definition 0.0005s 12232KB
233
+ tzinfo/timezone_offset 0.0006s 12232KB
234
+ tzinfo/timezone_transition 0.0008s 12288KB
235
+ tzinfo/timezone_transition_definition 0.0006s 12288KB
236
+ tzinfo/timezone_index_definition 0.0005s 12288KB
237
+ tzinfo/timezone_info 0.0004s 12288KB
238
+ tzinfo/data_timezone_info 0.0005s 12300KB
239
+ tzinfo/linked_timezone_info 0.0004s 12300KB
240
+ tzinfo/transition_data_timezone_info 0.0013s 12428KB
241
+ tzinfo/zoneinfo_timezone_info 0.0014s 12492KB
242
+ tzinfo/data_source 0.0009s 12532KB
243
+ tzinfo/ruby_data_source 0.0008s 12548KB
244
+ tzinfo/zoneinfo_data_source 0.0018s 12636KB
245
+ tzinfo/timezone_period 0.0009s 12672KB
246
+ thread_safe/version 0.0004s 12684KB
247
+ thread_safe/synchronized_delegator 0.0006s 12684KB
248
+ thread_safe 0.0056s 12684KB
249
+ thread_safe/non_concurrent_cache_backend 0.0007s 12720KB
250
+ thread_safe/mri_cache_backend 0.0014s 12720KB
251
+ thread_safe/cache 0.0026s 12720KB
252
+ tzinfo/timezone 0.0171s 12720KB
253
+ tzinfo/info_timezone 0.0005s 12720KB
254
+ tzinfo/data_timezone 0.0004s 12724KB
255
+ tzinfo/linked_timezone 0.0005s 12724KB
256
+ tzinfo/timezone_proxy 0.0006s 12736KB
257
+ tzinfo/country_index_definition 0.0005s 12740KB
258
+ tzinfo/country_info 0.0005s 12740KB
259
+ tzinfo/ruby_country_info 0.0006s 12748KB
260
+ tzinfo/zoneinfo_country_info 0.0013s 12748KB
261
+ tzinfo/country 0.0009s 12756KB
262
+ tzinfo/country_timezone 0.0007s 12760KB
263
+ tzinfo 0.1486s 12760KB
264
+ active_support/values/time_zone 0.1584s 12768KB
265
+ active_support/core_ext/time/conversions 0.1592s 12768KB
266
+ active_support/time_with_zone 0.0026s 12868KB
267
+ active_support/core_ext/date_and_time/zones 0.0004s 12868KB
268
+ active_support/core_ext/time/zones 0.0014s 12868KB
269
+ active_support/core_ext/object/try 0.0007s 12884KB
270
+ active_support/core_ext/date_and_time/calculations 0.0023s 12884KB
271
+ active_support/core_ext/date/zones 0.0005s 12884KB
272
+ active_support/core_ext/date/calculations 0.0058s 12884KB
273
+ active_support/core_ext/time/calculations 0.2757s 12884KB
274
+ active_support/core_ext/module/redefine_method 0.0008s 12884KB
275
+ active_support/core_ext/time/compatibility 0.0014s 12884KB
276
+ active_support/core_ext/time 0.2999s 12888KB
277
+ active_support/core_ext/date/acts_like 0.0004s 12888KB
278
+ active_support/core_ext/date/blank 0.0004s 12888KB
279
+ active_support/core_ext/date/conversions 0.0010s 12888KB
280
+ active_support/core_ext/date 0.0134s 12904KB
281
+ active_support/core_ext/date_time/acts_like 0.0005s 12904KB
282
+ active_support/core_ext/date_time/blank 0.0005s 12904KB
283
+ active_support/core_ext/date_time/compatibility 0.0006s 12908KB
284
+ active_support/core_ext/date_time/conversions 0.0016s 12936KB
285
+ active_support/core_ext/date_time 0.0145s 12936KB
286
+ active_support/core_ext/numeric/time 0.0013s 12980KB
287
+ active_support/core_ext/integer/time 0.0019s 12980KB
288
+ active_support/core_ext/string/conversions 0.0011s 13048KB
289
+ active_support/core_ext/string/zones 0.0005s 13048KB
290
+ active_support/time 0.3730s 13048KB
291
+ active_support/core_ext/string/starts_ends_with 0.0004s 13172KB
292
+ active_support/core_ext/string/access 0.0005s 13172KB
293
+ active_support/core_ext/string/behavior 0.0009s 13344KB
294
+ strscan 0.0012s 13912KB
295
+ erb 0.0054s 13912KB
296
+ active_support/multibyte/unicode 0.0032s 14188KB
297
+ active_support/core_ext/string/output_safety 0.0199s 14188KB
298
+ active_support/core_ext/string/exclude 0.0004s 14192KB
299
+ active_support/core_ext/string/strip 0.0004s 14196KB
300
+ active_support/string_inquirer 0.0005s 14224KB
301
+ active_support/core_ext/string/inquiry 0.0009s 14224KB
302
+ active_support/core_ext/string/indent 0.0005s 14232KB
303
+ activesupport-5.2.1/lib/active_support/core_ext/string.rb 0.0599s 14232KB
304
+ active_support/inflector 0.0007s 14256KB
305
+ active_support/core_ext/module/introspection 0.0016s 14256KB
306
+ active_support/core_ext/module/anonymous 0.0006s 14256KB
307
+ active_support/core_ext/module/reachable 0.0008s 14260KB
308
+ active_support/core_ext/module/attribute_accessors_per_thread 0.0011s 14284KB
309
+ active_support/core_ext/module/attr_internal 0.0008s 14296KB
310
+ active_support/core_ext/module/concerning 0.0007s 14320KB
311
+ active_support/core_ext/module/remove_method 0.0007s 14324KB
312
+ activesupport-5.2.1/lib/active_support/core_ext/module.rb 0.0327s 14324KB
313
+ activesupport-5.2.1/lib/active_support/core_ext/name_error.rb 0.0004s 14360KB
314
+ active_support/core_ext/array/wrap 0.0004s 14376KB
315
+ active_support/core_ext/array/access 0.0005s 14400KB
316
+ active_support/core_ext/array/grouping 0.0006s 14416KB
317
+ active_support/array_inquirer 0.0005s 14460KB
318
+ active_support/core_ext/array/inquiry 0.0009s 14460KB
319
+ activesupport-5.2.1/lib/active_support/core_ext/array.rb 0.0141s 14460KB
320
+ active_support/core_ext/class/attribute 0.0011s 14516KB
321
+ active_support/core_ext/class/subclasses 0.0033s 14532KB
322
+ activesupport-5.2.1/lib/active_support/core_ext/class.rb 0.0083s 14532KB
323
+ active_support/core_ext/numeric/bytes 0.0005s 14544KB
324
+ active_support/core_ext/numeric/inquiry 0.0004s 14544KB
325
+ bigdecimal/util 0.0006s 14552KB
326
+ active_support/core_ext/big_decimal/conversions 0.0014s 14552KB
327
+ active_support/number_helper 0.0008s 14552KB
328
+ active_support/core_ext/numeric/conversions 0.0136s 14552KB
329
+ activesupport-5.2.1/lib/active_support/core_ext/numeric.rb 0.0220s 14552KB
330
+ activesupport-5.2.1/lib/active_support/core_ext/load_error.rb 0.0003s 14552KB
331
+ activesupport-5.2.1/lib/active_support/core_ext/uri.rb 0.0005s 14552KB
332
+ active_support/core_ext/integer/multiple 0.0004s 14552KB
333
+ active_support/core_ext/integer/inflections 0.0005s 14556KB
334
+ activesupport-5.2.1/lib/active_support/core_ext/integer.rb 0.0083s 14556KB
335
+ active_support/core_ext/hash/compact 0.0004s 14556KB
336
+ active_support/core_ext/hash/reverse_merge 0.0004s 14556KB
337
+ active_support/core_ext/hash/conversions 0.0055s 14556KB
338
+ active_support/hash_with_indifferent_access 0.0014s 14608KB
339
+ active_support/core_ext/hash/indifferent_access 0.0018s 14608KB
340
+ active_support/core_ext/hash/transform_values 0.0005s 14612KB
341
+ activesupport-5.2.1/lib/active_support/core_ext/hash.rb 0.0236s 14612KB
342
+ fileutils 0.0073s 15424KB
343
+ active_support/core_ext/file/atomic 0.0079s 15424KB
344
+ activesupport-5.2.1/lib/active_support/core_ext/file.rb 0.0081s 15424KB
345
+ active_support/core_ext/range/conversions 0.0004s 15444KB
346
+ active_support/core_ext/range/include_range 0.0004s 15448KB
347
+ active_support/core_ext/range/include_time_with_zone 0.0005s 15464KB
348
+ active_support/core_ext/range/overlaps 0.0004s 15472KB
349
+ active_support/core_ext/range/each 0.0005s 15476KB
350
+ activesupport-5.2.1/lib/active_support/core_ext/range.rb 0.0164s 15476KB
351
+ active_support/core_ext/kernel/agnostics 0.0004s 15488KB
352
+ active_support/core_ext/kernel/concern 0.0007s 15488KB
353
+ activesupport-5.2.1/lib/active_support/core_ext/kernel.rb 0.0091s 15492KB
354
+ benchmark 0.0015s 15572KB
355
+ activesupport-5.2.1/lib/active_support/core_ext/benchmark.rb 0.0018s 15572KB
356
+ active_support/core_ext/object/duplicable 0.0010s 15640KB
357
+ active_support/core_ext/object/deep_dup 0.0006s 15684KB
358
+ active_support/core_ext/object/inclusion 0.0004s 15688KB
359
+ active_support/core_ext/object/conversions 0.0007s 15720KB
360
+ active_support/core_ext/object/instance_variables 0.0004s 15732KB
361
+ json/version 0.0004s 15968KB
362
+ ostruct 0.0011s 16076KB
363
+ json/generic_object 0.0018s 16076KB
364
+ json/common 0.0079s 16076KB
365
+ json/ext/parser 0.0007s 16104KB
366
+ json/ext/generator 0.0008s 16188KB
367
+ json/ext 0.0061s 16188KB
368
+ json 0.0249s 16188KB
369
+ active_support/core_ext/object/json 0.0389s 16196KB
370
+ active_support/option_merger 0.0008s 16252KB
371
+ active_support/core_ext/object/with_options 0.0017s 16252KB
372
+ activesupport-5.2.1/lib/active_support/core_ext/object.rb 0.0667s 16252KB
373
+ activesupport-5.2.1/lib/active_support/core_ext/marshal.rb 0.0004s 16272KB
374
+ activesupport-5.2.1/lib/active_support/core_ext/enumerable.rb 0.0009s 16300KB
375
+ activesupport-5.2.1/lib/active_support/core_ext/securerandom.rb 0.0005s 16332KB
376
+ activesupport-5.2.1/lib/active_support/core_ext/big_decimal.rb 0.0003s 16348KB
377
+ active_support/core_ext 0.3828s 16348KB
378
+ --------------------------------------------------------------------------------------
379
+ active_support/all 1.4652s 16348KB
380
+ ```
381
+
382
+ ### archfiend
383
+ ```
384
+ $ bundle exec analyze_requires archfiend
385
+ name time RSS after
386
+ ---------------------------------------------------------
387
+ archfiend/version 0.0010s 1648KB
388
+ archfiend/application 0.0031s 3024KB
389
+ logger 0.0071s 4264KB
390
+ bigdecimal 0.0035s 4668KB
391
+ oj/version 0.0009s 4700KB
392
+ oj/bag 0.0010s 4756KB
393
+ oj/easy_hash 0.0009s 4796KB
394
+ oj/error 0.0008s 4824KB
395
+ ostruct 0.0026s 5540KB
396
+ oj/mimic 0.0048s 5540KB
397
+ oj/saj 0.0009s 5568KB
398
+ oj/schandler 0.0008s 5624KB
399
+ date_core 0.0029s 6096KB
400
+ oj/oj 0.0139s 6428KB
401
+ oj 0.0601s 6428KB
402
+ archfiend/logging 0.0719s 6428KB
403
+ archfiend/logging/base_formatter 0.0009s 6444KB
404
+ archfiend/logging/default_formatter 0.0007s 6456KB
405
+ archfiend/logging/json_formatter 0.0007s 6468KB
406
+ archfiend/logging/multi_logger 0.0008s 6488KB
407
+ archfiend/shared_loop/runnable 0.0007s 6488KB
408
+ archfiend/thread_loop 0.0008s 6528KB
409
+ archfiend/subprocess_loop 0.0010s 6568KB
410
+ ---------------------------------------------------------
411
+ archfiend 0.1212s 6568KB
412
+ ```
413
+
414
+ ## Contributing
415
+
416
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/gem_footprint_analyzer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
417
+
418
+ ## License
419
+
420
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
421
+
422
+ ## Code of Conduct
423
+
424
+ Everyone interacting in the GemFootprintAnalyzer project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/gem_footprint_analyzer/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gem_footprint_analyzer'
3
+ require 'optparse'
4
+
5
+ options = OpenStruct.new
6
+ options.runs = 10
7
+ options.formatter = GemFootprintAnalyzer::TextFormatter
8
+
9
+ opts_parser = OptionParser.new do |opts|
10
+ script_name = "bundle exec #{File.basename($0)}"
11
+ opts.banner = "Usage: #{script_name} library_to_analyze [require]"
12
+
13
+ opts.on('-f', '--formatter FORMATTER', %w[json text], 'Format output using selected formatter') do |formatter|
14
+ if formatter == 'json'
15
+ options.formatter = GemFootprintAnalyzer::JsonFormatter
16
+ end
17
+ end
18
+
19
+ opts.on('-n', '--runs-num NUMBER', OptParse::DecimalInteger, 'Number of runs for avergae') do |runs|
20
+ if runs < 1
21
+ fail OptionParser::InvalidArgument, 'must be a number greater than 0'
22
+ end
23
+ options.runs = runs
24
+ end
25
+
26
+ opts.on_tail('-h', '--help', 'Show this message') do
27
+ puts opts
28
+ exit
29
+ end
30
+ end
31
+ opts_parser.parse!(ARGV)
32
+
33
+ if ARGV.size < 1
34
+ puts opts_parser
35
+ exit 1
36
+ end
37
+
38
+ requires_list_average = GemFootprintAnalyzer::AverageRunner.new(options.runs) do
39
+ GemFootprintAnalyzer::Analyzer.new.test_library(*ARGV)
40
+ end.run
41
+
42
+ puts options.formatter.new.format(requires_list_average)
@@ -0,0 +1,28 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "gem_footprint_analyzer/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "gem_footprint_analyzer"
8
+ spec.version = GemFootprintAnalyzer::VERSION
9
+ spec.authors = ["Maciek Dubiński"]
10
+ spec.email = ["maciek@dubinski.net"]
11
+
12
+ spec.summary = %q{A simple tool to analyze footprint of Ruby requires.}
13
+ spec.homepage = "https://github.com/irvingwashington/gem_footprint_analyzer"
14
+ spec.license = "MIT"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.16"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 3.0"
28
+ end
@@ -0,0 +1,10 @@
1
+ require 'gem_footprint_analyzer/version'
2
+ require 'gem_footprint_analyzer/pipe_transport'
3
+ require 'gem_footprint_analyzer/require_spy'
4
+ require 'gem_footprint_analyzer/analyzer'
5
+ require 'gem_footprint_analyzer/text_formatter'
6
+ require 'gem_footprint_analyzer/json_formatter'
7
+ require 'gem_footprint_analyzer/average_runner'
8
+
9
+ module GemFootprintAnalyzer
10
+ end
@@ -0,0 +1,84 @@
1
+ module GemFootprintAnalyzer
2
+ class Analyzer
3
+
4
+ def test_library(library, require_string=nil)
5
+ try_activate_gem(library)
6
+
7
+ child_transport, parent_transport = init_transports
8
+
9
+ process_id = fork_and_require(require_string || library, child_transport)
10
+ requires = collect_requires(parent_transport, process_id)
11
+
12
+ parent_transport.ack
13
+ requires
14
+ end
15
+
16
+ private
17
+
18
+ def fork_and_require(require_string, child_transport)
19
+ GC.start
20
+ process_id = fork do
21
+ RequireSpy.spy_require(child_transport)
22
+ begin
23
+ require(require_string)
24
+ rescue LoadError => e
25
+ child_transport.exit_with_error(e)
26
+ exit
27
+ end
28
+ child_transport.done
29
+ child_transport.wait_for_ack
30
+ end
31
+ Process.detach(process_id)
32
+ process_id
33
+ end
34
+
35
+ def collect_requires(parent_transport, process_id)
36
+ base_rss = nil
37
+ requires = []
38
+ while (msg, payload = parent_transport.read_one_command)
39
+ if msg == :require
40
+ curr_rss = rss(process_id)
41
+ name, time = payload
42
+ requires << {name: name, time: Float(time) * 1000, rss: curr_rss - base_rss}
43
+ elsif msg == :already_required
44
+ elsif msg == :ready
45
+ unless base_rss
46
+ base_rss = rss(process_id)
47
+ requires << {base: true, rss: base_rss}
48
+ end
49
+ parent_transport.start
50
+ elsif msg == :exit
51
+ puts "Exiting because of exception: #{payload}"
52
+ exit 1
53
+ elsif msg == :done
54
+ break
55
+ end
56
+ end
57
+ requires
58
+ end
59
+
60
+ def try_activate_gem(library)
61
+ gem(library)
62
+ rescue Gem::LoadError
63
+ end
64
+
65
+
66
+ def pkill(process_id)
67
+ Process.kill('TERM', process_id)
68
+ end
69
+
70
+ def rss(process_id)
71
+ `ps -o rss -p #{process_id}`.split.last.strip.to_i
72
+ end
73
+
74
+ def init_transports
75
+ child_reader, parent_writer = IO.pipe
76
+ parent_reader, child_writer = IO.pipe
77
+
78
+ child_transport = GemFootprintAnalyzer::PipeTransport.new(child_reader, child_writer)
79
+ parent_transport = GemFootprintAnalyzer::PipeTransport.new(parent_reader, parent_writer)
80
+
81
+ [child_transport, parent_transport]
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,62 @@
1
+ module GemFootprintAnalyzer
2
+ class AverageRunner
3
+ RUNS = 10
4
+ AVERAGED_FIELDS = %i[rss time]
5
+
6
+ def initialize(runs=RUNS, &run_block)
7
+ fail ArgumentError, 'runs must be > 0' if runs < 1
8
+
9
+ @run_block = run_block
10
+ @runs = runs
11
+ end
12
+
13
+ def run
14
+ results = []
15
+ @runs.times do
16
+ results << run_once
17
+ end
18
+ calculate_averages(results)
19
+ end
20
+
21
+ private
22
+
23
+ def run_once
24
+ @run_block.call
25
+ end
26
+
27
+ # Take corresponding results array values and compare them
28
+ def calculate_averages(results)
29
+ average_results = []
30
+ first_run = results[0]
31
+
32
+ first_run.size.times do |require_number|
33
+ samples = results.map { |r| r[require_number] }
34
+ first_sample = samples.first
35
+
36
+ average = initialize_average_with_copied_fields(first_sample)
37
+ AVERAGED_FIELDS.map do |field|
38
+ next unless first_sample.key?(field)
39
+
40
+ average[field] = calculate_average(samples.map { |s| s[field] })
41
+ end
42
+ average_results << average
43
+ end
44
+ average_results
45
+ end
46
+
47
+ def calculate_average(values)
48
+ num = values.size
49
+ sum = values.sum.to_f
50
+ mean = sum / num
51
+
52
+ stddev = Math.sqrt(values.sum { |v| (v - mean) ** 2 } / num)
53
+ {mean: mean, sttdev: stddev}
54
+ end
55
+
56
+ def initialize_average_with_copied_fields(sample)
57
+ average = {}
58
+ (sample.keys - AVERAGED_FIELDS).each { |k| average[k] = sample[k] }
59
+ average
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+ module GemFootprintAnalyzer
2
+ class JsonFormatter
3
+ require 'json'
4
+ def format(requires_list)
5
+ JSON.dump(requires_list)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,70 @@
1
+ module GemFootprintAnalyzer
2
+ class PipeTransport
3
+ def initialize(read_stream, write_stream)
4
+ @read_stream = read_stream
5
+ @write_stream = write_stream
6
+ end
7
+
8
+ def read_one_command
9
+ str = @read_stream.gets.strip
10
+
11
+ case str
12
+ when /\Adone\z/
13
+ [:done, nil]
14
+ when /\Aack\z/
15
+ [:ack, nil]
16
+ when /\Arq: "([^"]+)",(.+)\z/
17
+ [:require, [$1, $2]]
18
+ when /\Aarq: "([^"]+)"\z/
19
+ [:already_required, $1]
20
+ when /\Astart\z/
21
+ [:start, nil]
22
+ when /\Aready\z/
23
+ [:ready, nil]
24
+ when /\Aexit: "([^"]+)"\z/
25
+ [:exit, $1]
26
+ end
27
+ end
28
+
29
+ def wait_for_start
30
+ while (msg, payload = read_one_command)
31
+ break if msg == :start
32
+ end
33
+ end
34
+
35
+ def wait_for_ack
36
+ while (msg, data = read_one_command)
37
+ break if msg == :ack
38
+ end
39
+ end
40
+
41
+ def ready
42
+ @write_stream.puts 'ready'
43
+ end
44
+
45
+ def start
46
+ @write_stream.puts 'start'
47
+ end
48
+
49
+ def ack
50
+ @write_stream.puts 'ack'
51
+ end
52
+
53
+ # Signalize finalization
54
+ def done
55
+ @write_stream.puts 'done'
56
+ end
57
+
58
+ def report_require(library, duration)
59
+ @write_stream.puts "rq: #{library.inspect},#{duration.inspect}"
60
+ end
61
+
62
+ def report_already_required(library)
63
+ @write_stream.puts "arq: #{library.inspect}"
64
+ end
65
+
66
+ def exit_with_error(e)
67
+ @write_stream.puts "exit: #{e.to_s.inspect}"
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,31 @@
1
+ module GemFootprintAnalyzer
2
+ module RequireSpy
3
+ def self.spy_require(interactor)
4
+ Kernel.alias_method :regular_require, :require
5
+
6
+ Kernel.define_method :timed_exec do |&block|
7
+ start_time = Time.now.to_f
8
+ block.call
9
+ (Time.now.to_f - start_time).round(4)
10
+ end
11
+
12
+ Kernel.define_method :require do |name|
13
+ result = nil
14
+
15
+ interactor.ready
16
+ interactor.wait_for_start
17
+
18
+ t = timed_exec do
19
+ result = regular_require(name)
20
+ end
21
+
22
+ if result
23
+ interactor.report_require(name, t)
24
+ else
25
+ interactor.report_already_required(name)
26
+ end
27
+ result
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module GemFootprintAnalyzer
2
+ class TextFormatter
3
+ TABULATION = ' '.freeze
4
+ NEWLINE = "\n".freeze
5
+
6
+ def format(requires_list)
7
+ return if requires_list.size == 1
8
+ entries_num = requires_list.size
9
+ lines = []
10
+ longest_name_length = requires_list.map { |el| el[:name]&.length }.compact.max
11
+
12
+ lines << [format_name('name', longest_name_length, false), ' time ', 'RSS after'].join(' ')
13
+ lines << dash(longest_name_length) if requires_list.size > 2
14
+
15
+ requires_list.each_with_index do |entry, i|
16
+ next if i.zero?
17
+
18
+ last_element = (i == entries_num - 1)
19
+
20
+ name, time, rss = entry.values_at(:name, :time, :rss)
21
+ lines << dash(longest_name_length) if last_element
22
+ lines << [format_name(name, longest_name_length, last_element), format_time(time), format_rss(rss)].join(' ')
23
+ end
24
+ lines.join(NEWLINE)
25
+ end
26
+
27
+ private
28
+
29
+ def format_name(name, longest_name_length, last_element = false)
30
+ left_just_size = longest_name_length + 3
31
+ left_just_size += TABULATION.size if last_element
32
+ tabulation = last_element ? '' : TABULATION
33
+ tabulation + name.ljust(left_just_size)
34
+ end
35
+
36
+ def format_time(time)
37
+ value = time.is_a?(Hash) ? time[:mean] : time
38
+ "%4dms" % value.round
39
+ end
40
+
41
+ def format_rss(rss)
42
+ value = rss.is_a?(Hash) ? rss[:mean] : rss
43
+ "%6dKB" % value
44
+ end
45
+
46
+ def dash(longest_name_length)
47
+ '-' * (longest_name_length + 22)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module GemFootprintAnalyzer
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gem_footprint_analyzer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Maciek Dubiński
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-10-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description:
56
+ email:
57
+ - maciek@dubinski.net
58
+ executables:
59
+ - analyze_requires
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - CODE_OF_CONDUCT.md
67
+ - Gemfile
68
+ - LICENSE.txt
69
+ - README.md
70
+ - Rakefile
71
+ - exe/analyze_requires
72
+ - gem_footprint_analyzer.gemspec
73
+ - lib/gem_footprint_analyzer.rb
74
+ - lib/gem_footprint_analyzer/analyzer.rb
75
+ - lib/gem_footprint_analyzer/average_runner.rb
76
+ - lib/gem_footprint_analyzer/json_formatter.rb
77
+ - lib/gem_footprint_analyzer/pipe_transport.rb
78
+ - lib/gem_footprint_analyzer/require_spy.rb
79
+ - lib/gem_footprint_analyzer/text_formatter.rb
80
+ - lib/gem_footprint_analyzer/version.rb
81
+ homepage: https://github.com/irvingwashington/gem_footprint_analyzer
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.7.6
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: A simple tool to analyze footprint of Ruby requires.
105
+ test_files: []