puppet_forge 2.3.3 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 268967975051fcaec41d34ca23f059007d4a7d26
4
- data.tar.gz: cca3b818c18742151db331ac8a39d2824f135a12
2
+ SHA256:
3
+ metadata.gz: 14fb262a13e9382bc404ebf162e70c8fa48ccd73f33f53113e75524da106bed9
4
+ data.tar.gz: 0316cbac8bd7c7d3dc18d792a0dfc25a4cca095fce0974a5f54a50e546ef1c92
5
5
  SHA512:
6
- metadata.gz: b038d3eb99356236483d4326e396ed84f5fba6c1651dd528128ec77ad183c3c0b2a4327d36a387903d76e855e8001ecb155a10f0a52f2f8f7acf5d4abe43281a
7
- data.tar.gz: 283e3617c405d572416f27e7d8687481af4afa276d3720f378e492dc10d549edc12aaeee2386c433e783795ef82edcfc70ee764f51acb804a529ca4f5a04d1eb
6
+ metadata.gz: f909a3a4b8bf942f104f1a9f5a798edeb8a29e03adaaa24dbd4170efd97f2e09c23ef44b3b88ad406d32d5d10aba98d382d21ce10e1db115ee5c87d8cd01e30f
7
+ data.tar.gz: 2da931edf4e563a6e0962d834c9e3db3dec6ff33fd9a172f5d50a12066863b336fae173c8ad860d6c85f6df1ef02da4e1e0fc61e0a3182e92552ac988db3ce7b
@@ -3,10 +3,10 @@ name: ruby-rspec
3
3
  on:
4
4
  push:
5
5
  branches:
6
- - master
6
+ - main
7
7
  pull_request:
8
8
  branches:
9
- - master
9
+ - main
10
10
 
11
11
  jobs:
12
12
  test:
@@ -14,14 +14,14 @@ jobs:
14
14
  runs-on: ubuntu-latest
15
15
  strategy:
16
16
  matrix:
17
- ruby_version: ['2.7.x', '2.6.x', '2.5.x', '2.4.x']
17
+ ruby: [2.7, 2.6, 2.5]
18
18
 
19
19
  steps:
20
20
  - uses: actions/checkout@v1
21
- - name: Set up Ruby ${{ matrix.ruby_version }}
22
- uses: actions/setup-ruby@v1
21
+ - name: Set up Ruby ${{ matrix.ruby }}
22
+ uses: ruby/setup-ruby@v1
23
23
  with:
24
- ruby-version: ${{ matrix.ruby_version }}
24
+ ruby-version: ${{ matrix.ruby }}
25
25
 
26
26
  - name: Build and test with Rspec
27
27
  run: |
data/.gitignore CHANGED
@@ -20,4 +20,3 @@ _yardoc
20
20
  *.o
21
21
  *.a
22
22
  mkmf.log
23
- locales/forge-ruby.pot
data/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  Starting with v2.0.0, all notable changes to this project will be documented in this file.
4
4
  This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
+ ## v3.2.0 - 2021-11-09
7
+
8
+ * Allow requests to follow redirects
9
+ * Remove the `gettext-setup` gem dependency, which was unused
10
+
11
+ ## v3.1.0 - 2021-08-20
12
+
13
+ ### Changed
14
+
15
+ * Update `PuppetForge::Connection.authorization` so that it prepends the
16
+ required `Bearer ` string automatically to values that look like Forge API
17
+ keys. This won't affect values that already include `Bearer `.
18
+
19
+ ## v3.0.0 - 2021-01-28
20
+
21
+ * Breaking: The `puppet_forge` gem now requires at least Ruby 2.4.0.
22
+ * Update `faraday` and `faraday_middleware` gem dependencies to 1.x series.
23
+ * Update optional `typhoeus` dependency to `>= 1.4` to maintain compatibility with `faraday`.
24
+
25
+ ## v2.3.4 - 2020-03-31
26
+
27
+ * Update the forge API url to `forgeapi.puppet.com` (instead of using the older puppetlabs.com domain).
28
+ * Allow versions of the `faraday_middleware` dependency up to 0.15.
29
+
6
30
  ## v2.3.3 - 2020-02-20
