wright 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -47,15 +47,15 @@ module Wright
47
47
  private
48
48
 
49
49
  def package_name
50
- @resource.name
50
+ resource.name
51
51
  end
52
52
 
53
53
  def package_version
54
- @resource.version
54
+ resource.version
55
55
  end
56
56
 
57
57
  def package_options
58
- @resource.options
58
+ resource.options
59
59
  end
60
60
 
61
61
  # @api public
@@ -34,7 +34,7 @@ module Wright
34
34
  def apt_get(action, options, package, version = nil)
35
35
  package_version = version.nil? ? '' : "=#{version}"
36
36
  cmd = 'apt-get'
37
- args = [*options, action.to_s, '-qy', package + package_version]
37
+ args = ['-qy', *options, action.to_s, package + package_version]
38
38
  exec_or_fail(cmd, args, "cannot #{action} package '#{package}'")
39
39
  end
40
40
 
@@ -30,7 +30,7 @@ module Wright
30
30
  def yum(action, options, package, version = nil)
31
31
  cmd = 'yum'
32
32
  package_version = version.nil? ? '' : "-#{version}"
33
- args = [*options, action.to_s, '-y', package + package_version]
33
+ args = ['-y', *options, action.to_s, package + package_version]
34
34
  exec_or_fail(cmd, args, "cannot #{action} package '#{package}'")
35
35
  end
36
36
  end
@@ -36,11 +36,11 @@ module Wright
36
36
  private
37
37
 
38
38
  def link_name
39
- @resource.name
39
+ resource.name
40
40
  end
41
41
 
42
42
  def link_to
43
- @resource.to
43
+ resource.to
44
44
  end
45
45
 
46
46
  def link_to_expanded
@@ -36,35 +36,35 @@ module Wright
36
36
  private
37
37
 
38
38
  def user_name
39
- @resource.name
39
+ resource.name
40
40
  end
41
41
 
42
42
  def uid
43
- @resource.uid
43
+ resource.uid
44
44
  end
45
45
 
46
46
  def primary_group
47
- @resource.primary_group
47
+ resource.primary_group
48
48
  end
49
49
 
50
50
  def full_name
51
- @resource.full_name
51
+ resource.full_name
52
52
  end
53
53
 
54
54
  def groups
55
- @resource.groups
55
+ resource.groups
56
56
  end
57
57
 
58
58
  def shell
59
- @resource.shell
59
+ resource.shell
60
60
  end
61
61
 
62
62
  def home
63
- @resource.home
63
+ resource.home
64
64
  end
65
65
 
66
66
  def system_user?
67
- @resource.system
67
+ resource.system
68
68
  end
69
69
 
70
70
  # @api public
@@ -9,13 +9,13 @@ module Wright
9
9
  # Initializes a Resource.
10
10
  #
11
11
  # @param name [String] the name of the resource
12
- def initialize(name = nil)
13
- @name = name
14
- @resource_name = Util.class_to_resource_name(self.class).to_sym
15
- @provider = provider_for_resource
16
- @action = nil
17
- @on_update = nil
18
- @ignore_failure = false
12
+ def initialize(name = nil, args = {})
13
+ @name = name
14
+ @action = args.fetch(:action, nil)
15
+ @ignore_failure = args.fetch(:ignore_failure, false)
16
+ self.on_update = args.fetch(:on_update, nil)
17
+ @resource_name = Util.class_to_resource_name(self.class).to_sym
18
+ @provider = provider_for_resource
19
19
  end
20
20
 
21
21
  # @return [Symbol] the name of the method to be run by {#run_action}
@@ -69,11 +69,13 @@ module Wright
69
69
  #
70
70
  # @return the return value of the current action
71
71
  def run_action
72
- send @action if @action
72
+ send action if action
73
73
  end
74
74
 
75
75
  private
76
76
 
77
+ attr_reader :on_update, :provider
78
+
77
79
  # @api public
78
80
  # Marks a code block that might update a resource.
79
81
  #
@@ -92,7 +94,7 @@ module Wright
92
94
  #
93
95
  # class Balloon < Wright::Resource
94
96
  # def inflate
