chef-licensing 1.2.0 → 1.3.1

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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/chef-licensing.gemspec +4 -4
  3. data/lib/chef-licensing/api/client.rb +1 -1
  4. data/lib/chef-licensing/api/describe.rb +1 -1
  5. data/lib/chef-licensing/api/license_feature_entitlement.rb +1 -1
  6. data/lib/chef-licensing/api/license_software_entitlement.rb +1 -1
  7. data/lib/chef-licensing/api/list_licenses.rb +1 -1
  8. data/lib/chef-licensing/api/parser/client.rb +1 -1
  9. data/lib/chef-licensing/api/parser/describe.rb +1 -1
  10. data/lib/chef-licensing/exceptions/client_error.rb +1 -1
  11. data/lib/chef-licensing/exceptions/describe_error.rb +1 -1
  12. data/lib/chef-licensing/exceptions/error.rb +1 -1
  13. data/lib/chef-licensing/exceptions/invalid_file_format_version.rb +0 -1
  14. data/lib/chef-licensing/exceptions/invalid_license.rb +0 -1
  15. data/lib/chef-licensing/exceptions/list_licenses_error.rb +1 -1
  16. data/lib/chef-licensing/exceptions/missing_api_credentials_error.rb +1 -1
  17. data/lib/chef-licensing/exceptions/software_not_entitled.rb +1 -1
  18. data/lib/chef-licensing/license.rb +8 -12
  19. data/lib/chef-licensing/license_key_fetcher/file.rb +1 -1
  20. data/lib/chef-licensing/license_key_fetcher.rb +1 -1
  21. data/lib/chef-licensing/license_key_validator.rb +1 -1
  22. data/lib/chef-licensing/list_license_keys.rb +11 -9
  23. data/lib/chef-licensing/pstore_adapter.rb +36 -0
  24. data/lib/chef-licensing/restful_client/base.rb +2 -2
  25. data/lib/chef-licensing/restful_client/v1.rb +1 -1
  26. data/lib/chef-licensing/string_refinements.rb +25 -0
  27. data/lib/chef-licensing/tui_engine.rb +1 -1
  28. data/lib/chef-licensing/version.rb +1 -1
  29. data/lib/chef-licensing.rb +1 -1
  30. metadata +18 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3261fe05e89d3f85b80af5270597a662ebe84eaca761e43744afbc858582baeb
4
- data.tar.gz: 7234e048b9f4ab4b303381282786a0c14aef229cb6dc73d00afb00cddc00a884
3
+ metadata.gz: 13e5f43edc6c30beb26a0e866d0bb2dfa03ec09ce3abe83b91dc2ed3da9fb98b
4
+ data.tar.gz: fd51667f12831899c41162905c706055fdd8d56afccd0d124da4db103203db5e
5
5
  SHA512:
6
- metadata.gz: 18077438f71d4f67c706721df441df2403d6b2e257a6da1966e38dfa52cf975f69356c8b2421b947c74625a1c5c8f026b1848da6b1759a11f502835c51733021
7
- data.tar.gz: 649ac4de8a6df4ef59aaf7c32c8731ea0200f4b3c22e32abfb329bfb5ba7ba1a5e3f79c7e19fdad27556772ce5ef9e22016cda5354a8709f6a99c5d21445523c
6
+ metadata.gz: cb8cdeaf37e8100bee9c28ae8f5a454bdeaeda865c00875f552800fdeacc21949420d3b051068c1f43b0925d857fb310ff029161c840ee06150b761bc67e56a6
7
+ data.tar.gz: 0717c059d71531baeb045a2d0f32bc028f826873c5a8f2b535acf2837ae2e328355498a32a64d1e35eae88ba147f16cf8b07e85403dfec407cd74f93aed56da5
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  spec.files =
22
- Dir.glob("{{lib,etc}/**/*,LICENSE,chef-licensing.gemspec}")
23
- .reject { |f| File.directory?(f) }
22
+ Dir.glob("{{lib,etc}/**/*,LICENSE,chef-licensing.gemspec}")
23
+ .reject { |f| File.directory?(f) }
24
24
 
