lino 2.1.0 → 2.2.0.pre.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +58 -1
- data/Rakefile +2 -0
- data/lib/lino/appliables.rb +23 -0
- data/lib/lino/command_line_builder.rb +46 -12
- data/lib/lino/options.rb +25 -0
- data/lib/lino/subcommand_builder.rb +2 -0
- data/lib/lino/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 729c96dd84a7a44337298eb3de557d061565d5f4defc5bd2077431e20f0917cc
|
4
|
+
data.tar.gz: 03c7697d78175ad6e2135540d2babeee039a9cdfd77cbcd789137db66561aa80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95af24c97c8d11bdbcdd44be3f78a72e0474fa8665f3bf3b67546caf34f6e93c7ba971b94df2efc8ae9a9b6f3e831a17c1dd04e07416fd54d48d9dd5ffed12e3
|
7
|
+
data.tar.gz: 151036608c99015ea9494e6ec17b21cb0055e6616d34669ca54009fe7b033b72de5323a240972763d512395ed3374a4d2134865f9ff89db535b5f5ca5bd9ae01
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -62,6 +62,30 @@ Lino::CommandLineBuilder.for_command('gpg')
|
|
62
62
|
|
63
63
|
# => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
|
64
64
|
|
65
|
+
# ... or alternatively
|
66
|
+
Lino::CommandLineBuilder.for_command('gpg')
|
67
|
+
.with_options({
|
68
|
+
'--recipient' => 'tobyclemson@gmail.com',
|
69
|
+
'--sign' => './doc.txt'
|
70
|
+
})
|
71
|
+
.build
|
72
|
+
.to_s
|
73
|
+
|
74
|
+
# => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
|
75
|
+
|
76
|
+
# ... or alternatively
|
77
|
+
Lino::CommandLineBuilder.for_command('gpg')
|
78
|
+
.with_options(
|
79
|
+
[
|
80
|
+
{ option: '--recipient', value: 'tobyclemson@gmail.com' },
|
81
|
+
{ option: '--sign', value: './doc.txt' }
|
82
|
+
]
|
83
|
+
)
|
84
|
+
.build
|
85
|
+
.to_s
|
86
|
+
|
87
|
+
# => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
|
88
|
+
|
65
89
|
# commands with an option repeated multiple times
|
66
90
|
Lino::CommandLineBuilder.for_command('example.sh')
|
67
91
|
.with_repeated_option('--opt', ['file1.txt', nil, '', 'file2.txt'])
|
@@ -79,7 +103,7 @@ Lino::CommandLineBuilder.for_command('diff')
|
|
79
103
|
|
80
104
|
# => diff ./file1.txt ./file2.txt
|
81
105
|
|
82
|
-
#
|
106
|
+
# ... or alternatively
|
83
107
|
Lino::CommandLineBuilder.for_command('diff')
|
84
108
|
.with_arguments(['./file1.txt', nil, '', './file2.txt'])
|
85
109
|
.build
|
@@ -142,6 +166,39 @@ Lino::CommandLineBuilder.for_command('node')
|
|
142
166
|
.to_s
|
143
167
|
|
144
168
|
# => PORT=3030 LOG_LEVEL=debug node ./server.js
|
169
|
+
|
170
|
+
# note: by default, options are placed after the command, before all subcommands
|
171
|
+
# and arguments
|
172
|
+
|
173
|
+
# this can be expressed explicitly
|
174
|
+
Lino::CommandLineBuilder.for_command('gcloud')
|
175
|
+
.with_options_after_command
|
176
|
+
.with_option('--password', 'super-secure')
|
177
|
+
.with_subcommands(%w[sql instances set-root-password some-database])
|
178
|
+
.build
|
179
|
+
.to_s
|
180
|
+
|
181
|
+
# => gcloud --password super-secure sql instances set-root-password some-database
|
182
|
+
|
183
|
+
# options can also come after subcommands
|
184
|
+
Lino::CommandLineBuilder.for_command('gcloud')
|
185
|
+
.with_options_after_subcommands
|
186
|
+
.with_option('--password', 'super-secure')
|
187
|
+
.with_subcommands(%w[sql instances set-root-password some-database])
|
188
|
+
.build
|
189
|
+
.to_s
|
190
|
+
|
191
|
+
# => gcloud sql instances set-root-password some-database --password super-secure
|
192
|
+
|
193
|
+
# options can also come after arguments, although usages of this are rare
|
194
|
+
Lino::CommandLineBuilder.for_command('ls')
|
195
|
+
.with_options_after_arguments
|
196
|
+
.with_flag('-l')
|
197
|
+
.with_argument('/some/directory')
|
198
|
+
.build
|
199
|
+
.to_s
|
200
|
+
|
201
|
+
# => ls /some/directory -l
|
145
202
|
```
|
146
203
|
|
147
204
|
### `Lino::CommandLine`
|
data/Rakefile
CHANGED
@@ -16,6 +16,7 @@ task default: %i[
|
|
16
16
|
|
17
17
|
namespace :encryption do
|
18
18
|
namespace :passphrase do
|
19
|
+
desc 'Generate encryption passphrase for CI GPG key'
|
19
20
|
task :generate do
|
20
21
|
File.open('config/secrets/ci/encryption.passphrase', 'w') do |f|
|
21
22
|
f.write(SecureRandom.base64(36))
|
@@ -96,6 +97,7 @@ RakeGithub.define_repository_tasks(
|
|
96
97
|
end
|
97
98
|
|
98
99
|
namespace :pipeline do
|
100
|
+
desc 'Prepare CircleCI Pipeline'
|
99
101
|
task prepare: %i[
|
100
102
|
circle_ci:project:follow
|
101
103
|
circle_ci:env_vars:ensure
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'utilities'
|
4
|
+
|
5
|
+
module Lino
|
6
|
+
module Appliables
|
7
|
+
include Lino::Utilities
|
8
|
+
|
9
|
+
def with_appliable(appliable)
|
10
|
+
return self if missing?(appliable)
|
11
|
+
|
12
|
+
appliable.apply(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_appliables(appliables)
|
16
|
+
return self if missing?(appliables)
|
17
|
+
|
18
|
+
appliables.inject(self) do |s, appliable|
|
19
|
+
s.with_appliable(appliable)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -5,12 +5,23 @@ require_relative 'utilities'
|
|
5
5
|
require_relative 'command_line'
|
6
6
|
require_relative 'subcommand_builder'
|
7
7
|
require_relative 'options'
|
8
|
+
require_relative 'appliables'
|
8
9
|
|
9
10
|
module Lino
|
10
11
|
# rubocop:disable Metrics/ClassLength
|
11
12
|
class CommandLineBuilder
|
13
|
+
SELECTORS = {
|
14
|
+
after_command:
|
15
|
+
%i[environment_variables command options subcommands arguments],
|
16
|
+
after_subcommands:
|
17
|
+
%i[environment_variables command subcommands options arguments],
|
18
|
+
after_arguments:
|
19
|
+
%i[environment_variables command subcommands arguments options]
|
20
|
+
}.freeze
|
21
|
+
|
12
22
|
include Lino::Utilities
|
13
23
|
include Lino::Options
|
24
|
+
include Lino::Appliables
|
14
25
|
|
15
26
|
class << self
|
16
27
|
def for_command(command)
|
@@ -26,7 +37,8 @@ module Lino
|
|
26
37
|
arguments: [],
|
27
38
|
environment_variables: [],
|
28
39
|
option_separator: ' ',
|
29
|
-
option_quoting: nil
|
40
|
+
option_quoting: nil,
|
41
|
+
option_placement: :after_command
|
30
42
|
)
|
31
43
|
@command = command
|
32
44
|
@subcommands = Hamster::Vector.new(subcommands)
|
@@ -35,6 +47,7 @@ module Lino
|
|
35
47
|
@environment_variables = Hamster::Vector.new(environment_variables)
|
36
48
|
@option_separator = option_separator
|
37
49
|
@option_quoting = option_quoting
|
50
|
+
@option_placement = option_placement
|
38
51
|
end
|
39
52
|
# rubocop:enable Metrics/ParameterLists
|
40
53
|
|
@@ -65,6 +78,18 @@ module Lino
|
|
65
78
|
with(option_quoting: character)
|
66
79
|
end
|
67
80
|
|
81
|
+
def with_options_after_command
|
82
|
+
with(option_placement: :after_command)
|
83
|
+
end
|
84
|
+
|
85
|
+
def with_options_after_subcommands
|
86
|
+
with(option_placement: :after_subcommands)
|
87
|
+
end
|
88
|
+
|
89
|
+
def with_options_after_arguments
|
90
|
+
with(option_placement: :after_arguments)
|
91
|
+
end
|
92
|
+
|
68
93
|
def with_argument(argument)
|
69
94
|
return self if missing?(argument)
|
70
95
|
|
@@ -72,6 +97,8 @@ module Lino
|
|
72
97
|
end
|
73
98
|
|
74
99
|
def with_arguments(arguments)
|
100
|
+
return self if missing?(arguments)
|
101
|
+
|
75
102
|
arguments.inject(self) { |s, argument| s.with_argument(argument) }
|
76
103
|
end
|
77
104
|
|
@@ -87,21 +114,27 @@ module Lino
|
|
87
114
|
end
|
88
115
|
|
89
116
|
def build
|
90
|
-
components =
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
formatted_arguments
|
96
|
-
]
|
97
|
-
|
98
|
-
command_string = components.reject(&:empty?).join(' ')
|
117
|
+
components = formatted_components
|
118
|
+
command_line = SELECTORS[@option_placement]
|
119
|
+
.inject([]) { |c, key| c << components[key] }
|
120
|
+
.reject(&:empty?)
|
121
|
+
.join(' ')
|
99
122
|
|
100
|
-
CommandLine.new(
|
123
|
+
CommandLine.new(command_line)
|
101
124
|
end
|
102
125
|
|
103
126
|
private
|
104
127
|
|
128
|
+
def formatted_components
|
129
|
+
{
|
130
|
+
environment_variables: formatted_environment_variables,
|
131
|
+
command: @command,
|
132
|
+
options: formatted_options,
|
133
|
+
subcommands: formatted_subcommands,
|
134
|
+
arguments: formatted_arguments
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
105
138
|
def formatted_environment_variables
|
106
139
|
map_and_join(@environment_variables) do |var|
|
107
140
|
"#{var[0]}=\"#{var[1].to_s.gsub(/"/, '\\"')}\""
|
@@ -140,7 +173,8 @@ module Lino
|
|
140
173
|
arguments: @arguments,
|
141
174
|
environment_variables: @environment_variables,
|
142
175
|
option_separator: @option_separator,
|
143
|
-
option_quoting: @option_quoting
|
176
|
+
option_quoting: @option_quoting,
|
177
|
+
option_placement: @option_placement
|
144
178
|
}
|
145
179
|
end
|
146
180
|
end
|
data/lib/lino/options.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'utilities'
|
4
|
+
|
3
5
|
module Lino
|
4
6
|
module Options
|
7
|
+
include Lino::Utilities
|
8
|
+
|
5
9
|
def with_option(option, value, separator: nil, quoting: nil)
|
6
10
|
return self if missing?(value)
|
7
11
|
|
@@ -14,6 +18,19 @@ module Lino
|
|
14
18
|
))
|
15
19
|
end
|
16
20
|
|
21
|
+
def with_options(options)
|
22
|
+
return self if missing?(options)
|
23
|
+
|
24
|
+
options.entries.inject(self) do |s, entry|
|
25
|
+
s.with_option(
|
26
|
+
entry.include?(:option) ? entry[:option] : entry[0],
|
27
|
+
entry.include?(:value) ? entry[:value] : entry[1],
|
28
|
+
separator: (entry.include?(:separator) ? entry[:separator] : nil),
|
29
|
+
quoting: (entry.include?(:quoting) ? entry[:quoting] : nil)
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
17
34
|
def with_repeated_option(option, values, separator: nil, quoting: nil)
|
18
35
|
values.inject(self) do |s, value|
|
19
36
|
s.with_option(option, value, separator: separator, quoting: quoting)
|
@@ -21,7 +38,15 @@ module Lino
|
|
21
38
|
end
|
22
39
|
|
23
40
|
def with_flag(flag)
|
41
|
+
return self if missing?(flag)
|
42
|
+
|
24
43
|
with(options: @options.add({ components: [flag] }))
|
25
44
|
end
|
45
|
+
|
46
|
+
def with_flags(flags)
|
47
|
+
return self if missing?(flags)
|
48
|
+
|
49
|
+
flags.inject(self) { |s, flag| s.with_flag(flag) }
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
@@ -3,11 +3,13 @@
|
|
3
3
|
require 'hamster'
|
4
4
|
require_relative 'utilities'
|
5
5
|
require_relative 'options'
|
6
|
+
require_relative 'appliables'
|
6
7
|
|
7
8
|
module Lino
|
8
9
|
class SubcommandBuilder
|
9
10
|
include Lino::Utilities
|
10
11
|
include Lino::Options
|
12
|
+
include Lino::Appliables
|
11
13
|
|
12
14
|
class <<self
|
13
15
|
def for_subcommand(subcommand)
|
data/lib/lino/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lino
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0.pre.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toby Clemson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hamster
|
@@ -222,6 +222,7 @@ files:
|
|
222
222
|
- bin/console
|
223
223
|
- bin/setup
|
224
224
|
- lib/lino.rb
|
225
|
+
- lib/lino/appliables.rb
|
225
226
|
- lib/lino/command_line.rb
|
226
227
|
- lib/lino/command_line_builder.rb
|
227
228
|
- lib/lino/options.rb
|
@@ -243,9 +244,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
243
244
|
version: '2.6'
|
244
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
246
|
requirements:
|
246
|
-
- - "
|
247
|
+
- - ">"
|
247
248
|
- !ruby/object:Gem::Version
|
248
|
-
version:
|
249
|
+
version: 1.3.1
|
249
250
|
requirements: []
|
250
251
|
rubygems_version: 3.0.1
|
251
252
|
signing_key:
|