95
- # might_update_resource { @provider.inflate }
97
+ # might_update_resource { provider.inflate }
96
98
  # end
97
99
  # end
98
100
  # Wright::Config[:resources] = { balloon: { provider: 'BalloonAnimal' } }
@@ -107,39 +109,39 @@ module Wright
107
109
  yield
108
110
  rescue => e
109
111
  log_error(e)
110
- raise e unless @ignore_failure
112
+ raise e unless ignore_failure
111
113
  end
112
- updated = @provider.updated?
114
+ updated = provider.updated?
113
115
  run_update_action if updated
114
116
  updated
115
117
  end
116
118
 
117
119
  def log_error(exception)
118
- resource = "#{@resource_name}"
119
- resource << " '#{@name}'" if @name
120
+ resource = "#{resource_name}"
121
+ resource << " '#{name}'" if name
120
122
  Wright.log.error "#{resource}: #{exception}"
121
123
  end
122
124
 
123
125
  def run_update_action
124
- return if @on_update.nil?
126
+ return unless on_update
125
127
 
126
- resource = "#{@resource_name} '#{@name}'"
128
+ resource = "#{resource_name} '#{name}'"
127
129
  notification = "run update action for #{resource}"
128
130
  if Wright.dry_run?
129
131
  Wright.log.info "(would) #{notification}"
130
132
  else
131
133
  Wright.log.info notification
132
- @on_update.call
134
+ on_update.call
133
135
  end
134
136
  end
135
137
 
136
138
  def resource_class
137
- Util::ActiveSupport.camelize(@resource_name)
139
+ Util::ActiveSupport.camelize(resource_name)
138
140
  end
139
141
 
140
142
  def provider_name
141
- if Wright::Config.nested_key?(:resources, @resource_name, :provider)
142
- Wright::Config[:resources][@resource_name][:provider]
143
+ if Wright::Config.nested_key?(:resources, resource_name, :provider)
144
+ Wright::Config[:resources][resource_name][:provider]
143
145
  else
144
146
  "Wright::Provider::#{resource_class}"
145
147
  end
@@ -17,11 +17,18 @@ module Wright
17
17
  # Initializes a Directory.
18
18
  #
19
19
  # @param name [String] the directory's name
20
- def initialize(name)
20
+ # @param args [Hash] the arguments
21
+ # @option args [Symbol] :action (:create) the action
22
+ # @option args [String, Integer] :mode the directory's mode
23
+ # @option args [String, Integer] :owner the directory's owner
24
+ # @option args [String, Integer] :group the directory's group
25
+ def initialize(name, args = {})
21
26
  super
22
- @mode = nil
23
- @owner = Wright::Util::FileOwner.new
24
- @action = :create
27
+ @action = args.fetch(:action, :create)
28
+ @mode = args.fetch(:mode, nil)
29
+ owner = args.fetch(:owner, nil)
30
+ group = args.fetch(:group, nil)
31
+ @dir_owner = Wright::Util::FileOwner.new(owner, group)
25
32
  end
26
33
 
27
34
  # @return [String, Integer] the directory's intended mode
@@ -31,15 +38,15 @@ module Wright
31
38
  # @return [String, Integer] the directory's intended owner
32
39
  # @!method owner=
33
40
  # @see #owner
34
- def_delegator :@owner, :user_and_group=, :owner=
35
- def_delegator :@owner, :user, :owner
41
+ def_delegator :dir_owner, :user_and_group=, :owner=
42
+ def_delegator :dir_owner, :user, :owner
36
43
 
37
44
  # @!attribute group
38
45
  # @return [String, Integer] the directory's intended group
39
46
  # @!method group=
40
47
  # @see #group
41
- def_delegator :@owner, :group
42
- def_delegator :@owner, :group=
48
+ def_delegator :dir_owner, :group
49
+ def_delegator :dir_owner, :group=
43
50
 
44
51
  # Creates or updates the directory.
45
52
  #
@@ -47,7 +54,7 @@ module Wright
47
54
  # otherwise
48
55
  def create
49
56
  might_update_resource do
50
- @provider.create
57
+ provider.create
51
58
  end
52
59
  end
53
60
 