25
25
  spec.bindir = "exe"
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -28,12 +28,12 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_dependency "chef-config", ">= 15"
30
30
  spec.add_dependency "tty-prompt", "~> 0.23"
31
- spec.add_dependency "faraday", ">= 1", "< 2"
31
+ spec.add_dependency "faraday", ">= 1", "< 3"
32
32
  spec.add_dependency "faraday-http-cache"
33
- spec.add_dependency "activesupport", "~> 7.2", ">= 7.2.2.1"
34
33
  spec.add_dependency "tty-spinner", "~> 0.9.3"
35
34
  spec.add_dependency "mixlib-log", "~> 3.0"
36
35
 
37
36
  # Gem dependency needed with Ruby 3.4 upgrade
38
37
  spec.add_dependency "ostruct", "~> 0.1.0"
38
+ spec.add_dependency "pstore", "~> 0.1.1"
39
39
  end
@@ -36,4 +36,4 @@ module ChefLicensing
36
36
  attr_reader :restful_client
37
37
  end
38
38
  end
39
- end
39
+ end
@@ -59,4 +59,4 @@ module ChefLicensing
59
59
  end
60
60
  end
61
61
  end
62
- end
62
+ end
@@ -52,4 +52,4 @@ module ChefLicensing
52
52
  end
53
53
  end
54
54
  end
55
- end
55
+ end
@@ -50,4 +50,4 @@ module ChefLicensing
50
50
  end
51
51
  end
52
52
  end
53
- end
53
+ end
@@ -27,4 +27,4 @@ module ChefLicensing
27
27
  attr_reader :restful_client
28
28
  end
29
29
  end
30
- end
30
+ end
@@ -97,4 +97,4 @@ module ChefLicensing
97
97
  end
98
98
  end
99
99
  end
100
- end
100
+ end
@@ -115,4 +115,4 @@ module ChefLicensing
115
115
  end
116
116
  end
117
117
  end
118
- end
118
+ end
@@ -6,4 +6,4 @@ module ChefLicensing
6
6
  super || "License Client API failure"
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -6,4 +6,4 @@ module ChefLicensing
6
6
  super || "License Describe API failure"
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -1,4 +1,4 @@
1
1
  module ChefLicensing
2
2
  class Error < StandardError
3
3
  end
4
- end
4
+ end
@@ -7,4 +7,3 @@ module ChefLicensing
7
7
  end
8
8
  end
9
9
  end
10
-
@@ -7,4 +7,3 @@ module ChefLicensing
7
7
  end
8
8
  end
9
9
  end
10
-
@@ -9,4 +9,4 @@ module ChefLicensing
9
9
  super(message)
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -4,4 +4,4 @@ module ChefLicensing
4
4
  super || "Missing API credentials. Check README for more details."
5
5
  end
6
6
  end
7
- end
7
+ end
@@ -6,4 +6,4 @@ module ChefLicensing
6
6
  super || "Software not entitled"
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -35,10 +35,9 @@ module ChefLicensing
35
35
  def feature_entitlements
36
36
  return @feature_entitlements unless @feature_entitlements.empty?
37
37
 
38
- feat_entitlements = []
39
38
  feat_entitlements_data = @parser.parse_feature_entitlements
40
- feat_entitlements_data.each do |data|
41
- feat_entitlements << FeatureEntitlement.new(data)
39
+ feat_entitlements = feat_entitlements_data.map do |data|
40
+ FeatureEntitlement.new(data)
42
41
  end
43
42
  @feature_entitlements = feat_entitlements
44
43
  end
@@ -46,10 +45,9 @@ module ChefLicensing
46
45
  def software_entitlements
47
46
  return @software_entitlements unless @software_entitlements.empty?
48
47
 
49
- sw_entitlements = []
50
48
  sw_entitlements_data = @parser.parse_software_entitlements
51
- sw_entitlements_data.each do |data|
52
- sw_entitlements << SoftwareEntitlement.new(data)
49
+ sw_entitlements = sw_entitlements_data.map do |data|
50
+ SoftwareEntitlement.new(data)
53
51
  end
