jamie 0.1.0.alpha4 → 0.1.0.alpha5

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -9,10 +9,10 @@ Cane::RakeTask.new do |cane|
9
9
  Jamie::Vagrant.define_vagrant_vm
10
10
  )
11
11
  cane.style_exclude = %w(
12
- lib/jamie/core_ext.rb
12
+ lib/vendor/hash_recursive_merge.rb
13
13
  )
14
14
  cane.doc_exclude = %w(
15
- lib/jamie/core_ext.rb
15
+ lib/vendor/hash_recursive_merge.rb
16
16
  )
17
17
  end
18
18
 
data/bin/jamie ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), %w{.. lib})
5
+ require 'jamie/cli'
6
+
7
+ Jamie::CLI.start
data/jamie.gemspec CHANGED
@@ -13,10 +13,11 @@ Gem::Specification.new do |gem|
13
13
  gem.homepage = ""
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.executables = %w(jamie)
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
+ gem.add_dependency 'thor'
20
21
  gem.add_dependency 'mixlib-shellout'
21
22
  gem.add_dependency 'vagrant', '~> 1.0.5'
22
23
 
data/lib/jamie/cli.rb ADDED
@@ -0,0 +1,85 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'thor'
4
+
5
+ require 'jamie'
6
+
7
+ module Jamie
8
+
9
+ # The command line runner for Jamie.
10
+ class CLI < Thor
11
+
12
+ # Constructs a new instance.
13
+ def initialize(*args)
14
+ super
15
+ @config = Jamie::Config.new(ENV['JAMIE_YAML'])
16
+ end
17
+
18
+ desc "list", "List all instances"
19
+ def list
20
+ say @config.instances.as_names.join("\n")
21
+ end
22
+
23
+ [:create, :converge, :setup, :verify, :test, :destroy].each do |action|
24
+ desc(
25
+ "#{action} (all ['REGEX']|[INSTANCE])",
26
+ "#{action.capitalize} one or more instances"
27
+ )
28
+ define_method(action) { |*args| exec_action(action) }
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :task
34
+
35
+ def exec_action(action)
36
+ @task = action
37
+ result = parse_subcommand(args[0], args[1])
38
+ Array(result).each { |instance| instance.send(task) }
39
+ end
40
+
41
+ def parse_subcommand(name_or_all, regexp)
42
+ if name_or_all.nil? || (name_or_all == "all" && regexp.nil?)
43
+ get_all_instances
44
+ elsif name_or_all == "all" && regexp
45
+ get_filtered_instances(regexp)
46
+ elsif name_or_all != "all" && regexp.nil?
47
+ get_instance(name_or_all)
48
+ else
49
+ die task, "Invalid invocation."
50
+ end
51
+ end
52
+
53
+ def get_all_instances
54
+ result = @config.instances
55
+ if result.empty?
56
+ die task, "No instances defined"
57
+ else
58
+ result
59
+ end
60
+ end
61
+
62
+ def get_filtered_instances(regexp)
63
+ result = @config.instances.get_all(/#{regexp}/)
64
+ if result.empty?
65
+ die task, "No instances for regex `#{regexp}', try running `jamie list'"
66
+ else
67
+ result
68
+ end
69
+ end
70
+
71
+ def get_instance(name)
72
+ result = @config.instances.get(name)
73
+ if result.nil?
74
+ die task, "No instance `#{name}', try running `jamie list'"
75
+ end
76
+ result
77
+ end
78
+
79
+ def die(task, msg)
80
+ error "\n#{msg}\n\n"
81
+ help(task)
82
+ exit 1
83
+ end
84
+ end
85
+ end
data/lib/jamie/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Jamie
4
4
 
5
- VERSION = "0.1.0.alpha4"
5
+ VERSION = "0.1.0.alpha5"
6
6
  end
data/lib/jamie.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require 'base64'
4
+ require 'delegate'
4
5
  require 'digest'
5
6
  require 'net/https'
6
7
  require 'yaml'
8
+ require 'vendor/hash_recursive_merge'
7
9
 
8
- require 'jamie/core_ext'
9
10
  require 'jamie/version'
10
11
 
11
12
  module Jamie
@@ -42,21 +43,23 @@ module Jamie
42
43
  # @return [Array<Platform>] all defined platforms which will be used in
43
44
  # convergence integration
44
45
  def platforms
45
- @platforms ||= Array(yaml["platforms"]).map { |hash| new_platform(hash) }
46
+ @platforms ||= Collection.new(
47
+ Array(yaml["platforms"]).map { |hash| new_platform(hash) })
46
48
  end
47
49
 
48
50
  # @return [Array<Suite>] all defined suites which will be used in
49
51
  # convergence integration
50
52
  def suites
51
- @suites ||= Array(yaml["suites"]).map { |hash| Suite.new(hash) }
53
+ @suites ||= Collection.new(
54
+ Array(yaml["suites"]).map { |hash| Suite.new(hash) })
52
55
  end
53
56
 
54
57
  # @return [Array<Instance>] all instances, resulting from all platform and
55
58
  # suite combinations
56
59
  def instances
57
- @instances ||= suites.map { |suite|
60
+ @instances ||= Collection.new(suites.map { |suite|
58
61
  platforms.map { |platform| Instance.new(suite, platform) }
59
- }.flatten
62
+ }.flatten)
60
63
  end
61
64
 
62
65
  # @return [String] path to the Jamie YAML file
@@ -75,6 +78,39 @@ module Jamie
75
78
  @test_base_path ||= DEFAULT_TEST_BASE_PATH
76
79
  end
77
80
 
81
+ # Delegate class which adds the ability to find single and multiple
82
+ # objects by their #name in an Array. Hey, it's better than monkey-patching
83
+ # Array, right?
84
+ class Collection < SimpleDelegator
85
+
86
+ # Returns a single object by its name, or nil if none are found.
87
+ #
88
+ # @param name [String] name of object
89
+ # @return [Object] first match by name, or nil if none are found
90
+ def get(name)
91
+ __getobj__.find { |i| i.name == name }
92
+ end
93
+
94
+ # Returns a Collection of all objects whose #name is matched by the
95
+ # regular expression.
96
+ #
97
+ # @param regexp [Regexp] a regular expression pattern
98
+ # @return [Jamie::Config::Collection<Object>] a new collection of
99
+ # matched objects
100
+ def get_all(regexp)
101
+ Jamie::Config::Collection.new(
102
+ __getobj__.find_all { |i| i.name =~ regexp }
103
+ )
104
+ end
105
+
106
+ # Returns an Array of names from the collection as strings.
107
+ #
108
+ # @return [Array<String>] array of name strings
109
+ def as_names
110
+ __getobj__.map { |i| i.name }
111
+ end
112
+ end
113
+
78
114
  private
79
115
 
80
116
  def new_platform(hash)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jamie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha4
4
+ version: 0.1.0.alpha5
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-11 00:00:00.000000000 Z
12
+ date: 2012-12-13 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: mixlib-shellout
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -110,7 +126,8 @@ dependencies:
110
126
  description: A Chef convergence integration test harness
111
127
  email:
112
128
  - fnichol@nichol.ca
113
- executables: []
129
+ executables:
130
+ - jamie
114
131
  extensions: []
115
132
  extra_rdoc_files: []
116
133
  files:
@@ -121,13 +138,15 @@ files:
121
138
  - LICENSE
122
139
  - README.md
123
140
  - Rakefile
141
+ - bin/jamie
124
142
  - jamie.gemspec
125
143
  - lib/jamie.rb
126
- - lib/jamie/core_ext.rb
144
+ - lib/jamie/cli.rb
127
145
  - lib/jamie/driver/vagrant.rb
128
146
  - lib/jamie/rake_tasks.rb
129
147
  - lib/jamie/vagrant.rb
130
148
  - lib/jamie/version.rb
149
+ - lib/vendor/hash_recursive_merge.rb
131
150
  homepage: ''
132
151
  licenses: []
133
152
  post_install_message: