wright 0.4.4 → 0.5.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +10 -3
  3. data/NEWS.md +8 -0
  4. data/README.md +9 -16
  5. data/lib/wright/cli.rb +25 -24
  6. data/lib/wright/config.rb +5 -3
  7. data/lib/wright/dsl.rb +52 -9
  8. data/lib/wright/logger.rb +1 -1
  9. data/lib/wright/provider.rb +8 -5
  10. data/lib/wright/provider/directory.rb +2 -2
  11. data/lib/wright/provider/file.rb +4 -4
  12. data/lib/wright/provider/group.rb +4 -4
  13. data/lib/wright/provider/package.rb +3 -3
  14. data/lib/wright/provider/package/apt.rb +1 -1
  15. data/lib/wright/provider/package/yum.rb +1 -1
  16. data/lib/wright/provider/symlink.rb +2 -2
  17. data/lib/wright/provider/user.rb +8 -8
  18. data/lib/wright/resource.rb +21 -19
  19. data/lib/wright/resource/directory.rb +21 -10
  20. data/lib/wright/resource/file.rb +25 -14
  21. data/lib/wright/resource/group.rb +16 -9
  22. data/lib/wright/resource/package.rb +14 -9
  23. data/lib/wright/resource/symlink.rb +10 -8
  24. data/lib/wright/resource/user.rb +30 -9
  25. data/lib/wright/util.rb +14 -2
  26. data/lib/wright/util/erb_renderer.rb +29 -0
  27. data/lib/wright/util/file.rb +1 -1
  28. data/lib/wright/util/file_owner.rb +8 -3
  29. data/lib/wright/util/file_permissions.rb +14 -12
  30. data/lib/wright/util/file_renderer.rb +50 -0
  31. data/lib/wright/util/mustache_renderer.rb +41 -0
  32. data/lib/wright/util/pencil_mustache.rb +58 -0
  33. data/lib/wright/version.rb +1 -1
  34. data/man/wright.1 +10 -11
  35. data/spec/dsl_spec.rb +72 -7
  36. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.return → apt-get_-qy_--purge_remove_abcde.return} +0 -0
  37. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stderr → apt-get_-qy_--purge_remove_abcde.stderr} +0 -0
  38. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stdout → apt-get_-qy_--purge_remove_abcde.stdout} +0 -0
  39. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.return → apt-get_-qy_install_abcde=2.5.4-1.return} +0 -0
  40. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stderr → apt-get_-qy_install_abcde=2.5.4-1.stderr} +0 -0
  41. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stdout → apt-get_-qy_install_abcde=2.5.4-1.stdout} +0 -0
  42. data/spec/provider/package/apt/{apt-get_install_-qy_htop.return → apt-get_-qy_install_htop.return} +0 -0
  43. data/spec/provider/package/apt/{apt-get_install_-qy_htop.stderr → apt-get_-qy_install_htop.stderr} +0 -0
  44. data/spec/provider/package/apt/{apt-get_install_-qy_htop.stdout → apt-get_-qy_install_htop.stdout} +0 -0
  45. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.return → apt-get_-qy_install_not-a-real-package.return} +0 -0
  46. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stderr → apt-get_-qy_install_not-a-real-package.stderr} +0 -0
  47. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stdout → apt-get_-qy_install_not-a-real-package.stdout} +0 -0
  48. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.return → apt-get_-qy_remove_abcde.return} +0 -0
  49. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stderr → apt-get_-qy_remove_abcde.stderr} +0 -0
  50. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stdout → apt-get_-qy_remove_abcde.stdout} +0 -0
  51. data/spec/provider/package/apt_spec.rb +2 -2
  52. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.return → yum_-y_install_mc-4.8.7-8.el7.return} +0 -0
  53. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stderr → yum_-y_install_mc-4.8.7-8.el7.stderr} +0 -0
  54. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stdout → yum_-y_install_mc-4.8.7-8.el7.stdout} +0 -0
  55. data/spec/provider/package/yum/{yum_install_-y_nano.return → yum_-y_install_nano.return} +0 -0
  56. data/spec/provider/package/yum/{yum_install_-y_nano.stderr → yum_-y_install_nano.stderr} +0 -0
  57. data/spec/provider/package/yum/{yum_install_-y_nano.stdout → yum_-y_install_nano.stdout} +0 -0
  58. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.return → yum_-y_install_not-a-real-package.return} +0 -0
  59. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stderr → yum_-y_install_not-a-real-package.stderr} +0 -0
  60. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stdout → yum_-y_install_not-a-real-package.stdout} +0 -0
  61. data/spec/provider/package/yum/{yum_remove_-y_screen.return → yum_-y_remove_screen.return} +0 -0
  62. data/spec/provider/package/yum/{yum_remove_-y_screen.stderr → yum_-y_remove_screen.stderr} +0 -0
  63. data/spec/provider/package/yum/{yum_remove_-y_screen.stdout → yum_-y_remove_screen.stdout} +0 -0
  64. data/spec/provider/package/yum_spec.rb +1 -1
  65. data/spec/resource/directory_spec.rb +15 -0
  66. data/spec/resource/file_spec.rb +17 -0
  67. data/spec/resource/group_spec.rb +15 -0
  68. data/spec/resource/package_spec.rb +13 -0
  69. data/spec/resource/symlink_spec.rb +11 -0
  70. data/spec/resource/user_spec.rb +32 -0
  71. data/spec/resource_spec.rb +18 -10
  72. data/spec/spec_helper.rb +1 -0
  73. data/spec/spec_helpers/fake_capture3.rb +1 -1
  74. data/spec/util/erb_renderer_spec.rb +23 -0
  75. data/spec/util/file_owner_spec.rb +19 -0
  76. data/spec/util/file_renderer_spec.rb +28 -0
  77. data/spec/util/mustache_renderer_spec.rb +57 -0
  78. data/spec/util/pencil_mustache_spec.rb +15 -0
  79. data/spec/util_spec.rb +17 -3
  80. metadata +90 -64