54
52
  @software_entitlements = sw_entitlements
55
53
  end
@@ -57,10 +55,9 @@ module ChefLicensing
57
55
  def asset_entitlements
58
56
  return @asset_entitlements unless @asset_entitlements.empty?
59
57
 
60
- asset_entitlements = []
61
58
  asset_entitlements_data = @parser.parse_asset_entitlements
62
- asset_entitlements_data.each do |data|
63
- asset_entitlements << AssetEntitlement.new(data)
59
+ asset_entitlements = asset_entitlements_data.map do |data|
60
+ AssetEntitlement.new(data)
64
61
  end
65
62
  @asset_entitlements = asset_entitlements
66
63
  end
@@ -68,10 +65,9 @@ module ChefLicensing
68
65
  def limits
69
66
  return @limits unless @limits.empty?
70
67
 
71
- limits = []
72
68
  limits_data = @parser.parse_limits
73
- limits_data.each do |data|
74
- limits << Limit.new(data, { product_name: @product_name })
69
+ limits = limits_data.map do |data|
70
+ Limit.new(data, { product_name: @product_name })
75
71
  end
76
72
  @limits = limits
77
73
  end
@@ -228,7 +228,7 @@ module ChefLicensing
228
228
  return nil unless path
229
229
 
230
230
  # only checking for major version for file format for breaking changes
231
- @contents ||= YAML.load(::File.read(path))
231
+ @contents ||= YAML.load_file(path)
232
232
 
233
233
  # raise error if the file_format_version key is missing
234
234
  raise LicenseFileCorrupted.new("Unrecognized license file; :file_format_version missing.") unless @contents.key?(:file_format_version)
@@ -254,7 +254,7 @@ module ChefLicensing
254
254
  def validate_and_fetch_license_type(new_keys)
255
255
  unless new_keys.empty?
256
256
  is_valid = validate_license_key(new_keys.first)
257
- return get_license_type(new_keys.first) if is_valid
257
+ get_license_type(new_keys.first) if is_valid
258
258
  end
259
259
  end
260
260
 
@@ -21,4 +21,4 @@ module ChefLicensing
21
21
  response.data || raise(ChefLicensing::InvalidLicense, response.message)
22
22
  end
23
23
  end
24
- end
24
+ end
@@ -3,9 +3,11 @@ require_relative "api/describe"
3
3
  require_relative "exceptions/describe_error"
4
4
  require "pastel" unless defined?(Pastel)
5
5
  require_relative "config"
6
+ require_relative "string_refinements"
6
7
 
7
8
  module ChefLicensing
8
9
  class ListLicenseKeys
10
+ using StringRefinements
9
11
  def self.display(opts = {})
10
12
  new(opts).display
11
13
  end
@@ -69,20 +71,20 @@ module ChefLicensing
69
71
  else
70
72
  # find the number of days left for the license to expire
71
73
  days = (Date.parse(license.expiration_date) - Date.today).to_i
72
- "#{days > 0 ? days : 0} #{"Day".pluralize(days)}"
74
+ "#{[days, 0].max} #{"Day".pluralize(days)}"
73
75
  end
74
76
  num_of_units = license.limits&.first&.usage_limit || 0
75
77
  num_of_units = num_of_units == -1 ? "Unlimited" : num_of_units
76
78
  unit_measure = license.limits&.first&.usage_measure || "unit"
77
79
  output.puts <<~LICENSE
78
- #{pastel.bold("License Details")}
79
- Asset Name : #{license.limits.first.software}
80
- License ID : #{license.id}
81
- Type : #{license_type}
82
- Status : #{license.status.capitalize}
83
- Validity : #{validity}
84
- No. Of Units : #{num_of_units} #{unit_measure.capitalize.pluralize(num_of_units)}
85
- ------------------------------------------------------------
80
+ #{pastel.bold("License Details")}
81
+ Asset Name : #{license.limits.first.software}
82
+ License ID : #{license.id}
83
+ Type : #{license_type}
84
+ Status : #{license.status.capitalize}
85
+ Validity : #{validity}
86
+ No. Of Units : #{num_of_units} #{unit_measure.capitalize.pluralize(num_of_units)}
87
+ ------------------------------------------------------------
86
88
  LICENSE