7
31
 
8
32
  ### Changed
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Puppet Forge
2
2
 
3
- Access and manipulate the [Puppet Forge API](https://forgeapi.puppetlabs.com)
3
+ Access and manipulate the [Puppet Forge API](https://forgeapi.puppet.com)
4
4
  from Ruby.
5
5
 
6
6
  ## Installation
@@ -81,13 +81,14 @@ resource model are documented on the [Resource Reference][resource_ref] page.
81
81
  Each of the models uses ActiveRecord-like REST functionality to map over the Forge API endpoints.
82
82
  Most simple ActiveRecord-style interactions function as intended.
83
83
 
84
- Currently, only unauthenticated read-only actions are supported.
84
+ Currently, only read-only actions are supported.
85
85
 
86
86
  The methods find, where, and all immediately make one API request.
87
87
 
88
88
  ```ruby
89
89
  # Find a Resource by Slug
90
- PuppetForge::User.find('puppetlabs') # => #<Forge::V3::User(/v3/users/puppetlabs)>
90
+ PuppetForge::User.find('puppetlabs') # => #<PuppetForge::V3::User(/v3/users/puppetlabs)>
91
+ PuppetForge::Module.find('puppetlabs-stdlib') # => #<PuppetForge::V3::Module(/v3/modules/puppetlabs-stdlib)>
91
92
 
92
93
  # Find All Resources
93
94
  PuppetForge::Module.all # See "Paginated Collections" below for important info about enumerating resource sets.
@@ -109,7 +110,7 @@ PuppetForge::Module.where(query: 'apache').all # This method is deprecated and n
109
110
  All API Requests (whether via find, where, or all) will raise a Faraday::ResourceNotFound error if the request fails.
110
111
 
111
112
 
112
- ### Installing a Release
113
+ ### Downloading and installing a module release
113
114
 
114
115
  A release tarball can be downloaded and installed by following the steps below.
115
116
 
@@ -186,26 +187,24 @@ user.username # => "puppetlabs"
186
187
  user.created_at # => "2010-05-19 05:46:26 -0700"
187
188
  ```
188
189
 
189
- ### i18n
190
+ ### Configuration
190
191
 
191
- When adding new error or log messages please follow the instructions for
192
- [writing translatable code](https://github.com/puppetlabs/gettext-setup-gem#writing-translatable-code).
193
-
194
- The PuppetForge gem will default to outputing all error messages in English, but you may set the locale
195
- using the `FastGettext.set_locale` method. If translations do not exist for the language you request then the gem will
196
- default to English. The `set_locale` method will return the locale, as a string, that FastGettext will now
197
- use to report PuppetForge errors.
192
+ To overwrite the default of `https://forgeapi.puppet.com` and set a custom url for the Forge API:
198
193
 
199
194
  ```ruby
200
- # Assuming the German translations exist, this will set the reporting language
201
- # to German
195
+ PuppetForge.host = "https://your-own-api.url/"
196
+ ```
197
+
198
+ ### Authorization
202
199
 
203
- locale = FastGettext.set_locale "de_DE"
200
+ To authorize your requests with an API key from a Forge user account:
204
201
 
205
- # If it successfully finds Germany's locale, locale will be "de_DE"
206
- # If it fails to find any German locale, locale will be "en"
202
+ ```ruby
203
+ PuppetForge::Connection.authorization = "<your-api-key-here>"
207
204
  ```
208
205
 
206
+ You can generate API keys on your user profile page once you've [logged into the Forge website](https://forge.puppet.com/login).
207
+
209
208
  ## Caveats
210
209
 
211
210
  This library currently does no response caching of its own, instead opting to
data/Rakefile CHANGED
@@ -1,7 +1 @@
1
1
  require "bundler/gem_tasks"
2
-
3
- # i18n/gettext Rake tasks
4
- spec = Gem::Specification.find_by_name 'gettext-setup'
5
- load "#{spec.gem_dir}/lib/tasks/gettext.rake"
6
- GettextSetup.initialize(File.absolute_path('locales', File.dirname(__FILE__)))
7
-
@@ -9,21 +9,11 @@ module PuppetForge
9
9
  @app.call(env)
10
10
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
11
11
  baseurl = env[:url].dup
12
+ errmsg = "Unable to connect to %{scheme}://%{host}" % { scheme: baseurl.scheme, host: baseurl.host }
12
13
  if proxy = env[:request][:proxy]
13
- errmsg = _("Unable to connect to %{scheme}://%{host} (using proxy %{proxy}) (for request %{path_query})") % {
14
- scheme: baseurl.scheme,
15
- host: baseurl.host,
16
- proxy: proxy.uri.to_s,
17
- path_query: baseurl.request_uri,
18
- }
19
- else
20
- errmsg = _("Unable to connect to %{scheme}://%{host} (for request %{path_query})") % {
21
- scheme: baseurl.scheme,
22
- host: baseurl.host,
23
- path_query: baseurl.request_uri,
24
- }
14
+ errmsg << " (using proxy %{proxy})" % { proxy: proxy.uri.to_s }
25
15
  end
26
- errmsg << ": #{e.message}"
16
+ errmsg << " (for request %{path_query}): %{message}" % { message: e.message, path_query: baseurl.request_uri }
27
17
  m = Faraday::ConnectionFailed.new(errmsg)
28
18
  m.set_backtrace(e.backtrace)
29
19
  raise m
@@ -2,7 +2,6 @@ require 'puppet_forge/connection/connection_failure'
2
2
 
3
3
  require 'faraday'
4
4
  require 'faraday_middleware'
5
- require 'puppet_forge/middleware/symbolify_json'
6
5
 
7
6
  module PuppetForge
8
7
  # Provide a common mixin for adding a HTTP connection to classes.
@@ -24,6 +23,8 @@ module PuppetForge
24
23
 
25
24
  attr_writer :conn
26
25
 
26
+ AUTHORIZATION_TOKEN_REGEX = /^[a-f0-9]{64}$/
27
+
27
28
  USER_AGENT = "#{PuppetForge.user_agent} PuppetForge.gem/#{PuppetForge::VERSION} Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})".strip
28
29
 
29
30
  def self.authorization=(token)
@@ -81,7 +82,7 @@ module PuppetForge
81
82
 
82
83
  begin
83
84
  # Use Typhoeus if available.
84
- Gem::Specification.find_by_name('typhoeus', '~> 1.0.1')
85
+ Gem::Specification.find_by_name('typhoeus', '~> 1.4')
85
86
  require 'typhoeus/adapters/faraday'
86
87
  adapter = :typhoeus
87
88
  rescue Gem::LoadError
@@ -102,7 +103,7 @@ module PuppetForge
102
103
  options = { :headers => { :user_agent => USER_AGENT } }.merge(opts)
103
104
 
104
105
  if token = PuppetForge::Connection.authorization
105
- options[:headers][:authorization] = token
106
+ options[:headers][:authorization] = token =~ AUTHORIZATION_TOKEN_REGEX ? "Bearer #{token}" : token
106
107
  end
107
108
 
108
109
  if lang = PuppetForge::Connection.accept_language
@@ -114,8 +115,8 @@ module PuppetForge
114
115
  end
115
116
 
116
117
  Faraday.new(url, options) do |builder|
117
- builder.use PuppetForge::Middleware::SymbolifyJson
118
- builder.response(:json, :content_type => /\bjson$/)
118
+ builder.use FaradayMiddleware::FollowRedirects
119
+ builder.response(:json, :content_type => /\bjson$/, :parser_options => { :symbolize_names => true })
119
120
  builder.response(:raise_error)
120
121
  builder.use(:connection_failure)
121
122
 
@@ -16,11 +16,15 @@ module PuppetForge
16
16
  def initialize(options)
17
17
  @entry_path = options[:entry_path]
18
18
  @directory = options[:directory]
19
- super _("Attempt to install file into %{path} under %{directory}") % {path: @entry_path.inspect, directory: @directory.inspect}
19
+ super "Attempt to install file into #{@entry_path.inspect} under #{@directory.inspect}"
20
20
  end
21
21
 
22
22
  def multiline
23
- _("Could not install package\n Package attempted to install file into\n %{path} under %{directory}.") % {path: @entry_path.inspect, directory: @directory.inspect}
23
+ <<-MSG.strip
24
+ Could not install package
25
+ Package attempted to install file into
26
+ #{@entry_path.inspect} under #{@directory.inspect}.
27
+ MSG
24
28
  end
25
29
  end
26
30
 
@@ -24,7 +24,7 @@ module PuppetForge
24
24
  version = class_name.split("::")[-2]
25
25
 
26
26
  if version.nil?
27
- raise RuntimeError, _("Unable to determine the parent PuppetForge version module")
27
+ raise RuntimeError, "Unable to determine the parent PuppetForge version module"
28
28
  end
29
29
 
30
30
  PuppetForge.const_get(version)
@@ -39,7 +39,7 @@ module PuppetForge
39
39
  begin
40
40
  PuppetForge::Tar.instance.unpack(@filename, @tmpdir)
41
41
  rescue PuppetForge::ExecutionFailure => e
42
- raise RuntimeError, _("Could not extract contents of module archive: %{error_msg}") % {error_msg: e.message}
42
+ raise RuntimeError, "Could not extract contents of module archive: #{e.message}"
43
43
  end
44
44
  end
45
45
 
@@ -61,7 +61,7 @@ module PuppetForge
61
61
  if metadata_file
62
62
  @root_dir = Pathname.new(metadata_file).dirname
63
63
  else
64
- raise _("No valid metadata.json found!")
64
+ raise "No valid metadata.json found!"
65
65
  end
66
66
  end
67
67
  end
@@ -56,7 +56,7 @@ module PuppetForge
56
56
  # @private
57
57
  def request(resource, item = nil, params = {}, reset_connection = false, conn_opts = {})
58
58
  conn(reset_connection, conn_opts) if reset_connection
59
- unless conn.url_prefix =~ /^#{PuppetForge.host}/
59
+ unless conn.url_prefix.to_s =~ /^#{PuppetForge.host}/
60
60
  conn.url_prefix = "#{PuppetForge.host}"
61
61
  end
62
62
 
@@ -63,7 +63,7 @@ module PuppetForge
63
63
  validate_version_range(version_requirement) if version_requirement
64
64
 
65
65
  if dup = @data['dependencies'].find { |d| d.full_module_name == name && d.version_requirement != version_requirement }
66
- raise ArgumentError, _("Dependency conflict for %{module_name}: Dependency %{conflict_name} was given conflicting version requirements %{version} and %{conflict_version}. Verify that there are no duplicates in the metadata.json or the Modulefile.") % {module_name: full_module_name, conflict_name: name, version: version_requirement, conflict_version: dup.version_requirement}
66
+ raise ArgumentError, "Dependency conflict for #{full_module_name}: Dependency #{name} was given conflicting version requirements #{version_requirement} and #{dup.version_requirement}. Verify that there are no duplicates in the metadata.json or the Modulefile."
67
67
  end
68
68
 
69
69
  dep = Dependency.new(name, version_requirement, repository)
@@ -165,30 +165,31 @@ module PuppetForge
165
165
 
166
166
  err = case modname
167
167
  when nil, '', :namespace_missing
168
- _("the field must be a namespaced module name")
168
+ "the field must be a namespaced module name"
169
169
  when /[^a-z0-9_]/i
170
- _("the module name contains non-alphanumeric (or underscore) characters")
170
+ "the module name contains non-alphanumeric (or underscore) characters"
171
171
  when /^[^a-z]/i
172
- _("the module name must begin with a letter")
172
+ "the module name must begin with a letter"
173
173
  else
174
- _("the namespace contains non-alphanumeric characters")
174
+ "the namespace contains non-alphanumeric characters"
175
175
  end
176
176
 
177
- raise ArgumentError, _("Invalid 'name' field in metadata.json: %{error}") % {error: err}
177
+ raise ArgumentError, "Invalid 'name' field in metadata.json: #{err}"
178
178
  end
179
179
 
180
180
  # Validates that the version string can be parsed by SemanticPuppet.
181
181
  def validate_version(version)
182
182
  return if SemanticPuppet::Version.valid?(version)
183
183
 
184
- raise ArgumentError, _("Invalid 'version' field in metadata.json: version string cannot be parsed as a valid Semantic Version")
184
+ err = "version string cannot be parsed as a valid Semantic Version"
185
+ raise ArgumentError, "Invalid 'version' field in metadata.json: #{err}"
185
186
  end
186
187
 
187
188
  # Validates that the version range can be parsed by SemanticPuppet.
188
189
  def validate_version_range(version_range)
189
190
  SemanticPuppet::VersionRange.parse(version_range)
190
191
  rescue ArgumentError => e
191
- raise ArgumentError, _("Invalid 'version_range' field in metadata.json: %{error}") % {error: e}
192
+ raise ArgumentError, "Invalid 'version_range' field in metadata.json: #{e}"
192
193
  end
193
194
  end
194
195
  end
@@ -29,7 +29,7 @@ module PuppetForge
29
29
  resp = self.class.conn.get(download_url)
30
30
  path.open('wb') { |fh| fh.write(resp.body) }
31
31
  rescue Faraday::ResourceNotFound => e
32
- raise PuppetForge::ReleaseNotFound, (_("The module release %{release_slug} does not exist on %{url}.") % {release_slug: slug, url: self.class.conn.url_prefix}), e.backtrace
32
+ raise PuppetForge::ReleaseNotFound, "The module release #{slug} does not exist on #{self.class.conn.url_prefix}.", e.backtrace
33
33
  rescue Faraday::ClientError => e
34
34
  if e.response && e.response[:status] == 403
35
35
  raise PuppetForge::ReleaseForbidden.from_response(e.response)
@@ -1,3 +1,3 @@
1
1
  module PuppetForge
2
- VERSION = '2.3.3' # Library version
2
+ VERSION = '3.2.0' # Library version
3
3
  end
data/lib/puppet_forge.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'puppet_forge/version'
2
- require 'gettext-setup'
3
2
 
4
3
  module PuppetForge
5
4
  class << self
@@ -15,9 +14,7 @@ module PuppetForge
15
14
  end
16
15
  end
17
16
 
18
- GettextSetup.initialize(File.absolute_path('../locales', File.dirname(__FILE__)))
19
-
20
- DEFAULT_FORGE_HOST = 'https://forgeapi.puppetlabs.com/'
17
+ DEFAULT_FORGE_HOST = 'https://forgeapi.puppet.com/'
21
18
 
22
19
  self.host = DEFAULT_FORGE_HOST
23
20
 
data/puppet_forge.gemspec CHANGED
@@ -18,13 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = '>= 1.9.3'
21
+ spec.required_ruby_version = '>= 2.4.0'
22
22
 
23
- spec.add_runtime_dependency "faraday", [">= 0.9.0", "< 0.18.0", "!= 0.13.1"]
24
- spec.add_runtime_dependency "faraday_middleware", [">= 0.9.0", "< 0.14.0"]
25
- spec.add_dependency 'semantic_puppet', '~> 1.0'
26
- spec.add_dependency 'minitar'
27
- spec.add_dependency 'gettext-setup', '~> 0.11'
23
+ spec.add_runtime_dependency "faraday", "~> 1.3"
24
+ spec.add_runtime_dependency "faraday_middleware", "~> 1.0"
25
+ spec.add_dependency "semantic_puppet", "~> 1.0"
26
+ spec.add_dependency "minitar"
28
27
 
29
28
  spec.add_development_dependency "rake"
30
29
  spec.add_development_dependency "rspec", "~> 3.0"