utils 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +11 -0
- data/Gemfile +0 -1
- data/Rakefile +1 -0
- data/bin/probe +4 -0
- data/lib/utils/irb.rb +7 -21
- data/lib/utils/line_formatter.rb +158 -158
- data/lib/utils/version.rb +1 -1
- data/lib/utils.rb +0 -4
- data/utils.gemspec +6 -4
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7555fc93b044b6664d90d4e459d730a2f0027ba4a266af8577ac972163a91710
|
4
|
+
data.tar.gz: 5c22e9f713f59a2e2cedf64eb0e44746bd86ebd5aa40ea38a88f11524ce53ff7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 307f459fab4c993a09590af3b2b4de2a8e1ec263a40085685a95721374c36da8107a0d9a1bdb3ab15c9b8707b46a1ab45bbb1909d6046958a14cbf31c7489214
|
7
|
+
data.tar.gz: 520ca2fa9e534f9341a565c424ab2ba1d7549e72586500cdf2bd41a1c993d4ecbfbd84d8f86b038a0171158bd5a93be268201ce5b35037d8e031bf5c6eaf6bdb
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
3
|
+
# Please see the documentation for all configuration options:
|
4
|
+
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
5
|
+
|
6
|
+
version: 2
|
7
|
+
updates:
|
8
|
+
- package-ecosystem: "bundler" # See documentation for possible values
|
9
|
+
directory: "/" # Location of package manifests
|
10
|
+
schedule:
|
11
|
+
interval: "weekly"
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/bin/probe
CHANGED
data/lib/utils/irb.rb
CHANGED
@@ -318,7 +318,7 @@ module Utils
|
|
318
318
|
end
|
319
319
|
end
|
320
320
|
else
|
321
|
-
|
321
|
+
File.read filename
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
@@ -336,31 +336,17 @@ module Utils
|
|
336
336
|
STDERR.puts "Loaded '#{f}'."
|
337
337
|
end
|
338
338
|
end
|
339
|
-
Find.find('.') do |f|
|
340
|
-
File.directory?(f) and next
|
341
|
-
md5_f = Utils::MD5.md5(f)
|
342
|
-
if f.end_with?(file) and !loaded[md5_f]
|
343
|
-
Kernel.load f
|
344
|
-
loaded[md5_f] = true
|
345
|
-
STDERR.puts "Loaded '#{f}'."
|
346
|
-
end
|
347
|
-
end
|
348
339
|
end
|
349
340
|
end
|
350
341
|
nil
|
351
342
|
end
|
352
343
|
|
353
|
-
def
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
end
|
360
|
-
|
361
|
-
# List contents of directory
|
362
|
-
def ls(*args)
|
363
|
-
puts `ls #{args.map { |x| "'#{x}'" } * ' '}`
|
344
|
+
def ed(*files)
|
345
|
+
if files.empty?
|
346
|
+
$editor.full?(:edit, self)
|
347
|
+
else
|
348
|
+
$editor.full?(:edit, *files)
|
349
|
+
end
|
364
350
|
end
|
365
351
|
|
366
352
|
if defined?(ActiveRecord::Base)
|
data/lib/utils/line_formatter.rb
CHANGED
@@ -9,164 +9,164 @@ rescue LoadError => e
|
|
9
9
|
else
|
10
10
|
module Utils
|
11
11
|
class LineFormatter
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
12
|
+
::RSpec::Core::Formatters.register self, :start, :close,
|
13
|
+
:example_passed, :example_pending, :example_failed, :dump_summary
|
14
|
+
|
15
|
+
def initialize(output)
|
16
|
+
@output = output
|
17
|
+
@output.sync = true
|
18
|
+
filename = 'errors.lst'
|
19
|
+
@errors_lst = File.new(filename, 'w')
|
20
|
+
@errors_lst.sync = true
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :output
|
24
|
+
|
25
|
+
def start(_ignore)
|
26
|
+
output.puts "Storing error list in #{@errors_lst.path.inspect}: "
|
27
|
+
output.puts ?- * Tins::Terminal.columns
|
28
|
+
end
|
29
|
+
|
30
|
+
def close(_ignore)
|
31
|
+
@errors_lst.close
|
32
|
+
end
|
33
|
+
|
34
|
+
def dump_summary(summary)
|
35
|
+
line = summary_line(summary)
|
36
|
+
@errors_lst.puts ?= * 80, line
|
37
|
+
output.puts ?= * Tins::Terminal.columns, line
|
38
|
+
end
|
39
|
+
|
40
|
+
def example_passed(example)
|
41
|
+
output.puts format_line(example)
|
42
|
+
end
|
43
|
+
|
44
|
+
def example_pending(example)
|
45
|
+
output.puts format_line(example)
|
46
|
+
end
|
47
|
+
|
48
|
+
def example_failed(example)
|
49
|
+
dump_failure_to_error_file(example)
|
50
|
+
output.puts format_line(example)
|
51
|
+
dump_failure(example)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def summary_line(summary)
|
57
|
+
failure_percentage = 100 * summary.failure_count.to_f / summary.example_count
|
58
|
+
failure_percentage.nan? and failure_percentage = 0.0
|
59
|
+
pending_percentage = 100 * summary.pending_count.to_f / summary.example_count
|
60
|
+
pending_percentage.nan? and pending_percentage = 0.0
|
61
|
+
"%u of %u (%.2f %%) failed, %u pending (%.2f %%) in %.3f seconds" % [
|
62
|
+
summary.failure_count,
|
63
|
+
summary.example_count,
|
64
|
+
failure_percentage,
|
65
|
+
summary.pending_count,
|
66
|
+
pending_percentage,
|
67
|
+
summary.duration,
|
68
|
+
]
|
69
|
+
end
|
70
|
+
|
71
|
+
def dump_failure(example)
|
72
|
+
output.puts(
|
73
|
+
description(example, full: true),
|
74
|
+
dump_failure_for_example(example)
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def read_failed_line(example)
|
79
|
+
''.strip
|
80
|
+
end
|
81
|
+
|
82
|
+
def dump_failure_for_example(example)
|
83
|
+
result = ''
|
84
|
+
exception = execution_result(example).exception
|
85
|
+
exception_class_name = exception.class.name
|
86
|
+
result << "Failure/Error: #{read_failed_line(example)}\n"
|
87
|
+
result << "#{exception_class_name}:\n" unless exception_class_name =~ /RSpec/
|
88
|
+
if m = exception.message
|
89
|
+
m.to_s.split("\n").each { |line| result << " #{line}\n" }
|
90
|
+
end
|
91
|
+
result
|
92
|
+
end
|
93
|
+
|
94
|
+
def format_backtrace(example, folding: false, limit: nil)
|
95
|
+
backtrace = execution_result(example).exception.backtrace
|
96
|
+
backtrace.nil? and return ''
|
97
|
+
if limit
|
98
|
+
backtrace = backtrace[0, limit]
|
99
|
+
end
|
100
|
+
result = []
|
101
|
+
folding and result << '{{{'
|
102
|
+
for line in backtrace
|
103
|
+
result << RSpec::Core::Metadata::relative_path(line)
|
104
|
+
end
|
105
|
+
folding and result << '}}}'
|
106
|
+
result * ?\n
|
107
|
+
end
|
108
|
+
|
109
|
+
def dump_failure_to_error_file(example)
|
110
|
+
@errors_lst.flock File::LOCK_EX
|
111
|
+
@errors_lst.puts "%s\n%3.3fs %s\n%s\n%s" % [
|
112
|
+
location(example), run_time(example), description(example, full: true),
|
113
|
+
dump_failure_for_example(example), format_backtrace(example, folding: true)
|
114
|
+
]
|
115
|
+
ensure
|
116
|
+
@errors_lst.flock File::LOCK_UN
|
117
|
+
end
|
118
|
+
|
119
|
+
def execution_result(example)
|
120
|
+
example.example.metadata[:execution_result]
|
121
|
+
end
|
122
|
+
|
123
|
+
def description(example, full: ENV['VERBOSE'].to_i == 1)
|
124
|
+
if full
|
125
|
+
example.example.full_description
|
126
|
+
else
|
127
|
+
example.example.description
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def run_time(example)
|
132
|
+
execution_result(example).run_time
|
133
|
+
end
|
134
|
+
|
135
|
+
def format_line(example)
|
136
|
+
args = [ location(example), run_time(example), description(example) ]
|
137
|
+
uncolored = "%s # S %3.3fs %s" % args
|
138
|
+
uncolored = uncolored[0, Tins::Terminal.columns]
|
139
|
+
case execution_result(example).status
|
140
|
+
when :passed
|
141
|
+
success_color(uncolored)
|
142
|
+
when :failed
|
143
|
+
failure_color(uncolored)
|
144
|
+
when :pending
|
145
|
+
pending_color(uncolored)
|
146
|
+
else
|
147
|
+
uncolored % args
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def success_color(text)
|
152
|
+
Term::ANSIColor.green(text)
|
153
|
+
end
|
154
|
+
|
155
|
+
def failure_color(text)
|
156
|
+
Term::ANSIColor.red(text)
|
157
|
+
end
|
158
|
+
|
159
|
+
def pending_color(text)
|
160
|
+
Term::ANSIColor.yellow(text)
|
161
|
+
end
|
162
|
+
|
163
|
+
def location(example)
|
164
|
+
location = example.example.metadata[:location]
|
165
|
+
unless location.include?(?/)
|
166
|
+
location = example.example.metadata[:example_group][:location]
|
167
|
+
end
|
168
|
+
RSpec::Core::Metadata::relative_path(location)
|
169
|
+
end
|
170
170
|
end
|
171
171
|
end
|
172
172
|
end
|
data/lib/utils/version.rb
CHANGED
data/lib/utils.rb
CHANGED
@@ -10,10 +10,6 @@ module Utils
|
|
10
10
|
require 'utils/probe_server'
|
11
11
|
require 'utils/ssh_tunnel_specification'
|
12
12
|
require 'utils/line_blamer'
|
13
|
-
begin
|
14
|
-
require 'utils/line_formatter'
|
15
|
-
rescue LoadError
|
16
|
-
end
|
17
13
|
|
18
14
|
require 'utils/xt/source_location_extension'
|
19
15
|
class ::Object
|
data/utils.gemspec
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: utils 0.
|
2
|
+
# stub: utils 0.34.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "utils".freeze
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.34.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
11
|
-
s.date = "
|
11
|
+
s.date = "2023-01-05"
|
12
12
|
s.description = "This ruby gem provides some useful command line utilities".freeze
|
13
13
|
s.email = "flori@ping.de".freeze
|
14
14
|
s.executables = ["ascii7".freeze, "blameline".freeze, "check-yaml".freeze, "classify".freeze, "create_cstags".freeze, "create_tags".freeze, "discover".freeze, "edit".freeze, "edit_wait".freeze, "enum".freeze, "fix-brew".freeze, "git-empty".freeze, "git-versions".freeze, "irb_connect".freeze, "json_check".freeze, "long_lines".freeze, "myex".freeze, "number_files".freeze, "on_change".freeze, "path".freeze, "probe".freeze, "rd2md".freeze, "search".freeze, "sedit".freeze, "serve".freeze, "ssh-tunnel".freeze, "strip_spaces".freeze, "untest".freeze, "utils-utilsrc".freeze, "vcf2alias".freeze]
|
15
15
|
s.extra_rdoc_files = ["README.md".freeze, "lib/utils.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/file_xt.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/service.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe_server.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze]
|
16
|
-
s.files = [".github/workflows/codeql-analysis.yml".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ascii7".freeze, "bin/blameline".freeze, "bin/check-yaml".freeze, "bin/classify".freeze, "bin/create_cstags".freeze, "bin/create_tags".freeze, "bin/discover".freeze, "bin/edit".freeze, "bin/edit_wait".freeze, "bin/enum".freeze, "bin/fix-brew".freeze, "bin/git-empty".freeze, "bin/git-versions".freeze, "bin/irb_connect".freeze, "bin/json_check".freeze, "bin/long_lines".freeze, "bin/myex".freeze, "bin/number_files".freeze, "bin/on_change".freeze, "bin/path".freeze, "bin/probe".freeze, "bin/rd2md".freeze, "bin/search".freeze, "bin/sedit".freeze, "bin/serve".freeze, "bin/ssh-tunnel".freeze, "bin/strip_spaces".freeze, "bin/untest".freeze, "bin/utils-utilsrc".freeze, "bin/vcf2alias".freeze, "lib/utils.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/file_xt.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/service.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe_server.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze, "utils.gemspec".freeze]
|
16
|
+
s.files = [".github/dependabot.yml".freeze, ".github/workflows/codeql-analysis.yml".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ascii7".freeze, "bin/blameline".freeze, "bin/check-yaml".freeze, "bin/classify".freeze, "bin/create_cstags".freeze, "bin/create_tags".freeze, "bin/discover".freeze, "bin/edit".freeze, "bin/edit_wait".freeze, "bin/enum".freeze, "bin/fix-brew".freeze, "bin/git-empty".freeze, "bin/git-versions".freeze, "bin/irb_connect".freeze, "bin/json_check".freeze, "bin/long_lines".freeze, "bin/myex".freeze, "bin/number_files".freeze, "bin/on_change".freeze, "bin/path".freeze, "bin/probe".freeze, "bin/rd2md".freeze, "bin/search".freeze, "bin/sedit".freeze, "bin/serve".freeze, "bin/ssh-tunnel".freeze, "bin/strip_spaces".freeze, "bin/untest".freeze, "bin/utils-utilsrc".freeze, "bin/vcf2alias".freeze, "lib/utils.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/file_xt.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/service.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe_server.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze, "utils.gemspec".freeze]
|
17
17
|
s.homepage = "http://github.com/flori/utils".freeze
|
18
18
|
s.licenses = ["GPL-2.0".freeze]
|
19
19
|
s.rdoc_options = ["--title".freeze, "Utils - Some useful command line utilities".freeze, "--main".freeze, "README.md".freeze]
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
if s.respond_to? :add_runtime_dependency then
|
28
28
|
s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.12.0"])
|
29
|
+
s.add_development_dependency(%q<debug>.freeze, [">= 0"])
|
29
30
|
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.14"])
|
30
31
|
s.add_runtime_dependency(%q<term-ansicolor>.freeze, ["~> 1.3"])
|
31
32
|
s.add_runtime_dependency(%q<pstree>.freeze, ["~> 0.3"])
|
@@ -35,6 +36,7 @@ Gem::Specification.new do |s|
|
|
35
36
|
s.add_runtime_dependency(%q<all_images>.freeze, [">= 0.0.2"])
|
36
37
|
else
|
37
38
|
s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.12.0"])
|
39
|
+
s.add_dependency(%q<debug>.freeze, [">= 0"])
|
38
40
|
s.add_dependency(%q<tins>.freeze, ["~> 1.14"])
|
39
41
|
s.add_dependency(%q<term-ansicolor>.freeze, ["~> 1.3"])
|
40
42
|
s.add_dependency(%q<pstree>.freeze, ["~> 0.3"])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.34.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.12.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: debug
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: tins
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,6 +189,7 @@ extra_rdoc_files:
|
|
175
189
|
- lib/utils/version.rb
|
176
190
|
- lib/utils/xt/source_location_extension.rb
|
177
191
|
files:
|
192
|
+
- ".github/dependabot.yml"
|
178
193
|
- ".github/workflows/codeql-analysis.yml"
|
179
194
|
- COPYING
|
180
195
|
- Gemfile
|