puppet-forge-server 1.6.0 → 1.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a171b2b28c33323c957641164b1a785700ea6372
4
- data.tar.gz: 35cfa215febc8ccf95dbbfa0165ddfdc40a051cc
3
+ metadata.gz: 1f47167acd969b4e7d7725a351d02c9a4d6e5608
4
+ data.tar.gz: fe6cb62aec95aa35517235e90f965ac267b72790
5
5
  SHA512:
6
- metadata.gz: f94bc68aa70ab4cc0c294768bb8d94e4b1f7a9047b29499049b937f5c0d57e0be7b5972527a7afbb1edd69d81b59207640274a7264faab123dfc96dd270786e7
7
- data.tar.gz: 2e329e028ae4385997e450ef9349e18a8431c9d673c8ecf59564de45e56599fe056ad158c73a6573f897fbb1e57d1a229a28b902fb59cd9e270a343ab5826b2f
6
+ metadata.gz: bb7deb4e4e51e3a1c0942de9e5455740b70587bccee7720d011ad61a75f5d87072357434bcca429a747fbab6f4b243aa9abe74f33b394d3fd38198f3d20ed3e3
7
+ data.tar.gz: 2ca911fd043d05967a887815d8121b76c0d2960f82d7922ef562fa3b1c476a94d36bdb8a4cfe3c01946e8888dbefe036ceff2bfa49e3359f125c7128dbd00049
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Puppet Forge Server
2
2
 
