chef-licensing 1.2.0 → 1.3.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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/chef-licensing.gemspec +4 -3
  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 +3 -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 +21 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3261fe05e89d3f85b80af5270597a662ebe84eaca761e43744afbc858582baeb
4
- data.tar.gz: 7234e048b9f4ab4b303381282786a0c14aef229cb6dc73d00afb00cddc00a884
3
+ metadata.gz: b35b9075f13075e463a2db5db81b9d251333660b72a4f7dff2e1f00f16c1761c
4
+ data.tar.gz: a3e97bdd083ff58a06c0056d3d06503a79222f39e788d58a468d74a2e5492cb6
5
5
  SHA512:
6
- metadata.gz: 18077438f71d4f67c706721df441df2403d6b2e257a6da1966e38dfa52cf975f69356c8b2421b947c74625a1c5c8f026b1848da6b1759a11f502835c51733021
7
- data.tar.gz: 649ac4de8a6df4ef59aaf7c32c8731ea0200f4b3c22e32abfb329bfb5ba7ba1a5e3f79c7e19fdad27556772ce5ef9e22016cda5354a8709f6a99c5d21445523c
6
+ metadata.gz: 6ae4578953b54784282f50d2f688e3fce57b9ab07f0544620070e42ad8dee26cb71608d0a91432167ada76e1dd098e14d1a92f7148614fabc7cf837f7ced4d4d
7
+ data.tar.gz: 31ae1f7f4c610fb21b1be1453ddabc6a1645221ad82f6e83406619d675ebac0bf80a42991f8c0e890e2e0a52fbbe908caa35bf4405f913432e6b503a879fd676
@@ -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) }
@@ -30,10 +30,11 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "tty-prompt", "~> 0.23"
31
31
  spec.add_dependency "faraday", ">= 1", "< 2"
32
32
  spec.add_dependency "faraday-http-cache"
33
- spec.add_dependency "activesupport", "~> 7.2", ">= 7.2.2.1"
33
+ spec.add_dependency "faraday_middleware", "~> 1.0"
34
34
  spec.add_dependency "tty-spinner", "~> 0.9.3"
35
35
  spec.add_dependency "mixlib-log", "~> 3.0"
36
36
 
37
37
  # Gem dependency needed with Ruby 3.4 upgrade
38
38
  spec.add_dependency "ostruct", "~> 0.1.0"
39
+ spec.add_dependency "pstore", "~> 0.1.1"
39
40
  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,12 @@
1
1
  require "faraday" unless defined?(Faraday)
2
+ require "faraday_middleware"
2
3
  require "faraday/http_cache"
3
- require "active_support"
4
4
  require "tmpdir" unless defined?(Dir.mktmpdir)
5
5
  require_relative "../exceptions/restful_client_error"
6
6
  require_relative "../exceptions/restful_client_connection_error"
7
7
  require_relative "../exceptions/missing_api_credentials_error"
8
8
  require_relative "../config"
9
+ require_relative "../pstore_adapter"
9
10
  require_relative "middleware/exceptions_handler"
10
11
  require_relative "middleware/content_type_validator"
11
12
 
@@ -132,7 +133,7 @@ module ChefLicensing
132
133
  end
133
134
 
134
135
  def get_connection(url = nil)
135
- store = ::ActiveSupport::Cache.lookup_store(:file_store, Dir.tmpdir)
136
+ store = PStoreAdapter.new(Dir.tmpdir)
136
137
  Faraday.new(url: url) do |config|
137
138
  config.request :json
138
139
  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.0".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.0
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-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-config
@@ -73,25 +73,19 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: activesupport
76
+ name: faraday_middleware
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: '1.0'
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: '1.0'
95
89
  - !ruby/object:Gem::Dependency
96
90
  name: tty-spinner
97
91
  requirement: !ruby/object:Gem::Requirement
@@ -134,6 +128,20 @@ dependencies:
134
128
  - - "~>"
135
129
  - !ruby/object:Gem::Version
136
130
  version: 0.1.0
131
+ - !ruby/object:Gem::Dependency
132
+ name: pstore
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 0.1.1
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 0.1.1
137
145
  description: Ruby library to support CLI tools that use Progress Chef license storage,
138
146
  generation, and entitlement.
139
147
  email:
@@ -183,10 +191,12 @@ files:
183
191
  - lib/chef-licensing/licensing_service/local.rb
184
192
  - lib/chef-licensing/list_license_keys.rb
185
193
  - lib/chef-licensing/log.rb
194
+ - lib/chef-licensing/pstore_adapter.rb
186
195
  - lib/chef-licensing/restful_client/base.rb
187
196
  - lib/chef-licensing/restful_client/middleware/content_type_validator.rb
188
197
  - lib/chef-licensing/restful_client/middleware/exceptions_handler.rb
189
198
  - lib/chef-licensing/restful_client/v1.rb
199
+ - lib/chef-licensing/string_refinements.rb
190
200
  - lib/chef-licensing/tui_engine.rb
191
201
  - lib/chef-licensing/tui_engine/tui_actions.rb
192
202
  - lib/chef-licensing/tui_engine/tui_engine.rb