@@ -1,4 +1,4 @@
1
1
  module Wright # rubocop:disable Documentation
2
2
  # Current wright version
3
- VERSION = '0.4.4'
3
+ VERSION = '0.5.0'
4
4
  end
@@ -2,12 +2,12 @@
2
2
  .\" Title: wright
3
3
  .\" Author: [see the "AUTHOR" section]
4
4
  .\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
5
- .\" Date: 06/03/2015
5
+ .\" Date: 09/20/2015
6
6
  .\" Manual: \ \&
7
7
  .\" Source: \ \&
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "WRIGHT" "1" "06/03/2015" "\ \&" "\ \&"
10
+ .TH "WRIGHT" "1" "09/20/2015" "\ \&" "\ \&"
11
11
  .\" -----------------------------------------------------------------
12
12
  .\" * Define some portability stuff
13
13
  .\" -----------------------------------------------------------------
@@ -94,7 +94,7 @@ Create a system user named "foobard":
94
94
  .RS 4
95
95
  .\}
96
96
  .nf
97
- wright \-e \*(Aquser("foobard") { |u| u\&.system = true }\*(Aq
97
+ wright \-e \*(Aquser "foobard", system: true\*(Aq
98
98
  .fi
99
99
  .if n \{\
100
100
  .RE
@@ -106,7 +106,7 @@ Create a system group named "foobard":
106
106
  .RS 4
107
107
  .\}
108
108
  .nf
109
- wright \-e \*(Aqgroup("foobard") { |u| u\&.system = true }\*(Aq
109
+ wright \-e \*(Aqgroup "foobard", system: true\*(Aq
110
110
  .fi
111
111
  .if n \{\
112
112
  .RE
@@ -118,7 +118,7 @@ Create a file named \fI/etc/issue\fR containing the current wright version:
118
118
  .RS 4
119
119
  .\}
120
120
  .nf
121
- wright \-e \*(Aqfile("/etc/issue") { |f| f\&.content = Wright::VERSION }\*(Aq
121
+ wright \-e \*(Aqfile "/etc/issue", content: Wright::VERSION\*(Aq
122
122
  .fi
123
123
  .if n \{\
124
124
  .RE
@@ -142,7 +142,7 @@ Create a symlink from \fI\&.bash_profile\fR to \fI\&.profile\fR in the current u
142
142
  .RS 4
143
143
  .\}
144
144
  .nf
145
- wright \-e \*(Aqsymlink("~/\&.bash_profile") { |s| s\&.to = "~/\&.profile" }\*(Aq
145
+ wright \-e \*(Aqsymlink "~/\&.bash_profile", to: "~/\&.profile"\*(Aq
146
146
  .fi
147
147
  .if n \{\
148
148
  .RE
@@ -156,15 +156,14 @@ To install tmux and update its config file from a wright script, create the foll
156
156
  .nf
157
157
  package \*(Aqtmux\*(Aq
158
158
 
159
- file \*(Aq/etc/tmux\&.conf\*(Aq do |f|
160
- f\&.content = <<EOF
159
+ file \*(Aq/etc/tmux\&.conf\*(Aq,
160
+ mode: \*(Aq444\*(Aq,
161
+ on_update: \-> { puts \*(AqUpdated /etc/tmux\&.conf\*(Aq },
162
+ content: <<EOF
161
163
  unbind C\-b
162
164
  set \-g prefix C\-a
163
165
  bind\-key a send\-prefix
164
166
  EOF
165
- f\&.mode = \*(Aq444\*(Aq
166
- f\&.on_update = \-> { puts \*(AqUpdated /etc/tmux\&.conf\*(Aq }
167
- end
168
167
  .fi
169
168
  .if n \{\
170
169
  .RE
@@ -6,9 +6,8 @@ describe Wright::DSL do
6
6
  before(:each) do
7
7
  # duplicate Wright::DSL for testing
8
8
  dsl = Wright::DSL.dup
9
- @recipe = Class.new do
10
- extend dsl
11
- end
9
+ @recipe = Object.new
10
+ @recipe.extend(dsl)
12
11
  @wright_dsl = dsl
13
12
  end
14
13
 
@@ -17,7 +16,8 @@ describe Wright::DSL do
17
16
  def self.name
18
17
  'ResourceKlass'
19
18
  end
20
- def initialize(_name); end
19
+
20
+ def initialize(_name, _args); end
21
21
  end
22
22
 
23
23
  @wright_dsl.register_resource(resource_class)
@@ -26,8 +26,10 @@ describe Wright::DSL do
26
26
  resource_name = 'just a name'
27
27
  @recipe.must_respond_to(resource_method_name)
28
28
 
29
+ # Ruby 1.9: "0 for 1", Ruby 2: "0 for 1..2"
30
+ error_message_re = /\Awrong number of arguments \(0 for 1(..2)?\)\Z/
29
31
  e = -> { @recipe.send(resource_method_name) }.must_raise ArgumentError
30
- e.message.must_equal 'wrong number of arguments (0 for 1)'
32
+ e.message.must_match error_message_re
31
33
 
32
34
  resource = @recipe.send(resource_method_name, resource_name)
33
35
  resource.must_be_instance_of(resource_class)
@@ -39,7 +41,7 @@ describe Wright::DSL do
39
41
  'Hello'
40
42
  end
41
43
 
42
- def initialize(name)
44
+ def initialize(name, _args = {})
43
45
  @name = name
44
46
  end
45
47
 
@@ -58,7 +60,7 @@ describe Wright::DSL do
58
60
  'ResourceKlass'
59
61
  end
60
62
 
61
- def initialize(_name); end
63
+ def initialize(_name, _args = {}); end
62
64
  end
63
65
  @wright_dsl.register_resource(resource_class)
64
66
 
@@ -67,4 +69,67 @@ describe Wright::DSL do
67
69
 
68
70
  -> { @recipe.send(resource_name, nil, &block) }.must_throw resource_class
69
71
  end
72
+
73
+ describe '#util' do
74
+ it 'should return a Wright::DSL::Util object' do
75
+ @recipe.util.must_be_instance_of Wright::DSL::Util
76
+ end
77
+ end
78
+ end
79
+
80
+ describe Wright::DSL::Util do
81
+ before(:each) { @util = Wright::DSL::Util.new }
82
+
83
+ describe '#render_erb' do
84
+ it 'should delegate rendering ERB templates to ErbRenderer' do
85
+ erb_renderer_class_double = Minitest::Mock.new
86
+ erb_renderer_object_double = Minitest::Mock.new
87
+ erb_renderer_class_double.expect(:new,
88
+ erb_renderer_object_double,
89
+ [:hash])
90
+ erb_renderer_object_double.expect(:render, nil, [:template])
91
+
92
+ Wright::Util.stub_const(:ErbRenderer,
93
+ erb_renderer_class_double) do
94
+ @util.render_erb(:template, :hash)
95
+ end
96
+ erb_renderer_class_double.verify
97
+ erb_renderer_object_double.verify
98
+ end
99
+ end
100
+
101
+ describe '#render_mustache' do
102
+ it 'should delegate rendering mustache templates to MustacheRenderer' do
103
+ mustache_renderer_class_double = Minitest::Mock.new
104
+ mustache_renderer_object_double = Minitest::Mock.new
105
+ mustache_renderer_class_double.expect(:new,
106
+ mustache_renderer_object_double,
107
+ [:hash])
108
+ mustache_renderer_object_double.expect(:render, nil, [:template])
109
+
110
+ Wright::Util.stub_const(:MustacheRenderer,
111
+ mustache_renderer_class_double) do
112
+ @util.render_mustache(:template, :hash)
113
+ end
114
+ mustache_renderer_class_double.verify
115
+ mustache_renderer_object_double.verify
116
+ end
117
+ end
118
+
119
+ describe '#render_file' do
120
+ it 'should delegate rendering files templates to FileRenderer' do
121
+ file_renderer_class_double = Minitest::Mock.new
122
+ file_renderer_object_double = Minitest::Mock.new
123
+ file_renderer_class_double.expect(:new,
124
+ file_renderer_object_double,
125
+ [:hash])
126
+ file_renderer_object_double.expect(:render, nil, [:filename])
127
+
128
+ Wright::Util.stub_const(:FileRenderer, file_renderer_class_double) do
129
+ @util.render_file(:filename, :hash)
130
+ end
131
+ file_renderer_class_double.verify
132
+ file_renderer_object_double.verify
133
+ end
134
+ end
70
135
  end
@@ -10,7 +10,7 @@ describe Wright::Provider::Package::Apt do
10
10
  def apt_get(action, pkg_name, args = {})
11
11
  version = args[:version].nil? ? '' : "=#{args[:version]}"
12
12
  options = args[:options]
13
- ['apt-get', *options, action.to_s, '-qy', pkg_name + version]
13
+ ['apt-get', '-qy', *options, action.to_s, pkg_name + version]
14
14
  end
15
15
 
16
16
  def package_provider(pkg_name, args = {})
@@ -135,7 +135,7 @@ describe Wright::Provider::Package::Apt do
135
135
  pkg_provider = package_provider(pkg_name, options: pkg_options)
136
136
  apt_cmd = apt_get(:install, pkg_name, options: pkg_options)
137
137
 
138
- @fake_capture3.expect(apt_cmd, 'apt-get_install_-qy_htop')
138
+ @fake_capture3.expect(apt_cmd, 'apt-get_-qy_install_htop')
139
139
  @fake_capture3.stub do
140
140
  pkg_provider.send(:install_package)
141
141
  end
@@ -18,7 +18,7 @@ describe Wright::Provider::Package::Yum do
18
18
 
19
19
  def yum(action, pkg_name, args = {})
20
20
  version = args[:version].nil? ? '' : "-#{args[:version]}"
21
- ['yum', *args[:options], action.to_s, '-y', pkg_name + version]
21
+ ['yum', '-y', *args[:options], action.to_s, pkg_name + version]
22
22
  end
23
23
 
24
24
  before :each do
@@ -9,6 +9,21 @@ describe Wright::Resource::Directory do
9
9
 
10
10
  after(:each) { FakeFS::FileSystem.clear }
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Directory.new(@dirname,
15
+ mode: 'sample_mode',
16
+ action: 'sample_action',
17
+ owner: 'sample_owner',
18
+ group: 'sample_group')
19
+ resource.name.must_equal @dirname
20
+ resource.mode.must_equal 'sample_mode'
21
+ resource.action.must_equal 'sample_action'
22
+ resource.owner.must_equal 'sample_owner'
23
+ resource.group.must_equal 'sample_group'
24
+ end
25
+ end
26
+
12
27
  describe '#create' do
13
28
  it 'should create directories' do
14
29
  FakeFS do
@@ -12,6 +12,23 @@ describe Wright::Resource::File do
12
12
 
13
13
  after(:each) { FakeFS::FileSystem.clear }
14
14
 
15
+ describe '#initialize' do
16
+ it 'should accept attributes via an argument hash' do
17
+ resource = Wright::Resource::File.new(@filename,
18
+ content: 'sample_content',
19
+ mode: 'sample_mode',
20
+ action: 'sample_action',
21
+ owner: 'sample_owner',
22
+ group: 'sample_group')
23
+ resource.name.must_equal @filename
24
+ resource.content.must_equal 'sample_content'
25
+ resource.mode.must_equal 'sample_mode'
26
+ resource.action.must_equal 'sample_action'
27
+ resource.owner.must_equal 'sample_owner'
28
+ resource.group.must_equal 'sample_group'
29
+ end
30
+ end
31
+
15
32
  describe '#create' do
16
33
  it 'should create files' do
17
34
  FakeFS do
@@ -9,6 +9,21 @@ describe Wright::Resource::Group do
9
9
  @group.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Group.new('sample_name',
15
+ members: 'sample_members',
16
+ gid: 'sample_gid',
17
+ system: 'sample_system',
18
+ action: 'sample_action')
19
+ resource.name.must_equal 'sample_name'
20
+ resource.members.must_equal 'sample_members'
21
+ resource.gid.must_equal 'sample_gid'
22
+ resource.system.must_equal 'sample_system'
23
+ resource.action.must_equal 'sample_action'
24
+ end
25
+ end
26
+
12
27
  describe '#create' do
13
28
  it 'should ask the provider to create the group' do
14
29
  @provider.expect(:create, nil)
@@ -9,6 +9,19 @@ describe Wright::Resource::Package do
9
9
  @package.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Package.new('sample_name',
15
+ version: 'sample_version',
16
+ options: 'sample_options',
17
+ action: 'sample_action')
18
+ resource.name.must_equal 'sample_name'
19
+ resource.version.must_equal 'sample_version'
20
+ resource.options.must_equal 'sample_options'
21
+ resource.action.must_equal 'sample_action'
22
+ end
23
+ end
24
+
12
25
  describe '#installed_versions' do
13
26
  it 'should ask the provider for installed versions' do
14
27
  @provider.expect(:installed_versions, nil)
@@ -18,6 +18,17 @@ describe Wright::Resource::Symlink do
18
18
  link
19
19
  end
20
20
 
21
+ describe '#initialize' do
22
+ it 'should accept attributes via an argument hash' do
23
+ resource = Wright::Resource::Symlink.new(@link_name,
24
+ to: 'sample_to',
25
+ action: 'sample_action')
26
+ resource.name.must_equal @link_name
27
+ resource.to.must_equal 'sample_to'
28
+ resource.action.must_equal 'sample_action'
29
+ end
30
+ end
31
+
21
32
  describe '#create' do
22
33
  it 'should create symlinks' do
23
34
  FakeFS do
@@ -9,6 +9,38 @@ describe Wright::Resource::User do
9
9
  @user.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::User.new('sample_name',
15
+ uid: 'sample_uid',
16
+ full_name: 'sample_full_name',
17
+ groups: 'sample_groups',
18
+ shell: 'sample_shell',
19
+ home: 'sample_home',
20
+ primary_group: 'sample_pgroup',
21
+ system: 'sample_system',
22
+ action: 'sample_action')
23
+ resource.name.must_equal 'sample_name'
24
+ resource.uid.must_equal 'sample_uid'
25
+ resource.full_name.must_equal 'sample_full_name'
26
+ resource.groups.must_equal 'sample_groups'
27
+ resource.shell.must_equal 'sample_shell'
28
+ resource.home.must_equal 'sample_home'
29
+ resource.primary_group.must_equal 'sample_pgroup'
30
+ resource.system.must_equal 'sample_system'
31
+ resource.action.must_equal 'sample_action'
32
+ end
33
+
34
+ it 'should accept aliased attributes via an argument hash' do
35
+ resource = Wright::Resource::User.new('sample_name',
36
+ login_group: 'sample_login_group',
37
+ homedir: 'sample_homedir')
38
+ resource.name.must_equal 'sample_name'
39
+ resource.login_group.must_equal 'sample_login_group'
40
+ resource.homedir.must_equal 'sample_homedir'
41
+ end
42
+ end
43
+
12
44
  describe '#create' do
13
45
  it 'should ask the provider to create the user' do
14
46
  @provider.expect(:create, nil)
@@ -3,13 +3,6 @@ require_relative 'spec_helper'
3
3
  require 'wright/resource'
4
4
  require 'wright/provider'
5
5
 
6
- module Wright
7
- # add provider attribute reader for tests
8
- class Resource
9
- attr_reader :provider
10
- end
11
- end
12
-
13
6
  module Wright
14
7
  class Provider
15
8
  class Sample < Wright::Provider; end
@@ -56,20 +49,23 @@ describe Wright::Resource do
56
49
 
57
50
  it 'should retrieve a provider for a resource' do
58
51
  provider_class = Wright::Provider::Sample
59
- Sample.new.provider.must_be_kind_of provider_class
52
+ provider = Sample.new.send(:provider)
53
+ provider.must_be_kind_of provider_class
60
54
  end
61
55
 
62
56
  it 'should retrieve a provider for a resource listed in the config' do
63
57
  # instantiating the Sample resource without any config should
64
58
  # yield the Sample provider
65
59
  provider_class = Wright::Provider::Sample
66
- Sample.new.provider.must_be_kind_of provider_class
60
+ provider = Sample.new.send(:provider)
61
+ provider.must_be_kind_of provider_class
67
62
 
68
63
  # when the provider for Sample resources is set to
69
64
  # AlternateSample, AlternateSample should be instantiated
70
65
  alternate = Wright::Provider::AlternateSample
71
66
  Wright::Config[:resources] = { sample: { provider: alternate.name } }
72
- Sample.new.provider.must_be_kind_of alternate
67
+ alternate_provider = Sample.new.send(:provider)
68
+ alternate_provider.must_be_kind_of alternate
73
69
  end
74
70
 
75
71
  it 'should display warnings for nonexistent providers' do
@@ -189,4 +185,16 @@ describe Wright::Resource do
189
185
  resource.fail_train
190
186
  end.must_raise(RuntimeError)
191
187
  end
188
+
189
+ it 'should accept attributes via an argument hash' do
190
+ sample_lambda = -> {}
191
+ sample = Sample.new('sample_name',
192
+ action: 'sample_action',
193
+ on_update: sample_lambda,
194
+ ignore_failure: 'sample_ignore_failure')
195
+ sample.name.must_equal 'sample_name'
196
+ sample.action.must_equal 'sample_action'
197
+ sample.send(:on_update).must_equal sample_lambda
198
+ sample.ignore_failure.must_equal 'sample_ignore_failure'
199
+ end
192
200
  end