hammer_cli 3.13.0 → 3.15.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/doc/creating_commands.md +29 -0
- data/doc/release_notes.md +19 -0
- data/lib/hammer_cli/apipie/option_builder.rb +2 -0
- data/lib/hammer_cli/options/option_definition.rb +6 -0
- data/lib/hammer_cli/options/option_family.rb +1 -1
- data/lib/hammer_cli/output/adapter/base.rb +6 -0
- data/lib/hammer_cli/output/fields.rb +3 -1
- data/lib/hammer_cli/version.rb +1 -1
- data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/cs_CZ/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ka/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
- data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
- data/test/unit/abstract_test.rb +1 -1
- data/test/unit/apipie/option_builder_test.rb +10 -0
- data/test/unit/fixtures/apipie/documented.json +20 -0
- data/test/unit/output/adapter/base_test.rb +32 -1
- metadata +49 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e59588fd8f86b76aee78fc150ea938650b2f5df37c6dba8e53be5d44a1117f8f
|
4
|
+
data.tar.gz: f5d84d4062dc8c9a8db3856b1e6569980c86597ae4b7d96a439c0128b832365a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 332b4e7295ee014cbf01f7abf00f41a11a67291955ac118814a832c1cd169a9e53b60cb618385a50399488311837c8c3bce78234986d3a3487107e6d9f14af0b
|
7
|
+
data.tar.gz: 7aceb50f62e7ede2ab787e89af97cf49375175c054fa301a74602506529ea7d9f4f311df4a60513fd47894c3b9e03768de04e0ba49220020cf59c9bb20c0900f
|
data/doc/creating_commands.md
CHANGED
@@ -755,6 +755,35 @@ def adapter
|
|
755
755
|
end
|
756
756
|
```
|
757
757
|
|
758
|
+
#### Deprecating fields
|
759
|
+
To deprecate a field, add `:deprecated => true` as an option for the field. This will print a warning message to stderr whenever the field is displayed. Consider removing this field from the default set so it is not displayed without a `--fields` param:
|
760
|
+
|
761
|
+
```
|
762
|
+
field :dep_fld, _("Deprecated field"), Fields::Field, :sets => ['ALL'], :deprecated => true
|
763
|
+
```
|
764
|
+
|
765
|
+
Example output:
|
766
|
+
|
767
|
+
```
|
768
|
+
$ hammer foo info --fields "Deprecated field"
|
769
|
+
Warning: Field 'Deprecated field' is deprecated and may be removed in future versions.
|
770
|
+
Deprecated field: bar
|
771
|
+
```
|
772
|
+
|
773
|
+
Additionally, a field may be 'replaced by' another field using `:replaced_by => "Path/To/New/Field"`. This will mark the field as deprecated and print a similar warning message to stderr whenever the field is displayed:
|
774
|
+
|
775
|
+
```
|
776
|
+
field :rep_fld, _("Replaced field"), Fields::Field, :sets => ['ALL'], :replaced_by => "Path/New field"
|
777
|
+
```
|
778
|
+
|
779
|
+
Example output:
|
780
|
+
|
781
|
+
```
|
782
|
+
$ hammer foo info --fields "Replaced field"
|
783
|
+
Warning: Field 'Replaced field' is deprecated. Consider using 'Path/New field' instead.
|
784
|
+
Replaced field: bar
|
785
|
+
```
|
786
|
+
|
758
787
|
#### Verbosity
|
759
788
|
Currently Hammer [defines](https://github.com/theforeman/hammer-cli/blob/master/lib/hammer_cli/verbosity.rb) three basic verbose modes:
|
760
789
|
* __QUIET__ - Prints nothing
|
data/doc/release_notes.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
Release notes
|
2
2
|
=============
|
3
|
+
### 3.15.0 (2025-05-14)
|
4
|
+
* Translate warning message ([PR #396](https://github.com/theforeman/hammer-cli/pull/396)), [#38410](http://projects.theforeman.org/issues/38410)
|
5
|
+
* Add mechanism for deprecating displayed fields ([PR #395](https://github.com/theforeman/hammer-cli/pull/395)), [#38410](http://projects.theforeman.org/issues/38410)
|
6
|
+
* Fix test using #inspect on a hash
|
7
|
+
* Add base64 and csv dependencies for ruby 3.4 compatibility
|
8
|
+
* Fix gemspec/ordereddependencies cop
|
9
|
+
* Use actions/checkout@v4
|
10
|
+
* Bump to 3.15.0-develop
|
11
|
+
|
12
|
+
### 3.14.0 (2025-02-20)
|
13
|
+
* Check better for parent option desc injection, [#38126](http://projects.theforeman.org/issues/38126)
|
14
|
+
* Bump apipie-bindings to 0.7.0
|
15
|
+
* Don't build hidden params as options ([PR #390](https://github.com/theforeman/hammer-cli/pull/390)), [#38077](http://projects.theforeman.org/issues/38077)
|
16
|
+
* Use master branch of apipie-bindings in ci
|
17
|
+
* Drop el 8 from packit config
|
18
|
+
* Use non-deprecated gpl-3.0-only license tag
|
19
|
+
* Pin ffi to < 1.17 for ruby 2.7 ([PR #387](https://github.com/theforeman/hammer-cli/pull/387))
|
20
|
+
* Bump to 3.14.0-develop
|
21
|
+
|
3
22
|
### 3.13.0 (2024-11-08)
|
4
23
|
* Bump to 3.13.0-develop
|
5
24
|
|
@@ -30,6 +30,7 @@ module HammerCLI::Apipie
|
|
30
30
|
def options_for_params(params, filter, resource_name_map, opts = {})
|
31
31
|
options = []
|
32
32
|
params.each do |p|
|
33
|
+
next unless p.show?
|
33
34
|
exists = opts[:command].find_option(option_switch(p, resource_name_map))
|
34
35
|
next if filter.include?(p.name) || filter.include?(p.name.to_sym) || exists
|
35
36
|
|
@@ -85,6 +86,7 @@ module HammerCLI::Apipie
|
|
85
86
|
opts[:attribute_name] = HammerCLI.option_accessor_name(param.name)
|
86
87
|
opts[:referenced_resource] = resource_name(param)
|
87
88
|
opts[:aliased_resource] = aliased_name(resource_name(param), resource_name_map)
|
89
|
+
opts[:show] = param.show?
|
88
90
|
|
89
91
|
return opts
|
90
92
|
end
|
@@ -30,6 +30,8 @@ module HammerCLI
|
|
30
30
|
@context_target = options[:context_target]
|
31
31
|
@deprecated_switches = options[:deprecated]
|
32
32
|
@family = options[:family]
|
33
|
+
# We expect a value from API param docs, but in case it's not there, we want to show it in help by default
|
34
|
+
@show = options.fetch(:show, true)
|
33
35
|
super
|
34
36
|
end
|
35
37
|
|
@@ -153,6 +155,10 @@ module HammerCLI
|
|
153
155
|
@family.children.include?(self)
|
154
156
|
end
|
155
157
|
|
158
|
+
def show?
|
159
|
+
@show
|
160
|
+
end
|
161
|
+
|
156
162
|
private
|
157
163
|
|
158
164
|
def format_deprecation_msg(option_desc, deprecation_msg)
|
@@ -27,7 +27,7 @@ module HammerCLI
|
|
27
27
|
def description
|
28
28
|
types = all.map(&:type).map { |s| s.split('_').last.to_s }
|
29
29
|
.map(&:downcase).join('/')
|
30
|
-
parent_desc = @parent.help[1].gsub(IDS_REGEX) { |w| w.gsub(/\b.+\b/, types) }
|
30
|
+
parent_desc = @parent.help[1].gsub(IDS_REGEX) { |w| types.include?(w.strip.downcase) ? w.gsub(/\b.+\b/, types) : w }
|
31
31
|
desc = @options[:description] || parent_desc.strip.empty? ? @options[:description] : parent_desc
|
32
32
|
if @options[:deprecation].class <= String
|
33
33
|
format_deprecation_msg(desc, _('Deprecated: %{deprecated_msg}') % { deprecated_msg: @options[:deprecation] })
|
@@ -42,6 +42,12 @@ module HammerCLI::Output::Adapter
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def render_field(field, data, label_width)
|
45
|
+
if field.replaced_by
|
46
|
+
warn _("Warning: Field '%{field}' is deprecated. Consider using '%{replacement}' instead.") % { field: field.full_label, replacement: field.replaced_by }
|
47
|
+
elsif field.deprecated
|
48
|
+
warn _("Warning: Field '%{field}' is deprecated and may be removed in future versions.") % { field: field.full_label }
|
49
|
+
end
|
50
|
+
|
45
51
|
if field.is_a? Fields::ContainerField
|
46
52
|
output = ""
|
47
53
|
|
@@ -4,7 +4,7 @@ module Fields
|
|
4
4
|
class Field
|
5
5
|
attr_reader :path
|
6
6
|
attr_writer :sets
|
7
|
-
attr_accessor :label, :parent
|
7
|
+
attr_accessor :label, :parent, :replaced_by, :deprecated
|
8
8
|
|
9
9
|
def initialize(options={})
|
10
10
|
@hide_blank = options[:hide_blank].nil? ? false : options[:hide_blank]
|
@@ -12,6 +12,8 @@ module Fields
|
|
12
12
|
@path = options[:path] || []
|
13
13
|
@label = options[:label]
|
14
14
|
@sets = options[:sets]
|
15
|
+
@replaced_by = options[:replaced_by]
|
16
|
+
@deprecated = (options[:deprecated].nil?) ? !@replaced_by.nil? : options[:deprecated]
|
15
17
|
@options = options
|
16
18
|
end
|
17
19
|
|
data/lib/hammer_cli/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/test/unit/abstract_test.rb
CHANGED
@@ -185,7 +185,7 @@ describe HammerCLI::AbstractCommand do
|
|
185
185
|
test_command_class.option(['--password'], 'PASSWORD', 'Password')
|
186
186
|
test_command = test_command_class.new("")
|
187
187
|
test_command.run ['--password=pass']
|
188
|
-
_(@log_output.readline.strip).
|
188
|
+
_(@log_output.readline.strip).must_match(%r{INFO HammerCLI::AbstractCommand : Called with options: {\"option_password\"\s*=>\s*\"\*\*\*\"}})
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
@@ -178,4 +178,14 @@ describe HammerCLI::Apipie::OptionBuilder do
|
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
|
+
context "hidden parameters" do
|
182
|
+
let(:action) { resource.action(:create) }
|
183
|
+
|
184
|
+
it "should skip options for params with show? false" do
|
185
|
+
option_switches = options.map(&:long_switch)
|
186
|
+
refute_includes(option_switches, "--hidden")
|
187
|
+
refute_includes(option_switches, "--documented-scope")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
181
191
|
end
|
@@ -75,6 +75,16 @@
|
|
75
75
|
"examples": [],
|
76
76
|
"errors": [],
|
77
77
|
"params": [
|
78
|
+
{
|
79
|
+
"allow_null": false,
|
80
|
+
"name": "documented_scope",
|
81
|
+
"full_name": "documented_scope",
|
82
|
+
"validator": "Must be String",
|
83
|
+
"description": "",
|
84
|
+
"expected_type": "string",
|
85
|
+
"required": false,
|
86
|
+
"show": false
|
87
|
+
},
|
78
88
|
{
|
79
89
|
"allow_null": false,
|
80
90
|
"name": "documented",
|
@@ -110,6 +120,16 @@
|
|
110
120
|
"expected_type": "array",
|
111
121
|
"description": "",
|
112
122
|
"required": true
|
123
|
+
},
|
124
|
+
{
|
125
|
+
"name": "hidden",
|
126
|
+
"allow_null": false,
|
127
|
+
"full_name": "documented[hidden]",
|
128
|
+
"validator": "Must be number",
|
129
|
+
"expected_type": "number",
|
130
|
+
"description": "",
|
131
|
+
"required": false,
|
132
|
+
"show": false
|
113
133
|
}
|
114
134
|
]
|
115
135
|
}
|
@@ -28,6 +28,9 @@ describe HammerCLI::Output::Adapter::Base do
|
|
28
28
|
let(:blank) { Fields::Field.new(:path => [:blank], :label => "Blank", :hide_blank => true) }
|
29
29
|
let(:login) { Fields::Field.new(:path => [:login], :label => "Login") }
|
30
30
|
let(:missing) { Fields::Field.new(:path => [:login], :label => "Missing", :hide_missing => false) }
|
31
|
+
let (:deprecated_a) { Fields::Field.new(:path => [:deprecated_a], :label => "Deprecated", :deprecated => true) }
|
32
|
+
let (:new_field) { Fields::Field.new(:path => [:new_field], :label => "New field") }
|
33
|
+
let (:deprecated_b) { Fields::Field.new(:path => [:deprecated_b], :label => "Replaced by", :replaced_by => 'New field') }
|
31
34
|
|
32
35
|
let(:data) { HammerCLI::Output::RecordCollection.new [{
|
33
36
|
:id => 112,
|
@@ -55,7 +58,10 @@ describe HammerCLI::Output::Adapter::Base do
|
|
55
58
|
:name => 'size',
|
56
59
|
:value => '32'
|
57
60
|
}
|
58
|
-
]
|
61
|
+
],
|
62
|
+
deprecated_a: 'deprecated_a',
|
63
|
+
deprecated_b: 'deprecated_b',
|
64
|
+
new_field: 'new_field'
|
59
65
|
}]}
|
60
66
|
|
61
67
|
it "should print one field" do
|
@@ -199,6 +205,31 @@ describe HammerCLI::Output::Adapter::Base do
|
|
199
205
|
_{ adapter.print_collection(fields, data) }.must_output(expected_output)
|
200
206
|
end
|
201
207
|
|
208
|
+
it "should warn about deprecated fields" do
|
209
|
+
fields = [deprecated_a]
|
210
|
+
|
211
|
+
expected_stdout= [
|
212
|
+
"Deprecated: deprecated_a",
|
213
|
+
"\n"
|
214
|
+
].join("\n")
|
215
|
+
expected_stderr = "Warning: Field 'Deprecated' is deprecated and may be removed in future versions.\n"
|
216
|
+
|
217
|
+
_{ adapter.print_collection(fields, data) }.must_output(stdout=expected_stdout, stderr=expected_stderr)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should warn about replaced fields" do
|
221
|
+
fields = [new_field, deprecated_b]
|
222
|
+
|
223
|
+
expected_stdout= [
|
224
|
+
"New field: new_field",
|
225
|
+
"Replaced by: deprecated_b",
|
226
|
+
"\n"
|
227
|
+
].join("\n")
|
228
|
+
expected_stderr = "Warning: Field 'Replaced by' is deprecated. Consider using 'New field' instead.\n"
|
229
|
+
|
230
|
+
_{ adapter.print_collection(fields, data) }.must_output(stdout=expected_stdout, stderr=expected_stderr)
|
231
|
+
end
|
232
|
+
|
202
233
|
context 'printing by chunks' do
|
203
234
|
let(:context) { { show_ids: true } }
|
204
235
|
let(:collection_count) { 30 }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hammer_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Bačovský
|
@@ -9,30 +9,38 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2025-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: amazing_print
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
-
- - "<"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 2.0.0
|
20
|
+
version: '0'
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
25
|
- - ">="
|
29
26
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
31
|
-
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: apipie-bindings
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
+
version: 0.7.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 0.7.0
|
34
42
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
43
|
+
name: base64
|
36
44
|
requirement: !ruby/object:Gem::Requirement
|
37
45
|
requirements:
|
38
46
|
- - ">="
|
@@ -46,21 +54,27 @@ dependencies:
|
|
46
54
|
- !ruby/object:Gem::Version
|
47
55
|
version: '0'
|
48
56
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
57
|
+
name: clamp
|
50
58
|
requirement: !ruby/object:Gem::Requirement
|
51
59
|
requirements:
|
52
60
|
- - ">="
|
53
61
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
62
|
+
version: 1.3.1
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 2.0.0
|
55
66
|
type: :runtime
|
56
67
|
prerelease: false
|
57
68
|
version_requirements: !ruby/object:Gem::Requirement
|
58
69
|
requirements:
|
59
70
|
- - ">="
|
60
71
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
72
|
+
version: 1.3.1
|
73
|
+
- - "<"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.0.0
|
62
76
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
77
|
+
name: csv
|
64
78
|
requirement: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - ">="
|
@@ -74,7 +88,7 @@ dependencies:
|
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
90
|
- !ruby/object:Gem::Dependency
|
77
|
-
name:
|
91
|
+
name: fast_gettext
|
78
92
|
requirement: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - ">="
|
@@ -88,7 +102,7 @@ dependencies:
|
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '0'
|
90
104
|
- !ruby/object:Gem::Dependency
|
91
|
-
name:
|
105
|
+
name: highline
|
92
106
|
requirement: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - ">="
|
@@ -116,19 +130,33 @@ dependencies:
|
|
116
130
|
- !ruby/object:Gem::Version
|
117
131
|
version: 2.0.6
|
118
132
|
- !ruby/object:Gem::Dependency
|
119
|
-
name:
|
133
|
+
name: logging
|
120
134
|
requirement: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0
|
138
|
+
version: '0'
|
125
139
|
type: :runtime
|
126
140
|
prerelease: false
|
127
141
|
version_requirements: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0
|
145
|
+
version: '0'
|
146
|
+
- !ruby/object:Gem::Dependency
|
147
|
+
name: unicode-display_width
|
148
|
+
requirement: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
type: :runtime
|
154
|
+
prerelease: false
|
155
|
+
version_requirements: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
132
160
|
description: 'Hammer cli provides universal extendable CLI interface for ruby apps
|
133
161
|
|
134
162
|
'
|
@@ -367,7 +395,7 @@ files:
|
|
367
395
|
- test/unit/utils_test.rb
|
368
396
|
homepage: https://github.com/theforeman/hammer-cli
|
369
397
|
licenses:
|
370
|
-
- GPL-3.0
|
398
|
+
- GPL-3.0-only
|
371
399
|
metadata: {}
|
372
400
|
post_install_message:
|
373
401
|
rdoc_options: []
|