@@ -57,9 +64,13 @@ module Wright
57
64
  # otherwise
58
65
  def remove
59
66
  might_update_resource do
60
- @provider.remove
67
+ provider.remove
61
68
  end
62
69
  end
70
+
71
+ private
72
+
73
+ attr_reader :dir_owner
63
74
  end
64
75
  end
65
76
  end
@@ -9,13 +9,12 @@ module Wright
9
9
  # Symlink resource, represents a symlink.
10
10
  #
11
11
  # @example
12
- # file = Wright::Resource::File.new('/tmp/foo')
13
- # file.content = 'bar'
12
+ # file = Wright::Resource::File.new('/tmp/foo', content: 'bar')
14
13
  # file.create
15
14
  class File < Wright::Resource
16
15
  extend Forwardable
17
16
 
18
- # @return [String] the file's intended content
17
+ # @return [String, #to_s] the file's intended content
19
18
  attr_accessor :content
20
19
 
21
20
  # @return [String, Integer] the file's intended mode
@@ -25,25 +24,33 @@ module Wright
25
24
  # @return [String, Integer] the directory's intended owner
26
25
  # @!method owner=
27
26
  # @see #owner
28
- def_delegator :@owner, :user_and_group=, :owner=
29
- def_delegator :@owner, :user, :owner
27
+ def_delegator :file_owner, :user_and_group=, :owner=
28
+ def_delegator :file_owner, :user, :owner
30
29
 
31
30
  # @!attribute group
32
31
  # @return [String, Integer] the directory's intended group
33
32
  # @!method group=
34
33
  # @see #group
35
- def_delegator :@owner, :group=
36
- def_delegator :@owner, :group
34
+ def_delegator :file_owner, :group=
35
+ def_delegator :file_owner, :group
37
36
 
38
37
  # Initializes a File.
39
38
  #
40
39
  # @param name [String] the file's name
41
- def initialize(name)
40
+ # @param args [Hash] the arguments
41
+ # @option args [Symbol] :action (:create) the action
42
+ # @option args [String, #to_s] :content the file's content
43
+ # @option args [String, Integer] :mode the file's mode
44
+ # @option args [String, Integer] :owner the file's owner
45
+ # @option args [String, Integer] :group the file's group
46
+ def initialize(name, args = {})
42
47
  super
43
- @content = nil
44
- @mode = nil
45
- @owner = Wright::Util::FileOwner.new
46
- @action = :create
48
+ @action = args.fetch(:action, :create)
49
+ @content = args.fetch(:content, nil)
50
+ @mode = args.fetch(:mode, nil)
51
+ owner = args.fetch(:owner, nil)
52
+ group = args.fetch(:group, nil)
53
+ @file_owner = Wright::Util::FileOwner.new(owner, group)
47
54
  end
48
55
 
49
56
  # Creates or updates the file.
@@ -52,7 +59,7 @@ module Wright
52
59
  # otherwise
53
60
  def create
54
61
  might_update_resource do
55
- @provider.create
62
+ provider.create
56
63
  end
57
64
  end
58
65
 
@@ -62,9 +69,13 @@ module Wright
62
69
  # otherwise
63
70
  def remove
64
71
  might_update_resource do
65
- @provider.remove
72
+ provider.remove
66
73
  end
67
74
  end
75
+
76
+ private
77
+
78
+ attr_reader :file_owner
68
79
  end
69
80
  end
70
81
  end
@@ -6,8 +6,7 @@ module Wright
6
6
  # Group resource, represents a group.
7
7
  #
8
8
  # @example
9
- # admins = Wright::Resource::Group.new('admins')
10
- # admins.members = ['root']
9
+ # admins = Wright::Resource::Group.new('admins', members: ['root'])
11
10
  # admins.create
12
11
  # @todo Use GnuPasswd provider on all GNU-flavoured systems
13
12
  class Group < Wright::Resource
@@ -24,10 +23,18 @@ module Wright
24
23
  # Initializes a Group.
25
24
  #
26
25
  # @param name [String] the group's name
