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
@@ -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] ||=