itamae 1.2.4 → 1.2.5

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: 695ebf9f7ebb344b40750c528481e0add589f95b
4
- data.tar.gz: 96e0796a64cfb046e3859a7cd2ad7e0c2748a9f1
3
+ metadata.gz: 167d45d181120c9a6aa4b7323c20681d925680b7
4
+ data.tar.gz: e8e0218836135ffdb4d9684ed07a5ee3027fca0f
5
5
  SHA512:
6
- metadata.gz: eff7cb14160244b020f104b04039219693fc337c43689e437f22caf368b91111453db497d6a5fdb823be6050442864669dc7967025b8e737be4a94483de6740c
7
- data.tar.gz: 1fba254f6d7e019d9d6b6129fea557efcbdb9afab3ab4197f4aec5e2bbd1d8e16ffed84332b4673e525ff12d19cd2b5ceab63a76fe83eb91c7b242244abcd4dd
6
+ metadata.gz: f0e733d5d7adce8fdbab8a02a3c147b3e2ca6c000a05926d3144a2b8f0ba4f9d744bb59ce41d6586853d12fddca50ce7657e97856ac5dd5cf205307f86ce5859
7
+ data.tar.gz: 1ca5a89dc112249321a75a831482eb679252ec5a3854dd8f9ea9d20009b60ebffe65eb577977442fab2588f1e3c9447b44e3db82be4a1a77d17d53fd24fffb0e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## v1.2.5
2
+
3
+ Bugfixes
4
+
5
+ - Bugs in definition feature.
6
+
7
+ ## v1.2.4
8
+
9
+ Improvements
10
+
11
+ - Use specinfra/core instead of specinfra.
12
+
1
13
  ## v1.2.3
2
14
 
3
15
  Bugfixes
data/lib/itamae.rb CHANGED
@@ -1,3 +1,10 @@
1
+ require 'tracer'
2
+
3
+ Tracer.add_filter {|event, file, line, id, binding, klass|
4
+ file.include?(File.expand_path('../..', __FILE__))
5
+ }
6
+ #Tracer.on
7
+
1
8
  require "itamae/version"
2
9
  require "itamae/runner"
3
10
  require "itamae/cli"
@@ -3,9 +3,13 @@ require 'itamae'
3
3
  module Itamae
4
4
  class Definition < Resource::Base
5
5
  class << self
6
- def create_class(name, params, &block)
6
+ attr_accessor :definition_block
7
+ attr_accessor :defined_in_recipe
8
+
9
+ def create_class(name, params, defined_in_recipe, &block)
7
10
  Class.new(self).tap do |klass|
8
11
  klass.definition_block = block
12
+ klass.defined_in_recipe = defined_in_recipe
9
13
 
10
14
  klass.define_attribute :action, default: :run
11
15
  params.each_pair do |key, value|
@@ -13,62 +17,23 @@ module Itamae
13
17
  end
14
18
  end
15
19
  end
16
-
17
- def definition_block=(block)
18
- @definition_block = block
19
- end
20
-
21
- def definition_block
22
- @definition_block
23
- end
24
20
  end
25
21
 
26
22
  def initialize(*args)
27
23
  super
28
24
 
29
- construct_resources
30
- end
31
-
32
- def action_run(options)
33
- @children.run(options)
34
- end
35
-
36
- private
25
+ r = Recipe::RecipeFromDefinition.new(
26
+ runner,
27
+ self.class.defined_in_recipe.path,
28
+ )
29
+ recipe.children << r
37
30
 
38
- def construct_resources
39
- block = self.class.definition_block
40
-
41
- context = Context.new(self, @attributes.merge(name: resource_name))
42
- context.instance_exec(&block)
43
- @children = context.children
31
+ r.definition = self
32
+ r.load(params: @attributes.merge(name: resource_name))
44
33
  end
45
34
 
46
- class Context
47
- attr_reader :params
48
- attr_reader :children
49
-
50
- def initialize(definition, params, &block)
51
- @definition = definition
52
- @params = params
53
- @children = RecipeChildren.new
54
- end
55
-
56
- def respond_to_missing?(method, include_private = false)
57
- Resource.get_resource_class(method)
58
- true
59
- rescue NameError
60
- false
61
- end
62
-
63
- def method_missing(method, name, &block)
64
- klass = Resource.get_resource_class(method)
65
- resource = klass.new(@definition.recipe, name, &block)
66
- @children << resource
67
- end
68
-
69
- def node
70
- @definition.recipe.runner.node
71
- end
35
+ def run(*args)
36
+ # nothing
72
37
  end
73
38
  end
74
39
  end
data/lib/itamae/recipe.rb CHANGED
@@ -36,12 +36,13 @@ module Itamae
36
36
  ::File.dirname(@path)
37
37
  end
38
38
 
39
- def load
40
- EvalContext.new(self)
39
+ def load(variables = {})
40
+ context = EvalContext.new(self, variables)
41
+ context.instance_eval(File.read(path), path, 1)
41
42
  end
42
43
 
43
44
  def run(options = {})
44
- Logger.info "Recipe: #{@path}"
45
+ show_banner
45
46
 
46
47
  Logger.formatter.with_indent do
47
48
  @children.run(options)
@@ -54,11 +55,19 @@ module Itamae
54
55
  end
55
56
  end
56
57
 
58
+ private
59
+
60
+ def show_banner
61
+ Logger.info "Recipe: #{@path}"
62
+ end
63
+
57
64
  class EvalContext
58
- def initialize(recipe)
65
+ def initialize(recipe, variables)
59
66
  @recipe = recipe
60
67
 
61
- instance_eval(File.read(@recipe.path), @recipe.path, 1)
68
+ variables.each do |k, v|
69
+ define_singleton_method(k) { v }
70
+ end
62
71
  end