27
- def initialize(name)
26
+ # @param args [Hash] the arguments
27
+ # @option args [Symbol] :action (:create) the action
28
+ # @option args [Array<String>] :members the group's members
29
+ # @option args [Integer] :gid the group's gid
30
+ # @option args [Bool] :system (false) denotes whether the group
31
+ # should be a system group or not
32
+ def initialize(name, args = {})
28
33
  super
29
- @action = :create
30
- @system = false
34
+ @action = args.fetch(:action, :create)
35
+ @members = args.fetch(:members, nil)
36
+ @gid = args.fetch(:gid, nil)
37
+ @system = args.fetch(:system, false)
31
38
  end
32
39
 
33
40
  # Creates or updates the group.
@@ -36,7 +43,7 @@ module Wright
36
43
  # otherwise
37
44
  def create
38
45
  might_update_resource do
39
- @provider.create
46
+ provider.create
40
47
  end
41
48
  end
42
49
 
@@ -46,7 +53,7 @@ module Wright
46
53
  # otherwise
47
54
  def remove
48
55
  might_update_resource do
49
- @provider.remove
56
+ provider.remove
50
57
  end
51
58
  end
52
59
  end
@@ -57,9 +64,9 @@ Wright::DSL.register_resource(Wright::Resource::Group)
57
64
 
58
65
  group_providers = {
59
66
  'debian' => 'Wright::Provider::Group::GnuPasswd',
60
- 'rhel' => 'Wright::Provider::Group::GnuPasswd',
61
67
  'fedora' => 'Wright::Provider::Group::GnuPasswd',
62
- 'macosx' => 'Wright::Provider::Group::DarwinDirectoryService'
68
+ 'rhel' => 'Wright::Provider::Group::GnuPasswd',
69
+ 'osx' => 'Wright::Provider::Group::DarwinDirectoryService'
63
70
  }
64
71
  Wright::Config[:resources][:group] ||= {}
65
72
  Wright::Config[:resources][:group][:provider] ||=
@@ -34,20 +34,24 @@ module Wright
34
34
  # Initializes a Package.
35
35
  #
36
36
  # @param name [String] the package's name
37
- def initialize(name)
37
+ # @param args [Hash] the arguments
38
+ # @option args [Symbol] :action (:install) the action
39
+ # @option args [String, #to_s] :version the package version
40
+ # @option args [String, Array<String>] :options the package options
41
+ def initialize(name, args = {})
38
42
  super
39
- @version = nil
40
- @options = nil
41
- @action = :install
43
+ @action = args.fetch(:action, :install)
44
+ @version = args.fetch(:version, nil)
45
+ @options = args.fetch(:options, nil)
42
46
  end
43
47
 
44
48
  # @!method installed_versions
45
49
  # @return [Array<String>] the installed package versions
46
- def_delegator :@provider, :installed_versions
50
+ def_delegator :provider, :installed_versions
47
51
 
48
52
  # @!method installed?
49
53
  # @return [Bool] +true+ if the package is installed
50
- def_delegator :@provider, :installed?
54
+ def_delegator :provider, :installed?
51
55
 
52
56
  # Installs the Package.
53
57
  #
@@ -55,7 +59,7 @@ module Wright
55
59
  # otherwise
56
60
  def install
57
61
  might_update_resource do
58
- @provider.install
62
+ provider.install
59
63
  end
60
64
  end
61
65
 
@@ -65,7 +69,7 @@ module Wright
65
69
  # otherwise
66
70
  def remove
67
71
  might_update_resource do
68
- @provider.remove
72
+ provider.remove
69
73
  end
70
74
  end
71
75
 
@@ -78,8 +82,9 @@ Wright::DSL.register_resource(Wright::Resource::Package)
78
82
 
79
83
  package_providers = {
80
84
  'debian' => 'Wright::Provider::Package::Apt',
85
+ 'fedora' => 'Wright::Provider::Package::Yum',
81
86
  'rhel' => 'Wright::Provider::Package::Yum',
82
- 'macosx' => 'Wright::Provider::Package::Homebrew'
87
+ 'osx' => 'Wright::Provider::Package::Homebrew'
83
88
  }
84
89
  Wright::Config[:resources][:package] ||= {}
85
90
  Wright::Config[:resources][:package][:provider] ||=