Class: Berkshelf::Source

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/berkshelf/source.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source) ⇒ Source

Returns a new instance of Source.

Parameters:



10
11
12
13
# File 'lib/berkshelf/source.rb', line 10

def initialize(source)
  @source = source
  @universe   = nil
end

Instance Attribute Details

#sourceObject

Returns the value of attribute source.



7
8
9
# File 'lib/berkshelf/source.rb', line 7

def source
  @source
end

Instance Method Details

#==(other) ⇒ Object



115
116
117
118
# File 'lib/berkshelf/source.rb', line 115

def ==(other)
  return false unless other.is_a?(self.class)
  uri == other.uri
end

#api_clientObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/berkshelf/source.rb', line 15

def api_client
  @api_client ||= begin
                    if source == :chef_server
                      APIClient.chef_server(
                        ssl: {verify: Berkshelf::Config.instance.ssl.verify},
                        client_name: Berkshelf::Config.instance.chef.node_name,
                        server_url: Berkshelf::Config.instance.chef.chef_server_url,
                        client_key: Berkshelf::Config.instance.chef.client_key,
                      )
                    else
                      APIClient.new(uri, ssl: {verify: Berkshelf::Config.instance.ssl.verify})
                    end
                  end
end

#build_universeArray<APIClient::RemoteCookbook>

Forcefully obtain the universe from the API endpoint and assign it to #universe. This will reload the value of #universe even if it has been loaded before.

Returns:

  • (Array<APIClient::RemoteCookbook>)


42
43
44
45
46
47
# File 'lib/berkshelf/source.rb', line 42

def build_universe
  @universe = api_client.universe
rescue => ex
  @universe = Array.new
  raise ex
end

#cookbook(name, version) ⇒ APIClient::RemoteCookbook

Parameters:

Returns:

  • (APIClient::RemoteCookbook)


64
65
66
# File 'lib/berkshelf/source.rb', line 64

def cookbook(name, version)
  universe.find { |cookbook| cookbook.name == name && cookbook.version == version }
end

#default?true, false

Determine if this source is a “default” source, as defined in the Berksfile.

Returns:

  • (true, false)

    true if this a default source, false otherwise



85
86
87
# File 'lib/berkshelf/source.rb', line 85

def default?
  @default_ ||= uri.host == URI.parse(Berksfile::DEFAULT_API_URL).host
end

#hashObject



111
112
113
# File 'lib/berkshelf/source.rb', line 111

def hash
  @uri.host.hash
end

#inspectObject



107
108
109
# File 'lib/berkshelf/source.rb', line 107

def inspect
  "#<#{self.class.name} uri: #{@uri.to_s.inspect}>"
end

#latest(name) ⇒ APIClient::RemoteCookbook

Parameters:

Returns:

  • (APIClient::RemoteCookbook)


92
93
94
# File 'lib/berkshelf/source.rb', line 92

def latest(name)
  versions(name).sort.last
end

#search(name) ⇒ Array<APIClient::RemoteCookbook]

The list of remote cookbooks that match the given query.

Parameters:

Returns:

  • (Array<APIClient::RemoteCookbook])

    Array<APIClient::RemoteCookbook]



73
74
75
76
77
78
# File 'lib/berkshelf/source.rb', line 73

def search(name)
  universe
    .select { |cookbook| cookbook.name =~ Regexp.new(name) }
    .group_by(&:name)
    .collect { |_, versions| versions.max_by { |v| Semverse::Version.new(v.version) } }
end

#to_sObject



103
104
105
# File 'lib/berkshelf/source.rb', line 103

def to_s
  "#{uri}"
end

#universeArray<APIClient::RemoteCookbook>

Return the universe from the API endpoint.

This is lazily loaded so the universe will be retrieved from the API endpoint on the first call and cached for future calls. Send the #build_universe message if you want to reload the cached universe.

Returns:

  • (Array<APIClient::RemoteCookbook>)


56
57
58
# File 'lib/berkshelf/source.rb', line 56

def universe
  @universe || build_universe
end

#uriObject



30
31
32
33
34
35
36
# File 'lib/berkshelf/source.rb', line 30

def uri
  @uri ||= if source == :chef_server
             SourceURI.parse(Berkshelf::Config.instance.chef.chef_server_url)
           else
             SourceURI.parse(source)
           end
end

#versions(name) ⇒ Array<APIClient::RemoteCookbook>

Parameters:

Returns:

  • (Array<APIClient::RemoteCookbook>)


99
100
101
# File 'lib/berkshelf/source.rb', line 99

def versions(name)
  universe.select { |cookbook| cookbook.name == name }
end