87
89
  end
88
90
  end
@@ -0,0 +1,36 @@
1
+ require "pstore"
2
+
3
+ module ChefLicensing
4
+ # Simple adapter to make PStore compatible with Faraday::HttpCache
5
+ class PStoreAdapter
6
+ def initialize(cache_dir)
7
+ @store_path = File.join(cache_dir, "chef_licensing_cache.pstore")
8
+ @store = PStore.new(@store_path)
9
+ end
10
+
11
+ # Interface methods required by faraday-http-cache
12
+ def read(key)
13
+ @store.transaction { @store[key] }
14
+ end
15
+
16
+ def write(key, value, options = {})
17
+ # PStore handles persistence, Faraday::HttpCache handles
18
+ # HTTP cache headers for expiration
19
+ @store.transaction { @store[key] = value }
20
+ end
21
+
22
+ def delete(key)
23
+ @store.transaction { @store.delete(key) }
24
+ end
25
+
26
+ def exist?(key)
27
+ @store.transaction { @store.root?(key) }
28
+ end
29
+
30
+ def clear
31
+ @store.transaction do
32
+ @store.roots.each { |root| @store.delete(root) }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,11 +1,11 @@
1
1
  require "faraday" unless defined?(Faraday)
2
2
  require "faraday/http_cache"
3
- require "active_support"
4
3
  require "tmpdir" unless defined?(Dir.mktmpdir)
5
4
  require_relative "../exceptions/restful_client_error"
6
5
  require_relative "../exceptions/restful_client_connection_error"
7
6
  require_relative "../exceptions/missing_api_credentials_error"
8
7
  require_relative "../config"
8
+ require_relative "../pstore_adapter"
9
9
  require_relative "middleware/exceptions_handler"
10
10
  require_relative "middleware/content_type_validator"
11
11
 
@@ -132,7 +132,7 @@ module ChefLicensing
132
132
  end
133
133
 
134
134
  def get_connection(url = nil)
135
- store = ::ActiveSupport::Cache.lookup_store(:file_store, Dir.tmpdir)
135
+ store = PStoreAdapter.new(Dir.tmpdir)
136
136
  Faraday.new(url: url) do |config|
137
137
  config.request :json
138
138
  config.response :json, parser_options: { object_class: OpenStruct }
@@ -12,4 +12,4 @@ module ChefLicensing
12
12
  }).freeze
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -0,0 +1,25 @@
1
+ module ChefLicensing
2
+ # String refinements to provide pluralization functionality
3
+ # Replaces ActiveSupport::Inflector for our specific use case
4
+ module StringRefinements
5
+ refine String do
6
+ def pluralize(count = 2)
7
+ return self if count == 1
8
+
9
+ # Simple pluralization rules
10
+ case downcase
11
+ when /s$/, /sh$/, /ch$/, /x$/, /z$/
12
+ "#{self}es"
13
+ when /[^aeiou]y$/
14
+ "#{self[0..-2]}ies"
15
+ when /f$/
16
+ "#{self[0..-2]}ves"
17
+ when /fe$/
18
+ "#{self[0..-3]}ves"
19
+ else
20
+ "#{self}s"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,2 +1,2 @@
1
1
  # This is simply a loader file.
2
- require_relative "tui_engine/tui_engine"
2
+ require_relative "tui_engine/tui_engine"
@@ -1,3 +1,3 @@
1
1
  module ChefLicensing
2
- VERSION = "1.2.0".freeze
2
+ VERSION = "1.3.1".freeze
3
3
  end
@@ -41,7 +41,7 @@ module ChefLicensing
41
41
  unless ChefLicensing::Config.make_licensing_optional
42
42
  if license_keys.empty?
43
43
  raise ChefLicensing::LicenseKeyFetcher::LicenseKeyNotFetchedError,