63
72
 
64
73
  def respond_to_missing?(method, include_private = false)
@@ -83,16 +92,7 @@ module Itamae
83
92
  end
84
93
 
85
94
  def define(name, params = {}, &block)
86
- class_name = Resource.get_resource_class_name(name)
87
- if Resource.const_defined?(class_name)
88
- Logger.warn "Redefine class. (#{class_name})"
89
- return
90
- end
91
-
92
- Resource.const_set(
93
- Resource.get_resource_class_name(name),
94
- Definition.create_class(name, params, &block)
95
- )
95
+ Resource.define_resource(name, Definition.create_class(name, params, @recipe, &block))
96
96
  end
97
97
 
98
98
  def include_recipe(target)
@@ -124,5 +124,20 @@ module Itamae
124
124
  @recipe.runner
125
125
  end
126
126
  end
127
+
128
+ class RecipeFromDefinition < Recipe
129
+ attr_accessor :definition
130
+
131
+ def load(variables = {})
132
+ context = EvalContext.new(self, variables)
133
+ context.instance_eval(&@definition.class.definition_block)
134
+ end
135
+
136
+ private
137
+
138
+ def show_banner
139
+ Logger.debug "#{@definition.resource_type}[#{@definition.resource_name}]"
140
+ end
141
+ end
127
142
  end
128
143
  end
@@ -23,26 +23,32 @@ module Itamae
23
23
  ParseError = Class.new(StandardError)
24
24
 
25
25
  class << self
26
- def get_resource_class_name(method)
27
- to_camel_case(method.to_s)
28
- end
29
-
30
- def get_resource_plugin_class_name(method)
31
- '::Itamae::Plugin::Resource::' + to_camel_case(method.to_s)
32
- end
33
-
34
26
  def to_camel_case(str)
35
27
  str.split('_').map {|part| part.capitalize}.join
36
28
  end
37
29
 
38
30
  def get_resource_class(method)
39
31
  begin
40
- const_get(get_resource_class_name(method))
41
- rescue NameError => e
42
- const_get(get_resource_plugin_class_name(method))
32
+ self.const_get(to_camel_case(method.to_s))
33
+ rescue NameError
34
+ begin
35
+ ::Itamae::Plugin::Resource.const_get(to_camel_case(method.to_s))
36
+ rescue NameError
37
+ raise Error, "#{method} resource is missing."
38
+ end
43
39
  end
44
40
  end
45
41
 
42
+ def define_resource(name, klass)
43
+ class_name = to_camel_case(name.to_s)
44
+ if Resource.const_defined?(class_name)
45
+ Logger.warn "Redefine class. (#{class_name})"
46
+ return
47
+ end
48
+
49
+ Resource.const_set(class_name, klass)
50
+ end
51
+
46
52
  def parse_description(desc)
47
53
  if /\A([^\[]+)\[([^\]]+)\]\z/ =~ desc
48
54
  [$1, $2]
@@ -1 +1 @@
1
- 1.2.4
1
+ 1.2.5
@@ -130,3 +130,8 @@ describe file('/tmp/created_by_definition') do
130
130
  it { should be_file }
131
131
  its(:content) { should eq("name:name,key:value,message:Hello, Itamae\n") }
132
132
  end
133
+
134
+ describe file('/tmp/remote_file_in_definition') do
135
+ it { should be_file }
136
+ its(:content) { should eq("definition_example\n") }
137
+ end
@@ -207,9 +207,7 @@ end
207
207
 
208
208
  #####
209
209
 
210
- define :definition_example, key: 'default' do
211
- execute "echo 'name:#{params[:name]},key:#{params[:key]},message:#{node[:message]}' > /tmp/created_by_definition"
212
- end
210
+ include_recipe "define/default.rb"
213
211
 
214
212
  definition_example "name" do
215
213
  key 'value'
@@ -0,0 +1,6 @@
1
+ define :definition_example, key: 'default' do
2
+ execute "echo 'name:#{params[:name]},key:#{params[:key]},message:#{node[:message]}' > /tmp/created_by_definition"
3
+
4
+ remote_file "/tmp/remote_file_in_definition"
5
+ end
6
+
@@ -0,0 +1 @@
1
+ definition_example
@@ -2,14 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  module Itamae
4
4
  describe Resource do
5
- describe ".get_resource_class_name" do
6
- let(:method) { :foo_bar_baz }
7
- it "returns camel-cased string" do
8
- expect(described_class.get_resource_class_name(method)).
9
- to eq("FooBarBaz")
10
- end
11
- end
12
-
13
5
  describe ".parse_description" do
14
6
  context "with valid description" do
15
7
  it "returns type and name" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itamae
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Arai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-25 00:00:00.000000000 Z
11
+ date: 2015-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -223,6 +223,8 @@ files:
223
223
  - spec/integration/default_spec.rb
224
224
  - spec/integration/recipes/default.rb
225
225
  - spec/integration/recipes/default2.rb
226
+ - spec/integration/recipes/define/default.rb
227
+ - spec/integration/recipes/define/files/remote_file_in_definition
226
228
  - spec/integration/recipes/files/remote_file_auto
227
229
  - spec/integration/recipes/hello.erb
228
230
  - spec/integration/recipes/hello.txt
@@ -269,6 +271,8 @@ test_files:
269
271
  - spec/integration/default_spec.rb
270
272
  - spec/integration/recipes/default.rb
271
273
  - spec/integration/recipes/default2.rb
274
+ - spec/integration/recipes/define/default.rb
275
+ - spec/integration/recipes/define/files/remote_file_in_definition
272
276
  - spec/integration/recipes/files/remote_file_auto
273
277
  - spec/integration/recipes/hello.erb
274
278
  - spec/integration/recipes/hello.txt