3
- Private Puppet Forge Server supporting local files and both v1 and v3 API proxies. Heavily inspired by the [Puppet Library](https://github.com/drrb/puppet-library).
3
+ Private Puppet Forge Server supporting local files and both v1 and v3 API proxies.
4
4
 
5
5
  [![Build Status](https://api.travis-ci.org/unibet/puppet-forge-server.svg)](https://travis-ci.org/unibet/puppet-forge-server)
6
6
  [![Gem Version](https://badge.fury.io/rb/puppet-forge-server.svg)](http://badge.fury.io/rb/puppet-forge-server)
@@ -216,5 +216,4 @@ Puppet module *metadata* json representation is used as a main business *model*.
216
216
 
217
217
  ## Reference
218
218
 
219
- * [Puppet Library](https://github.com/drrb/puppet-library)
220
219
  * [Puppet Anvil](https://github.com/jhaals/puppet-anvil)
@@ -14,8 +14,8 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require 'puppet_forge_server/patches'
18
17
  require 'puppet_forge_server/version'
18
+ require 'puppet_forge_server/patches/gem.rb'
19
19
 
20
20
  module PuppetForgeServer
21
21
  autoload :Server, 'puppet_forge_server/server'
@@ -57,7 +57,6 @@ module PuppetForgeServer
57
57
  module Utils
58
58
  autoload :Archiver, 'puppet_forge_server/utils/archiver'
59
59
  autoload :OptionParser, 'puppet_forge_server/utils/option_parser'
60
- autoload :Url, 'puppet_forge_server/utils/url'
61
60
  autoload :Buffer, 'puppet_forge_server/utils/buffer'
62
61
  autoload :Http, 'puppet_forge_server/utils/http'
63
62
  end
@@ -65,4 +64,4 @@ module PuppetForgeServer
65
64
  module Http
66
65
  autoload :HttpClient, 'puppet_forge_server/http/http_client'
67
66
  end
68
- end
67
+ end
@@ -1,7 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  #
3
- # Copyright 2014 drrb
4
- # Copyright 2014 North Development AB
3
+ # Copyright 2015 North Development AB
5
4
  #
6
5
  # Licensed under the Apache License, Version 2.0 (the "License");
7
6
  # you may not use this file except in compliance with the License.
@@ -19,49 +18,37 @@ module PuppetForgeServer::Api::V1
19
18
  module Modules
20
19
 
21
20
  def get_modules(metadata)
22
- modules = metadata.map do |element|
23
- name = element[:metadata].name.sub(/^[^-]+-/, '')
24
- full_name = element[:metadata].name.sub('-', '/')
25
- {
21
+ modules = {}
22
+ metadata.each do |element|
23
+ if modules[element[:metadata].name]
24
+ if max_version(modules[element[:metadata].name][:version], element[:metadata].version) == element[:metadata].version
25
+ modules[element[:metadata].name][:desc] = element[:metadata].description
26
+ modules[element[:metadata].name][:version] = element[:metadata].version
27
+ modules[element[:metadata].name][:project_url] = element[:metadata].project_page
28
+ end
29
+ modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).uniq.sort_by { |r| Gem::Version.new(r[:version]) }.reverse
30
+ modules[element[:metadata].name][:tag_list] = (modules[element[:metadata].name][:tag_list] + element[:tags]).uniq.compact
31
+ else
32
+ name = element[:metadata].name.sub(/^[^-]+-/, '')
33
+ modules[element[:metadata].name] = {
26
34
  :author => element[:metadata].author,
27
- :full_name => full_name,
35
+ :full_name => element[:metadata].name.sub('-', '/'),
28
36
  :name => name,
29
37
  :desc => element[:metadata].description,
30
38
  :version => element[:metadata].version,
31
39
  :project_url => element[:metadata].project_page,
32
- :releases => [{:version => element[:metadata].version}],
33
- :tag_list => [element[:metadata].author, name]
34
- }
40
+ :releases => releases_version(element[:metadata]),
41
+ :tag_list => element[:tags] ? element[:tags] : [element[:metadata].author, name],
42
+ }
43
+ end
35
44
  end
36
45
 
37
- merge_modules(modules)
46
+ modules.values
38
47
  end
39
48
 
40
49
  private
41
- def merge_modules(modules)
42
- grouped_modules = modules.group_by do |result|
43
- result[:full_name]
44
- end
45
-
46
- grouped_modules.values.map do |value|
47
- merge_values(value)
48
- end.flatten.uniq
49
- end
50
-
51
- def merge_values(value)
52
- highest_version, tags, releases = value.inject([nil, [], []]) do |(highest_version, tags, releases), result|
53
- [
54
- max_version(highest_version, result[:version]),
55
- tags + (result[:tag_list] || []),
56
- releases + (result[:releases] || [])
57
- ]
58
- end
59
-
60
- value.first.tap do |result|
61
- result[:version] = highest_version
62
- result[:tag_list] = tags.uniq
63
- result[:releases] = releases.uniq.version_sort_by { |r| r[:version] }.reverse
64
- end
50
+ def releases_version(metadata)
51
+ [{:version => metadata.version}]
65
52
  end
66
53
 
67
54
  def max_version(left, right)
@@ -21,9 +21,9 @@ module PuppetForgeServer::Api::V1
21
21
  {
22
22
  :file => "/api/v1/files#{element[:path]}",
23
23
  :version => element[:metadata].version,
24
- :dependencies => element[:metadata].dependencies.map {|dep| [dep.name, dep.version_requirement]}
24
+ :dependencies => element[:metadata].dependencies.map {|dep| [dep.name, dep.version_requirement]}.compact
25
25
  }
26
- end.version_sort_by { |r| r[:version] }
26
+ end.uniq{|r| r[:version]}.sort_by {|r| Gem::Version.new(r[:version])}
27
27
  end
28
28
  end
29
29
  end
@@ -23,22 +23,21 @@ module PuppetForgeServer::Api::V3
23
23
  metadata.each do |element|
24
24
  if modules[element[:metadata].name]
25
25
  if max_version(modules[element[:metadata].name][:current_release][:version], element[:metadata].version) == element[:metadata].version
26
+ # Saving curret release tags for merging with new max version current release
26
27
  tags = modules[element[:metadata].name][:current_release][:tags]
27
28
  modules[element[:metadata].name][:current_release] = get_releases([element]).first
28
- modules[element[:metadata].name][:current_release][:tags] = (modules[element[:metadata].name][:current_release][:tags] + tags).uniq
29
+ modules[element[:metadata].name][:current_release][:tags] = (modules[element[:metadata].name][:current_release][:tags] + tags).uniq.compact
29
30
  end
30
- modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).version_sort_by { |r| r[:version] }.reverse
31
+ modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).uniq.sort_by { |r| Gem::Version.new(r[:version]) }.reverse
31
32
  else
32
- name = element[:metadata].name.sub(/^[^-]+-/, '')
33
- author = element[:metadata].name.split('-')[0]
34
33
  modules[element[:metadata].name] = {
35
34
  :uri => "/v3/modules/#{element[:metadata].name}",
36
- :name => name,
35
+ :name => element[:metadata].name.sub(/^[^-]+-/, ''),
37
36
  :homepage_url => element[:metadata].project_page,
38
37
  :issues_url => element[:metadata].issues_url,
39
38
  :releases => releases_version(element[:metadata]),
40
39
  :current_release => get_releases([element]).first,
41
- :owner => {:username => author, :uri => "/v3/users/#{author}"}
40
+ :owner => {:username => element[:metadata].author, :uri => "/v3/users/#{element[:metadata].author}"}
42
41
  }
43
42
  end
44
43
  end
@@ -33,7 +33,7 @@ module PuppetForgeServer::Api::V3
33
33
  :file_uri => "/v3/files#{element[:path]}",
34
34
  :file_md5 => element[:checksum]
35
35
  }
36
- end.version_sort_by { |r| r[:version] }
36
+ end.uniq{|r| r[:version]}.sort_by { |r| Gem::Version.new(r[:version]) }
37
37
  end
38
38
  end
39
39
  end
@@ -54,7 +54,7 @@ module PuppetForgeServer::Backends
54
54
 
55
55
  private
56
56
  def read_metadata(archive_path)
57
- metadata_file = read_entry(archive_path, %r[[^/]+/metadata\.json$])
57
+ metadata_file = read_from_archive(archive_path, %r[[^/]+/metadata\.json$])
58
58
  JSON.parse(metadata_file)
59
59
  rescue => error
60
60
  warn "Error reading from module archive #{archive_path}: #{error}"
@@ -16,6 +16,7 @@
16
16
 
17
17
  require 'open-uri'
18
18
  require 'open_uri_redirections'
19
+ require 'timeout'
19
20
 
20
21
  module PuppetForgeServer::Http
21
22
  class HttpClient
@@ -29,7 +30,9 @@ module PuppetForgeServer::Http
29
30
 
30
31
  private
31
32
  def open_uri(url)
32
- open(url, 'User-Agent' => "Puppet-Forge-Server/#{PuppetForgeServer::VERSION}", :allow_redirections => :safe)
33
+ ::Timeout.timeout(10) do
34
+ open(url, 'User-Agent' => "Puppet-Forge-Server/#{PuppetForgeServer::VERSION}", :allow_redirections => :safe)
35
+ end
33
36
  end
34
37
  end
35
38
  end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2015 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class Gem::Version
18
+ def initialize version
19
+ @version = self.class.correct?(version) ? version.to_s.strip.gsub('-', '.pre.') : '0'
20
+ end
21
+ end
@@ -92,21 +92,20 @@ module PuppetForgeServer
92
92
 
93
93
  private
94
94
  def backends(options)
95
- options[:backend].map do |type, typed_backends|
95
+ # Add directory backend for serving cached modules in case proxy flips over
96
+ backends = options[:backend]['Proxy'] && ! options[:backend]['Proxy'].empty? ? [PuppetForgeServer::Backends.const_get('Directory').new(options[:cache_basedir])] : []
97
+ backends << options[:backend].map do |type, typed_backends|
96
98
  typed_backends.map do |url|
97
99
  case type
98
100
  when 'Proxy'
99
101
  @log.info "Detecting API version for #{url}..."
100
- [
101
- PuppetForgeServer::Backends.const_get("#{type}V#{get_api_version(url)}").new(url.chomp('/'), options[:cache_basedir]),
102
- # Add directory backend for serving cached modules in case proxy flips over
103
- PuppetForgeServer::Backends.const_get('Directory').new(options[:cache_basedir])
104
- ]
102
+ PuppetForgeServer::Backends.const_get("#{type}V#{get_api_version(url)}").new(url.chomp('/'), options[:cache_basedir])
105
103
  else
106
104
  PuppetForgeServer::Backends.const_get(type).new(url)
107
105
  end
108
106
  end
109
- end.flatten.sort_by { |backend| backend.PRIORITY }
107
+ end
108
+ backends.flatten.sort_by { |backend| backend.PRIORITY }
110
109
  end
111
110
  end
112
111
  end
@@ -19,11 +19,13 @@ require 'zlib'
19
19
 
20
20
  module PuppetForgeServer::Utils
21
21
  module Archiver
22
- def read_entry(path, entry_name_regex)
23
- tar = Gem::Package::TarReader.new(Zlib::GzipReader.open(path))
22
+ def read_from_archive(archive, name_regex)
23
+ tar = Gem::Package::TarReader.new(Zlib::GzipReader.open(archive))
24
24
  tar.rewind
25
- entry = tar.find { |e| e.full_name =~ entry_name_regex } or raise "Couldn't find entry in archive matching #{entry_name_regex.inspect}"
26
- entry.read
25
+ tar.each do |obj|
26
+ return obj.read if obj.full_name =~ name_regex
27
+ end
28
+ raise "Given name #{name_regex} not found in #{archive}"
27
29
  end
28
30
  end
29
31
  end
@@ -1,7 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  #
3
- # Copyright 2014 drrb
4
- # Copyright 2014 North Development AB
3
+ # Copyright 2015 North Development AB
5
4
  #
6
5
  # Licensed under the Apache License, Version 2.0 (the "License");
7
6
  # you may not use this file except in compliance with the License.
@@ -17,10 +16,10 @@
17
16
 
18
17
  require 'optparse'
19
18
  require 'tmpdir'
19
+ require 'uri'
20
20
 
21
21
  module PuppetForgeServer::Utils
22
22
  module OptionParser
23
- include PuppetForgeServer::Utils::Url
24
23
 
25
24
  @@DEFAULT_DAEMONIZE = false
26
25
  @@DEFAULT_PORT = 8080
@@ -28,42 +27,43 @@ module PuppetForgeServer::Utils
28
27
  @@DEFAULT_CACHE_DIR = File.join(Dir.tmpdir.to_s, 'puppet-forge-server', 'cache')
29
28
  @@DEFAULT_LOG_DIR = File.join(Dir.tmpdir.to_s, 'puppet-forge-server', 'log')
30
29
  @@DEFAULT_WEBUI_ROOT = File.expand_path('../app', File.dirname(__FILE__))
30
+ @@DEFAULT_HOST = '0.0.0.0'
31
31
 
32
32
  def parse_options(args)
33
- options = {:daemonize => @@DEFAULT_DAEMONIZE, :cache_basedir => @@DEFAULT_CACHE_DIR, :port => @@DEFAULT_PORT, :webui_root => @@DEFAULT_WEBUI_ROOT}
33
+ options = {:daemonize => @@DEFAULT_DAEMONIZE, :cache_basedir => @@DEFAULT_CACHE_DIR, :port => @@DEFAULT_PORT, :webui_root => @@DEFAULT_WEBUI_ROOT, :host => @@DEFAULT_HOST}
34
34
  option_parser = ::OptionParser.new do |opts|
35
35
  opts.banner = "Usage: #{File.basename $0} [options]"
36
36
  opts.version = PuppetForgeServer::VERSION
37
37
 
38
- opts.on('-p', "--port PORT', 'Port to listen on (default: #{@@DEFAULT_PORT})") do |port|
38
+ opts.on('-p', '--port PORT', "Port number to bind to (default: #{@@DEFAULT_PORT})") do |port|
39
39
  options[:port] = port
40
40
  end
41
41
 
42
- opts.on('-b', '--bind-host HOSTNAME', 'Host name to bind to (default: whatever Rack wants to use)') do |hostname|
43
- options[:hostname] = hostname
42
+ opts.on('-b', '--bind HOST', "Host name or IP address to bind to (default: #{@@DEFAULT_HOST})") do |host|
43
+ options[:host] = host
44
44
  end
45
45
 
46
- opts.on('-D', '--daemonize', "Run the server in the background (default: #{@@DEFAULT_DAEMONIZE})") do
46
+ opts.on('-D', '--daemonize', "Run server in the background (default: #{@@DEFAULT_DAEMONIZE})") do
47
47
  options[:daemonize] = true
48
48
  end
49
49
 
50
- opts.on('--pidfile FILE', 'Write a pidfile to this location after starting') do |pidfile|
50
+ opts.on('--pidfile FILE', "Pid file location (default: #{@@DEFAULT_PID_FILE})") do |pidfile|
51
51
  options[:pidfile] = pidfile
52
52
  end
53
53
 
54
54
  options[:backend] = {'Directory' => [], 'Proxy' => [], 'Source' => []}
55
- opts.on('-m', '--module-dir DIR', 'Directory containing packaged modules (can be specified multiple times)') do |module_dir|
55
+ opts.on('-m', '--module-dir DIR', 'Directory containing packaged modules (recursively searched)') do |module_dir|
56
56
  options[:backend]['Directory'] << module_dir
57
57
  end
58
- opts.on('-x', '--proxy URL', 'Remote forge to proxy (can be specified multiple times)') do |url|
59
- options[:backend]['Proxy'] << normalize_url(url)
58
+ opts.on('-x', '--proxy URL', 'Remote forge URL') do |url|
59
+ options[:backend]['Proxy'] << url
60
60
  end
61
61
 
62
- opts.on('--cache-basedir DIR', "Cache all proxies' downloaded modules under this directory (default: #{@@DEFAULT_CACHE_DIR})") do |cache_basedir|
62
+ opts.on('--cache-basedir DIR', "Proxy module cache base directory (default: #{@@DEFAULT_CACHE_DIR})") do |cache_basedir|
63
63
  options[:cache_basedir] = cache_basedir
64
64
  end
65
65
 
66
- opts.on('--log-dir DIR', "Directory containing all server logs (if daemonized default: #{@@DEFAULT_LOG_DIR})") do |log_dir|
66
+ opts.on('--log-dir DIR', "Log directory (default: #{@@DEFAULT_LOG_DIR})") do |log_dir|
67
67
  options[:log_dir] = log_dir
68
68
  end
69
69
 
@@ -96,4 +96,4 @@ module PuppetForgeServer::Utils
96
96
  return options
97
97
  end
98
98
  end
99
- end
99
+ end
@@ -15,5 +15,5 @@
15
15
  # limitations under the License.
16
16
 
17
17
  module PuppetForgeServer
18
- VERSION = '1.6.0'
18
+ VERSION = '1.7.0'
19
19
  end
@@ -42,6 +42,7 @@ Gem::Specification.new do |spec|
42
42
  spec.add_dependency 'open4', '~> 1.3'
43
43
  spec.add_dependency 'open_uri_redirections', '~> 0.1'
44
44
  spec.add_dependency 'haml', '~> 4.0'
45
+ spec.add_dependency 'deep_merge', '~> 1.0'
45
46
 
46
47
  spec.add_development_dependency 'rake', '~> 10.3'
47
48
  spec.add_development_dependency 'rspec', '~> 3.1'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-forge-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilja Bobkevic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-20 00:00:00.000000000 Z
11
+ date: 2015-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '4.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: deep_merge
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rake
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -204,13 +218,12 @@ files:
204
218
  - lib/puppet_forge_server/models/builder.rb
205
219
  - lib/puppet_forge_server/models/dependency.rb
206
220
  - lib/puppet_forge_server/models/metadata.rb
207
- - lib/puppet_forge_server/patches.rb
221
+ - lib/puppet_forge_server/patches/gem.rb
208
222
  - lib/puppet_forge_server/server.rb
209
223
  - lib/puppet_forge_server/utils/archiver.rb
210
224
  - lib/puppet_forge_server/utils/buffer.rb
211
225
  - lib/puppet_forge_server/utils/http.rb
212
226
  - lib/puppet_forge_server/utils/option_parser.rb
213
- - lib/puppet_forge_server/utils/url.rb
214
227
  - lib/puppet_forge_server/version.rb
215
228
  - puppet-forge-server.gemspec
216
229
  - spec/spec_helper.rb
@@ -1,72 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2014 drrb
4
- # Copyright 2014 North Development AB
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'rubygems/package'
19
-
20
- module Gem
21
- def Version.new(version)
22
- super(version.to_s.gsub('-', '.pre.'))
23
- rescue ArgumentError
24
- if version =~ /^\d+(\.\d+)*/
25
- super(version[/^\d+(\.\d+)*/])
26
- else
27
- super('0')
28
- end
29
- end
30
- end
31
-
32
- class Hash
33
- def deep_merge(other)
34
- merge(other) do |key, old_val, new_val|
35
- if old_val.instance_of? Array
36
- old_val + new_val
37
- else
38
- new_val
39
- end
40
- end
41
- end
42
-
43
- def deep_merge!(other)
44
- replace(deep_merge(other))
45
- end
46
- end
47
-
48
- class Array
49
- def deep_merge
50
- inject({}) do |merged, map|
51
- merged.deep_merge(map)
52
- end
53
- end
54
-
55
- def version_sort_by
56
- sort_by do |element|
57
- Gem::Version.new(yield(element))
58
- end
59
- end
60
- end
61
-
62
- # Used by PuppetForgeServer::Utils::Archiver
63
- class Gem::Package::TarReader
64
- # Old versions of RubyGems don't include Enumerable in here
65
- def find
66
- each do |entry|
67
- if yield(entry)
68
- return entry
69
- end
70
- end
71
- end
72
- end
@@ -1,36 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2014 drrb
4
- # Copyright 2014 North Development AB
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'uri'
19
-
20
- module PuppetForgeServer::Utils
21
- module Url
22
- def normalize_url(uri_string)
23
- begin
24
- url = URI.parse(uri_string)
25
- rescue URI::InvalidURIError => e
26
- raise PuppetForgeServer::Errors::Expected, "Invalid URL '#{uri_string}': #{e.message}"
27
- end
28
- if url.scheme
29
- raise PuppetForgeServer::Errors::Expected, "Invalid URL '#{uri_string}': unsupported protocol '#{url.scheme}'" unless url.scheme =~ /^https?$/
30
- else
31
- uri_string = "http://#{uri_string}"
32
- end
33
- uri_string.sub /\/$/, ''
34
- end
35
- end
36
- end