44
- "Unable to obtain a License Key."
44
+ "Unable to obtain a License Key."
45
45
  end
46
46
 
47
47
  client(license_keys: license_keys)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-licensing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inspec Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-09-29 00:00:00.000000000 Z
11
+ date: 2025-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-config
@@ -47,7 +47,7 @@ dependencies:
47
47
  version: '1'
48
48
  - - "<"
49
49
  - !ruby/object:Gem::Version
50
- version: '2'
50
+ version: '3'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -57,7 +57,7 @@ dependencies:
57
57
  version: '1'
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
- version: '2'
60
+ version: '3'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: faraday-http-cache
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -73,67 +73,61 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: activesupport
76
+ name: tty-spinner
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '7.2'
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- version: 7.2.2.1
81
+ version: 0.9.3
85
82
  type: :runtime
86
83
  prerelease: false
87
84
  version_requirements: !ruby/object:Gem::Requirement
88
85
  requirements:
89
86
  - - "~>"
90
87
  - !ruby/object:Gem::Version
91
- version: '7.2'
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: 7.2.2.1
88
+ version: 0.9.3
95
89
  - !ruby/object:Gem::Dependency
96
- name: tty-spinner
90
+ name: mixlib-log
97
91
  requirement: !ruby/object:Gem::Requirement
98
92
  requirements:
99
93
  - - "~>"
100
94
  - !ruby/object:Gem::Version
101
- version: 0.9.3
95
+ version: '3.0'
102
96
  type: :runtime
103
97
  prerelease: false
104
98
  version_requirements: !ruby/object:Gem::Requirement
105
99
  requirements:
106
100
  - - "~>"
107
101
  - !ruby/object:Gem::Version
108
- version: 0.9.3
102
+ version: '3.0'
109
103
  - !ruby/object:Gem::Dependency
110
- name: mixlib-log
104
+ name: ostruct
111
105
  requirement: !ruby/object:Gem::Requirement
112
106
  requirements:
113
107
  - - "~>"
114
108
  - !ruby/object:Gem::Version
115
- version: '3.0'
109
+ version: 0.1.0
116
110
  type: :runtime
117
111
  prerelease: false
118
112
  version_requirements: !ruby/object:Gem::Requirement
119
113
  requirements:
120
114
  - - "~>"
121
115
  - !ruby/object:Gem::Version
122
- version: '3.0'
116
+ version: 0.1.0
123
117
  - !ruby/object:Gem::Dependency
124
- name: ostruct
118
+ name: pstore
125
119
  requirement: !ruby/object:Gem::Requirement
126
120
  requirements:
127
121
  - - "~>"
128
122
  - !ruby/object:Gem::Version
129
- version: 0.1.0
123
+ version: 0.1.1
130
124
  type: :runtime
131
125
  prerelease: false
132
126
  version_requirements: !ruby/object:Gem::Requirement
133
127
  requirements:
134
128
  - - "~>"
135
129
  - !ruby/object:Gem::Version
136
- version: 0.1.0
130
+ version: 0.1.1
137
131
  description: Ruby library to support CLI tools that use Progress Chef license storage,
138
132
  generation, and entitlement.
139
133
  email:
@@ -183,10 +177,12 @@ files:
183
177
  - lib/chef-licensing/licensing_service/local.rb
184
178
  - lib/chef-licensing/list_license_keys.rb
185
179
  - lib/chef-licensing/log.rb
180
+ - lib/chef-licensing/pstore_adapter.rb
186
181
  - lib/chef-licensing/restful_client/base.rb
187
182
  - lib/chef-licensing/restful_client/middleware/content_type_validator.rb
188
183
  - lib/chef-licensing/restful_client/middleware/exceptions_handler.rb
189
184
  - lib/chef-licensing/restful_client/v1.rb
185
+ - lib/chef-licensing/string_refinements.rb
190
186
  - lib/chef-licensing/tui_engine.rb
191
187
  - lib/chef-licensing/tui_engine/tui_actions.rb
192
188
  - lib/chef-licensing/tui_engine/tui_engine.rb