messagex 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +0 -0
- data/.rubocop_todo.yml +0 -0
- data/.travis.yml +0 -0
- data/Gemfile +0 -0
- data/Gemfile.lock +8 -8
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/lib/messagex/exc.rb +53 -0
- data/lib/messagex/loggerx.rb +73 -27
- data/lib/messagex/version.rb +2 -1
- data/lib/messagex.rb +100 -14
- data/messagex.gemspec +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a386955590d1742849e32e2de7d704fef132fe0c8c6c34be514affdb56423537
|
4
|
+
data.tar.gz: 76666c405b63c7e1996c91d638eb3dca914d82bbe3a0aee0b90fd5ff8760bf56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d44edde11c7dc2229f0a30569ca117a6fd06e79d18630f7ee65169b3d47a40cb74b5a9e78352d9c8567ea42674b1437c767259a796e759e2acd4cfe9e96e080
|
7
|
+
data.tar.gz: 7cf625ba7aaa239dfe4d425518c144d5733ad86a2fbc76e978064bb421d43fb38422fc2cfdd25f845bef35bb47d0bd6ae97f8737abaf876d3c97342e6a0d532c
|
data/.gitignore
CHANGED
File without changes
|
data/.rspec
CHANGED
File without changes
|
data/.rubocop.yml
CHANGED
File without changes
|
data/.rubocop_todo.yml
CHANGED
File without changes
|
data/.travis.yml
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
messagex (0.1.
|
4
|
+
messagex (0.1.4)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -20,24 +20,24 @@ GEM
|
|
20
20
|
rspec-mocks (~> 3.8.0)
|
21
21
|
rspec-core (3.8.0)
|
22
22
|
rspec-support (~> 3.8.0)
|
23
|
-
rspec-expectations (3.8.
|
23
|
+
rspec-expectations (3.8.3)
|
24
24
|
diff-lcs (>= 1.2.0, < 2.0)
|
25
25
|
rspec-support (~> 3.8.0)
|
26
26
|
rspec-mocks (3.8.0)
|
27
27
|
diff-lcs (>= 1.2.0, < 2.0)
|
28
28
|
rspec-support (~> 3.8.0)
|
29
29
|
rspec-support (3.8.0)
|
30
|
-
rubocop (0.
|
30
|
+
rubocop (0.71.0)
|
31
31
|
jaro_winkler (~> 1.5.1)
|
32
32
|
parallel (~> 1.10)
|
33
|
-
parser (>= 2.
|
33
|
+
parser (>= 2.6)
|
34
34
|
rainbow (>= 2.2.2, < 4.0)
|
35
35
|
ruby-progressbar (~> 1.7)
|
36
|
-
unicode-display_width (>= 1.4.0, < 1.
|
37
|
-
rubocop-performance (1.
|
36
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
37
|
+
rubocop-performance (1.3.0)
|
38
38
|
rubocop (>= 0.68.0)
|
39
|
-
ruby-progressbar (1.10.
|
40
|
-
unicode-display_width (1.
|
39
|
+
ruby-progressbar (1.10.1)
|
40
|
+
unicode-display_width (1.6.0)
|
41
41
|
|
42
42
|
PLATFORMS
|
43
43
|
ruby
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
File without changes
|
data/Rakefile
CHANGED
File without changes
|
data/lib/messagex/exc.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
module Messagex
|
2
|
+
#
|
3
|
+
# I/O関連例外処理管理クラス
|
2
4
|
class Exc
|
5
|
+
#
|
6
|
+
# 初期化
|
7
|
+
#
|
8
|
+
# @param mes [Messagex] Messagexクラスのインスタンス
|
3
9
|
def initialize(mes)
|
4
10
|
@mes = mes
|
5
11
|
end
|
6
12
|
|
13
|
+
#
|
14
|
+
# I/O関連例外処理
|
15
|
+
#
|
16
|
+
# @param msg [String] エラーメッセージ
|
17
|
+
# @param exit_codestr [String] 終了ステータスの識別名
|
18
|
+
# @param block [Proc] Procのインスタンス
|
7
19
|
def exc(msg, exit_codestr, block)
|
8
20
|
begin
|
9
21
|
block.call
|
@@ -18,48 +30,89 @@ module Messagex
|
|
18
30
|
end
|
19
31
|
end
|
20
32
|
|
33
|
+
#
|
34
|
+
# ディレクトリ移動失敗例外処理
|
35
|
+
#
|
36
|
+
# @param arg1 [String] 移動しようとしたディレクトリ名
|
37
|
+
# @param block [Proc] ブロック引数
|
21
38
|
def exc_change_directory(arg1, &block)
|
22
39
|
msg = "Can't change directory to |#{arg1}|"
|
23
40
|
exit_codestr = "EXIT_CODE_CANNOT_CHANGE_DIRECTORY"
|
24
41
|
exc(msg, exit_codestr, block)
|
25
42
|
end
|
26
43
|
|
44
|
+
#
|
45
|
+
# ファイルオープン失敗例外処理
|
46
|
+
#
|
47
|
+
# @param arg1 [String] エラーメッセージに組みこむ値
|
48
|
+
# @param block [Proc] ブロック引数
|
27
49
|
def exc_file_open(arg1, &block)
|
28
50
|
msg = "Cannot open file #{arg1}"
|
29
51
|
exit_codestr = "EXIT_CODE_CANNOT_OPEN_FILE"
|
30
52
|
exc(msg, exit_codestr, block)
|
31
53
|
end
|
32
54
|
|
55
|
+
#
|
56
|
+
# ファイル読込失敗例外処理
|
57
|
+
#
|
58
|
+
# @param arg1 [String] 読み込もうとしたファイル名
|
59
|
+
# @param block [Proc] ブロック引数
|
33
60
|
def exc_file_read(arg1, &block)
|
34
61
|
msg = "Cannot read file #{arg1}"
|
35
62
|
exit_codestr = "EXIT_CODE_CANNOT_READ_FILE"
|
36
63
|
exc(msg, exit_codestr, block)
|
37
64
|
end
|
38
65
|
|
66
|
+
#
|
67
|
+
# ファイル1行読込失敗例外処理
|
68
|
+
#
|
69
|
+
# @param arg1 [String] 読み込もうとしたファイル名
|
70
|
+
# @param block [Proc] ブロック引数
|
39
71
|
def exc_file_gets(arg1, &block)
|
40
72
|
msg = "Cannot read file #{arg1}"
|
41
73
|
exit_codestr = "EXIT_CODE_CANNOT_READ_FILE"
|
42
74
|
exc(msg, exit_codestr, block)
|
43
75
|
end
|
44
76
|
|
77
|
+
#
|
78
|
+
# ファイルクローズ失敗例外処理
|
79
|
+
#
|
80
|
+
# @param arg1 [String] クローズしようとしたファイル名
|
81
|
+
# @param block [Proc] ブロック引数
|
45
82
|
def exc_file_close(arg1, &block)
|
46
83
|
msg = "Cannot close file #{arg1}"
|
47
84
|
exit_codestr = "EXIT_CODE_CANNOT_OPEN_FILE"
|
48
85
|
exc(msg, exit_codestr, block)
|
49
86
|
end
|
50
87
|
|
88
|
+
#
|
89
|
+
# ファイル書込失敗例外処理
|
90
|
+
#
|
91
|
+
# @param arg1 [String] 書き込もうとしたファイル名
|
92
|
+
# @param block [Proc] ブロック引数
|
51
93
|
def exc_file_write(arg1, &block)
|
52
94
|
msg = "Cannot write file #{arg1}"
|
53
95
|
exit_codestr = "EXIT_CODE_CANNOT_WRITE_FILE"
|
54
96
|
exc(msg, exit_codestr, block)
|
55
97
|
end
|
56
98
|
|
99
|
+
#
|
100
|
+
# ファイルコピー失敗例外処理
|
101
|
+
#
|
102
|
+
# @param arg1 [String] コピー元ファイル名
|
103
|
+
# @param arg2 [String] コピー先ファイル名
|
104
|
+
# @param block [Proc] ブロック引数
|
57
105
|
def exc_file_copy(arg1, arg2, &block)
|
58
106
|
msg = "Can't copy file from #{arg1} to #{arg2}"
|
59
107
|
exit_codestr = "EXIT_CODE_CANNOT_COPY_FILE"
|
60
108
|
exc(msg, exit_codestr, block)
|
61
109
|
end
|
62
110
|
|
111
|
+
#
|
112
|
+
# ディレクトリ作成失敗例外処理
|
113
|
+
#
|
114
|
+
# @param arg1 [String] 作成しようとしたディレクトリ名
|
115
|
+
# @param block [Proc] ブロック引数
|
63
116
|
def exc_make_directory(arg1, &block)
|
64
117
|
msg = "Can't make directory to #{arg1}"
|
65
118
|
exit_codestr = "EXIT_CODE_CANNOT_MAKE_DIRECTORY"
|
data/lib/messagex/loggerx.rb
CHANGED
@@ -1,59 +1,105 @@
|
|
1
1
|
require "logger"
|
2
2
|
|
3
3
|
module Messagex
|
4
|
+
#
|
5
|
+
# 出力先が標準出力とファイルの2種類をもつログ機能管理クラス
|
4
6
|
class Loggerx
|
7
|
+
#
|
8
|
+
# 初期化
|
9
|
+
#
|
10
|
+
# @param fname [String] ログの出力先ファイル名
|
5
11
|
def initialize(fname)
|
6
|
-
@
|
7
|
-
@
|
8
|
-
@
|
12
|
+
@logger_stdout = Logger.new(STDOUT)
|
13
|
+
@logger_stdout.level = Logger::UNKNOWN
|
14
|
+
@logger_stdout.formatter = proc do |severity, _datetime, _progname, msg|
|
9
15
|
"#{severity[0]}: #{msg}\n"
|
10
16
|
end
|
11
17
|
file = File.open(fname, "w")
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@
|
18
|
+
@logger_file = Logger.new(file)
|
19
|
+
@logger_file.level = Logger::INFO
|
20
|
+
@logger_file.formatter = proc do |severity, _datetime, _progname, msg|
|
15
21
|
"#{severity}: #{msg}\n"
|
16
22
|
end
|
17
23
|
end
|
18
24
|
|
25
|
+
#
|
26
|
+
# ログ記録の日時フォーマットの設定
|
27
|
+
#
|
28
|
+
# @param format [String] ログ記録の日時フォーマット
|
29
|
+
# @return [void]
|
19
30
|
def datetime_format=(format)
|
20
|
-
@
|
21
|
-
@
|
31
|
+
@logger_stdout.datetime_format = format
|
32
|
+
@logger_file.datetime_format = format
|
22
33
|
end
|
23
34
|
|
35
|
+
#
|
36
|
+
# ログ記録のフォーマットの設定
|
37
|
+
#
|
38
|
+
# @param format [String] ログ記録のフォーマット
|
39
|
+
# @return [void]
|
24
40
|
def formatter=(format)
|
25
|
-
@
|
26
|
-
@
|
41
|
+
@logger_stdout.formatter = format
|
42
|
+
@logger_file.formatter = format
|
27
43
|
end
|
28
44
|
|
45
|
+
#
|
46
|
+
# ログレベルの設定
|
47
|
+
#
|
48
|
+
# @param value [String,Symbol] ログレベル
|
49
|
+
# @return [void]
|
29
50
|
def level=(value)
|
30
|
-
@
|
31
|
-
@
|
51
|
+
@logger_stdout.level = value
|
52
|
+
@logger_file.level = value
|
32
53
|
end
|
33
54
|
|
34
|
-
|
35
|
-
|
36
|
-
|
55
|
+
#
|
56
|
+
# ログレベルが DEBUG のメッセージを出力
|
57
|
+
#
|
58
|
+
# @param msg [String] メッセージ
|
59
|
+
# @return [void]
|
60
|
+
def debug(msg)
|
61
|
+
@logger_stdout.debug(msg)
|
62
|
+
@logger_file.debug(msg)
|
37
63
|
end
|
38
64
|
|
39
|
-
|
40
|
-
|
41
|
-
|
65
|
+
#
|
66
|
+
# ログレベルが ERROR のメッセージを出力
|
67
|
+
#
|
68
|
+
# @param msg [String] メッセージ
|
69
|
+
# @return [void]
|
70
|
+
def error(msg)
|
71
|
+
@logger_stdout.error(msg)
|
72
|
+
@logger_file.error(msg)
|
42
73
|
end
|
43
74
|
|
44
|
-
|
45
|
-
|
46
|
-
|
75
|
+
#
|
76
|
+
# ログレベルが FATAL のメッセージを出力
|
77
|
+
#
|
78
|
+
# @param msg [String] メッセージ
|
79
|
+
# @return [void]
|
80
|
+
def fatal(msg)
|
81
|
+
@logger_stdout.fatal(msg)
|
82
|
+
@logger_file.fatal(msg)
|
47
83
|
end
|
48
84
|
|
49
|
-
|
50
|
-
|
51
|
-
|
85
|
+
#
|
86
|
+
# ログレベルが WARN のメッセージを出力
|
87
|
+
#
|
88
|
+
# @param msg [String] メッセージ
|
89
|
+
# @return [void]
|
90
|
+
def warn(msg)
|
91
|
+
@logger_stdout.warn(msg)
|
92
|
+
@logger_file.warn(msg)
|
52
93
|
end
|
53
94
|
|
54
|
-
|
55
|
-
|
56
|
-
|
95
|
+
#
|
96
|
+
# ログレベルが INFO のメッセージを出力
|
97
|
+
#
|
98
|
+
# @param msg [String] メッセージ
|
99
|
+
# @return [void]
|
100
|
+
def info(msg)
|
101
|
+
@logger_stdout.info(msg)
|
102
|
+
@logger_file.info(msg)
|
57
103
|
end
|
58
104
|
end
|
59
105
|
end
|
data/lib/messagex/version.rb
CHANGED
data/lib/messagex.rb
CHANGED
@@ -1,24 +1,56 @@
|
|
1
|
+
#
|
2
|
+
# 終了ステータス管理、ログ機能管理のモジュール
|
1
3
|
module Messagex
|
4
|
+
#
|
5
|
+
# 終了ステータス管理、ログ機能管理のクラス
|
2
6
|
class Messagex
|
3
7
|
extend Forwardable
|
4
8
|
|
9
|
+
# @!method exc
|
10
|
+
# @see Exc#exc
|
11
|
+
# @!method exc_change_directory
|
12
|
+
# @see Exc#exc_change_directory]
|
13
|
+
# @!method exc_file_open
|
14
|
+
# @see Exc#exc_file_open
|
15
|
+
# @!method exc_file_read
|
16
|
+
# @see Exc#exc_file_read
|
17
|
+
# @!method exc_file_gets
|
18
|
+
# @see Exc#exc_file_gets
|
19
|
+
# @!method exc_file_close
|
20
|
+
# @see Exc#exc_file_close
|
21
|
+
# @!method exc_file_write
|
22
|
+
# @see Exc#exc_file_write
|
23
|
+
# @!method exc_file_copy
|
24
|
+
# @see Exc#exc_file_copy
|
25
|
+
# @!method exc_make_directory
|
26
|
+
# @see Exc#exc_make_directory
|
5
27
|
def_delegators :@exc_inst, :exc, :exc_change_directory, :exc_file_open, :exc_file_read, :exc_file_gets, :exc_file_close, :exc_file_write, :exc_file_copy, :exc_make_directory
|
6
28
|
|
29
|
+
# @return [Loggerx] Loggerxクラスのインスタンス
|
7
30
|
attr_reader :logger
|
8
31
|
|
9
32
|
require "messagex/version"
|
10
33
|
require "messagex/loggerx"
|
11
34
|
require "messagex/exc"
|
12
35
|
|
13
|
-
|
36
|
+
#
|
37
|
+
# 初期化
|
38
|
+
#
|
39
|
+
# @param initial_exitcode [String] 最初に登録する終了ステータスの識別名
|
40
|
+
# @param initial_num [Integer] 登録する終了ステータスの初期値
|
41
|
+
# @param debug [Symbol] ログ機能のログレベル指定 `:debug`、`:verbose`、その他
|
42
|
+
# @param logger [Loggerx] 複数のLoggerクラスのインスタンスを持つことが出来るLoggerxクラスのインスタンス
|
43
|
+
# @param logfname [String] ログの出力先ファイル名
|
44
|
+
# @note 引数debugの値はLoggerクラスのログレベル設定とは指定方法が異なる
|
45
|
+
def initialize(initial_exitcode, initial_num, debug=:warn, logger=nil, logfname=nil)
|
14
46
|
@exit_code = {}
|
15
|
-
set_initial_exitcode(
|
47
|
+
set_initial_exitcode(initial_exitcode, initial_num)
|
16
48
|
|
17
49
|
if logger
|
18
50
|
@logger = logger
|
19
51
|
else
|
20
|
-
|
21
|
-
@logger = Loggerx.new(
|
52
|
+
log_fname = (!logfname.nil? && !logfname.empty?) ? logfname : "log.txt"
|
53
|
+
@logger = Loggerx.new(log_fname)
|
22
54
|
# Logger::WARN , Logger::INFO
|
23
55
|
|
24
56
|
case debug
|
@@ -41,10 +73,14 @@ module Messagex
|
|
41
73
|
end
|
42
74
|
end
|
43
75
|
|
44
|
-
|
76
|
+
register_exitcodes
|
45
77
|
end
|
46
78
|
|
47
|
-
|
79
|
+
#
|
80
|
+
# Messagexクラスで利用する終了ステータスの登録
|
81
|
+
#
|
82
|
+
# @return [void]
|
83
|
+
def register_exitcodes
|
48
84
|
add_exitcode("EXIT_CODE_CANNOT_READ_FILE")
|
49
85
|
add_exitcode("EXIT_CODE_CANNOT_WRITE_FILE")
|
50
86
|
add_exitcode("EXIT_CODE_CANNOT_FIND_DIRECTORY")
|
@@ -54,28 +90,53 @@ module Messagex
|
|
54
90
|
add_exitcode("EXIT_CODE_CANNOT_COPY_FILE")
|
55
91
|
end
|
56
92
|
|
93
|
+
#
|
94
|
+
# I/O関連例外処理管理クラスのインスタンスの登録
|
95
|
+
#
|
96
|
+
# @return [void]
|
57
97
|
def register_exc
|
58
98
|
@exc_inst = Exc.new(self)
|
59
99
|
end
|
60
100
|
|
101
|
+
#
|
102
|
+
# 識別名で指定された終了ステータスを得る
|
103
|
+
#
|
104
|
+
# @param name [String] 登録された終了ステータスの識別名
|
105
|
+
# @return [Integer] 終了ステータス
|
61
106
|
def ec(name)
|
62
107
|
@exit_code[name]
|
63
108
|
end
|
64
109
|
|
110
|
+
#
|
111
|
+
# 終了ステータスの最初の登録
|
112
|
+
#
|
113
|
+
# @param name [String] 登録する終了ステータスの識別名
|
114
|
+
# @param num [Integer] 登録する終了ステータスの値
|
115
|
+
# @return [void]
|
65
116
|
def set_initial_exitcode(name, num)
|
66
|
-
@exit_code
|
117
|
+
@exit_code ||= {}
|
67
118
|
@exit_code[name] = num
|
68
|
-
@
|
119
|
+
@cur_exit_code = num
|
69
120
|
end
|
70
121
|
|
122
|
+
#
|
123
|
+
# 終了ステータスの値の自動割り当て
|
124
|
+
#
|
125
|
+
# @param name [String] 値の自動割り当て対象の終了ステータスの識別名
|
126
|
+
# @return [Integer] 自動割り当てされた終了ステータスの値
|
71
127
|
def add_exitcode(str)
|
72
128
|
return if @exit_code[str]
|
73
129
|
|
74
|
-
num = (@
|
130
|
+
num = (@cur_exit_code + 1)
|
75
131
|
@exit_code[str] = num
|
76
|
-
@
|
132
|
+
@cur_exit_code = num
|
77
133
|
end
|
78
134
|
|
135
|
+
#
|
136
|
+
# ログレベルが ERROR のメッセージを出力
|
137
|
+
#
|
138
|
+
# @param msg [String]
|
139
|
+
# @return [void]
|
79
140
|
def output_error(msg)
|
80
141
|
if @logger
|
81
142
|
@logger.error(msg)
|
@@ -84,6 +145,11 @@ module Messagex
|
|
84
145
|
end
|
85
146
|
end
|
86
147
|
|
148
|
+
#
|
149
|
+
# ログレベルが FATAL のメッセージを出力
|
150
|
+
#
|
151
|
+
# @param msg [String]
|
152
|
+
# @return [void]
|
87
153
|
def output_fatal(msg)
|
88
154
|
if @logger
|
89
155
|
@logger.fatal(msg)
|
@@ -92,6 +158,11 @@ module Messagex
|
|
92
158
|
end
|
93
159
|
end
|
94
160
|
|
161
|
+
#
|
162
|
+
# ログレベルが DEBUG のメッセージを出力
|
163
|
+
#
|
164
|
+
# @param msg [String]
|
165
|
+
# @return [void]
|
95
166
|
def output_debug(msg)
|
96
167
|
if @logger
|
97
168
|
@logger.debug(msg)
|
@@ -100,6 +171,11 @@ module Messagex
|
|
100
171
|
end
|
101
172
|
end
|
102
173
|
|
174
|
+
#
|
175
|
+
# ログレベルが INFO のメッセージを出力
|
176
|
+
#
|
177
|
+
# @param msg [String]
|
178
|
+
# @return [void]
|
103
179
|
def output_info(msg)
|
104
180
|
if @logger
|
105
181
|
@logger.info(msg)
|
@@ -108,6 +184,11 @@ module Messagex
|
|
108
184
|
end
|
109
185
|
end
|
110
186
|
|
187
|
+
#
|
188
|
+
# ログレベルが WARN のメッセージを出力
|
189
|
+
#
|
190
|
+
# @param msg [String]
|
191
|
+
# @return [void]
|
111
192
|
def output_warn(msg)
|
112
193
|
if @logger
|
113
194
|
@logger.warn(msg)
|
@@ -116,10 +197,15 @@ module Messagex
|
|
116
197
|
end
|
117
198
|
end
|
118
199
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
200
|
+
#
|
201
|
+
# ログレベルが ERROR のメッセージを出力
|
202
|
+
#
|
203
|
+
# @param msg [String]
|
204
|
+
# @return [void]
|
205
|
+
def output_exception(exception)
|
206
|
+
output_fatal(exception.class)
|
207
|
+
output_fatal(exception.message)
|
208
|
+
output_fatal(exception.backtrace.join("\n"))
|
123
209
|
end
|
124
210
|
end
|
125
211
|
end
|
data/messagex.gemspec
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: messagex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yasuo kominami
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|