wright 0.2.0 → 0.3.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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +8 -0
  3. data/README.md +2 -0
  4. data/Rakefile +6 -0
  5. data/bin/wright +6 -0
  6. data/lib/wright/cli.rb +68 -0
  7. data/lib/wright/dsl.rb +1 -1
  8. data/lib/wright/provider/directory.rb +17 -12
  9. data/lib/wright/provider/file.rb +24 -17
  10. data/lib/wright/provider/group/darwin_directory_service.rb +1 -8
  11. data/lib/wright/provider/group/gnu_passwd.rb +0 -1
  12. data/lib/wright/provider/group.rb +6 -12
  13. data/lib/wright/provider/package/apt.rb +9 -21
  14. data/lib/wright/provider/package/homebrew.rb +5 -18
  15. data/lib/wright/provider/package.rb +22 -11
  16. data/lib/wright/provider/symlink.rb +17 -22
  17. data/lib/wright/provider/user/darwin_directory_service.rb +65 -0
  18. data/lib/wright/provider/user/gnu_passwd.rb +6 -7
  19. data/lib/wright/provider/user.rb +6 -12
  20. data/lib/wright/provider.rb +20 -2
  21. data/lib/wright/resource/directory.rb +19 -20
  22. data/lib/wright/resource/file.rb +19 -15
  23. data/lib/wright/resource/symlink.rb +1 -0
  24. data/lib/wright/resource/user.rb +2 -1
  25. data/lib/wright/resource.rb +1 -1
  26. data/lib/wright/util/file_owner.rb +61 -0
  27. data/lib/wright/util/file_permissions.rb +21 -30
  28. data/lib/wright/util/stolen_from_activesupport.rb +1 -1
  29. data/lib/wright/util/user.rb +48 -23
  30. data/lib/wright/util.rb +10 -6
  31. data/lib/wright/version.rb +1 -1
  32. data/lib/wright.rb +1 -0
  33. data/man/wright.1 +202 -0
  34. data/spec/cli/shebang.rb +3 -0
  35. data/spec/cli_spec.rb +64 -0
  36. data/spec/dsl_spec.rb +8 -3
  37. data/spec/provider/group/darwin_directory_service_spec.rb +3 -2
  38. data/spec/provider/package/apt/apt-cache_policy_abcde.stdout +7 -0
  39. data/spec/provider/package/apt/apt-cache_policy_htop.stdout +6 -0
  40. data/spec/provider/package/apt/apt-cache_policy_not-a-real-package.return +1 -0
  41. data/spec/provider/package/apt_spec.rb +17 -211
  42. data/spec/provider/package/homebrew_spec.rb +11 -164
  43. data/spec/provider/package_spec.rb +151 -7
  44. data/spec/provider/user/darwin_directory_service/dscl-delete-user.return +1 -0
  45. data/spec/provider/user/darwin_directory_service/dscl-delete-user.stderr +0 -0
  46. data/spec/provider/user/darwin_directory_service/dscl-delete-user.stdout +0 -0
  47. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.return +1 -0
  48. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stderr +0 -0
  49. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stdout +0 -0
  50. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.return +1 -0
  51. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stderr +0 -0
  52. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stdout +0 -0
  53. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.return +1 -0
  54. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stderr +0 -0
  55. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stdout +0 -0
  56. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.return +1 -0
  57. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stderr +0 -0
  58. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stdout +0 -0
  59. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.return +1 -0
  60. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stderr +0 -0
  61. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stdout +0 -0
  62. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.return +1 -0
  63. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stderr +0 -0
  64. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stdout +0 -0
  65. data/spec/provider/user/darwin_directory_service_spec.rb +167 -0
  66. data/spec/provider/user/gnu_passwd_spec.rb +5 -5
  67. data/spec/resource/directory_spec.rb +17 -15
  68. data/spec/resource/file_spec.rb +17 -15
  69. data/spec/resource_spec.rb +1 -1
  70. data/spec/spec_helpers/test_coverage.rb +1 -1
  71. data/spec/util/file_owner_spec.rb +36 -0
  72. data/spec/util/file_permissions_spec.rb +6 -6
  73. data/spec/util/user_spec.rb +0 -17
  74. data/spec/util_spec.rb +64 -5
  75. metadata +91 -41
  76. data/spec/provider/package/apt/dpkg-query_-s_abcde.stdout +0 -23
  77. data/spec/provider/package/apt/dpkg-query_-s_htop.stdout +0 -19
  78. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.return +0 -1
  79. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stderr +0 -3
  80. data/spec/provider/package/apt/dpkg-query_-s_vlc.return +0 -1
  81. data/spec/provider/package/apt/dpkg-query_-s_vlc.stderr +0 -3
  82. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.return → dseditgroup_-o_create_-i_2_newgroup.return} +0 -0
  83. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stderr → dseditgroup_-o_create_-i_2_newgroup.stderr} +0 -0
  84. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stdout → dseditgroup_-o_create_-i_2_newgroup.stdout} +0 -0
  85. /data/spec/provider/package/apt/{dpkg-query_-s_abcde.return → apt-cache_policy_abcde.return} +0 -0
  86. /data/spec/provider/package/apt/{dpkg-query_-s_abcde.stderr → apt-cache_policy_abcde.stderr} +0 -0
  87. /data/spec/provider/package/apt/{dpkg-query_-s_htop.return → apt-cache_policy_htop.return} +0 -0
  88. /data/spec/provider/package/apt/{dpkg-query_-s_htop.stderr → apt-cache_policy_htop.stderr} +0 -0
  89. /data/spec/provider/package/apt/{dpkg-query_-s_not-a-real-package.stdout → apt-cache_policy_not-a-real-package.stderr} +0 -0
  90. /data/spec/provider/package/apt/{dpkg-query_-s_vlc.stdout → apt-cache_policy_not-a-real-package.stdout} +0 -0
@@ -11,26 +11,20 @@ module Wright
11
11
  #
12
12
  # @return [void]
13
13
  def create
14
- if uptodate?(:create)
15
- Wright.log.debug "user already created: '#{@resource.name}'"
16
- return
14
+ user = @resource.name
15
+ unless_uptodate(:create, "user already created: '#{user}'") do
16
+ create_user
17
17
  end
18
-
19
- create_user
20
- @updated = true
21
18
  end
22
19
 
23
20
  # Removes the user.
24
21
  #
25
22
  # @return [void]
26
23
  def remove
27
- if uptodate?(:remove)
28
- Wright.log.debug "user already removed: '#{@resource.name}'"
29
- return
24
+ user = @resource.name
25
+ unless_uptodate(:remove, "user already removed: '#{user}'") do
26
+ remove_user
30
27
  end
31
-
32
- remove_user
33
- @updated = true
34
28
  end
35
29
 
36
30
  private
@@ -1,3 +1,5 @@
1
+ require 'open3'
2
+
1
3
  require 'wright/config'
2
4
  require 'wright/dry_run'
3
5
  require 'wright/util/recursive_autoloader'
@@ -45,6 +47,22 @@ module Wright
45
47
  end
46
48
  end
47
49
 
50
+ # @api public
51
+ # Checks if the provider is up-to-date, runs a code block and sets
52
+ # `@updated` to `true` if it is not.
53
+ #
54
+ # @param action [String] the target action
55
+ # @param message [String] a log message that is displayed if the
56
+ # provider is up-to-date
57
+ def unless_uptodate(action, message)
58
+ if uptodate?(action)
59
+ Wright.log.debug message
60
+ else
61
+ yield
62
+ @updated = true
63
+ end
64
+ end
65
+
48
66
  # @api public
49
67
  # Runs a command or fails with an error message.
50
68
  #
@@ -54,10 +72,10 @@ module Wright
54
72
  # @param error_message [String] the error message to display in
55
73
  # case of an error
56
74
  # @raise [RuntimeError] if the command did not exit successfully
57
- # @return [void]
75
+ # @return [String] the stdout output of the command
58
76
  def exec_or_fail(command, args, error_message)
59
77
  stdout, stderr, status = Open3.capture3(env, command, *args)
60
- return if status.success?
78
+ return stdout if status.success?
61
79
 
62
80
  error = stderr.chomp
63
81
  error = stdout.chomp if error.empty?
@@ -1,5 +1,8 @@
1
+ require 'forwardable'
2
+
1
3
  require 'wright/resource'
2
4
  require 'wright/dsl'
5
+ require 'wright/util/file_owner'
3
6
 
4
7
  module Wright
5
8
  class Resource
@@ -9,38 +12,34 @@ module Wright
9
12
  # dir = Wright::Resource::Directory.new('/tmp/foobar')
10
13
  # dir.create
11
14
  class Directory < Wright::Resource
15
+ extend Forwardable
16
+
12
17
  # Initializes a Directory.
13
18
  #
14
19
  # @param name [String] the directory's name
15
20
  def initialize(name)
16
21
  super
17
22
  @mode = nil
18
- @owner = nil
19
- @group = nil
23
+ @owner = Wright::Util::FileOwner.new
20
24
  @action = :create
21
25
  end
22
26
 
23
- # @return [String, Integer] the directory's mode
27
+ # @return [String, Integer] the directory's intended mode
24
28
  attr_accessor :mode
25
29
 
26
- # @return [String] the directory's owner
27
- attr_reader :owner
28
-
29
- # Sets the directory's owner.
30
- def owner=(owner)
31
- target_owner, target_group =
32
- Wright::Util::User.owner_to_owner_group(owner)
33
- @owner = target_owner unless target_owner.nil?
34
- @group = target_group unless target_group.nil?
35
- end
36
-
37
- # @return [String] the directory's group
38
- attr_reader :group
30
+ # @!attribute owner
31
+ # @return [String, Integer] the directory's intended owner
32
+ # @!method owner=
33
+ # @see #owner
34
+ def_delegator :@owner, :user_and_group=, :owner=
35
+ def_delegator :@owner, :user, :owner
39
36
 
40
- # Sets the directory's group.
41
- def group=(group)
42
- @group = Wright::Util::User.group_to_gid(group)
43
- end
37
+ # @!attribute group
38
+ # @return [String, Integer] the directory's intended group
39
+ # @!method group=
40
+ # @see #group
41
+ def_delegator :@owner, :group
42
+ def_delegator :@owner, :group=
44
43
 
45
44
  # Creates or updates the directory.
46
45
  #
@@ -1,5 +1,8 @@
1
+ require 'forwardable'
2
+
1
3
  require 'wright/resource'
2
4
  require 'wright/dsl'
5
+ require 'wright/util/file_owner'
3
6
 
4
7
  module Wright
5
8
  class Resource
@@ -10,17 +13,27 @@ module Wright
10
13
  # file.content = 'bar'
11
14
  # file.create
12
15
  class File < Wright::Resource
16
+ extend Forwardable
17
+
13
18
  # @return [String] the file's intended content
14
19
  attr_accessor :content
15
20
 
16
- # @return [String] the file's intended group
17
- attr_accessor :group
18
-
19
21
  # @return [String, Integer] the file's intended mode
20
22
  attr_accessor :mode
21
23
 
22
- # @return [String] the file's intended owner
23
- attr_reader :owner
24
+ # @!attribute owner
25
+ # @return [String, Integer] the directory's intended owner
26
+ # @!method owner=
27
+ # @see #owner
28
+ def_delegator :@owner, :user_and_group=, :owner=
29
+ def_delegator :@owner, :user, :owner
30
+
31
+ # @!attribute group
32
+ # @return [String, Integer] the directory's intended group
33
+ # @!method group=
34
+ # @see #group
35
+ def_delegator :@owner, :group=
36
+ def_delegator :@owner, :group
24
37
 
25
38
  # Initializes a File.
26
39
  #
@@ -29,19 +42,10 @@ module Wright
29
42
  super
30
43
  @content = nil
31
44
  @mode = nil
32
- @owner = nil
33
- @group = nil
45
+ @owner = Wright::Util::FileOwner.new
34
46
  @action = :create
35
47
  end
36
48
 
37
- # Sets the file's owner.
38
- def owner=(owner)
39
- target_owner, target_group =
40
- Wright::Util::User.owner_to_owner_group(owner)
41
- @owner = target_owner unless target_owner.nil?
42
- @group = target_group unless target_group.nil?
43
- end
44
-
45
49
  # Creates or updates the file.
46
50
  #
47
51
  # @return [Bool] true if the file was updated and false
@@ -27,6 +27,7 @@ module Wright
27
27
  # @return [Bool] true if the symlink was updated and false
28
28
  # otherwise
29
29
  def create
30
+ fail ArgumentError, 'Symlink target undefined' unless @to
30
31
  might_update_resource do
31
32
  @provider.create
32
33
  end
@@ -69,7 +69,8 @@ end
69
69
  Wright::DSL.register_resource(Wright::Resource::User)
70
70
 
71
71
  user_providers = {
72
- 'debian' => 'Wright::Provider::User::GnuPasswd'
72
+ 'debian' => 'Wright::Provider::User::GnuPasswd',
73
+ 'macosx' => 'Wright::Provider::User::DarwinDirectoryService'
73
74
  }
74
75
  Wright::Config[:resources][:user] ||= {}
75
76
  Wright::Config[:resources][:user][:provider] ||=
@@ -125,7 +125,7 @@ module Wright
125
125
 
126
126
  if Wright.dry_run?
127
127
  resource = "#{@resource_name} '#{@name}'"
128
- Wright.log.info "Would trigger update action for #{resource}"
128
+ Wright.log.info "(would) run update action for #{resource}"
129
129
  else
130
130
  @on_update.call
131
131
  end
@@ -0,0 +1,61 @@
1
+ module Wright
2
+ module Util
3
+ # Helper class to support +user:group+ notation in file owner
4
+ # strings.
5
+ class FileOwner
6
+ # @return [String, Integer] the user's name or uid
7
+ attr_accessor :user
8
+
9
+ # @return [String, Integer] the group's name or gid
10
+ attr_accessor :group
11
+
12
+ # Sets user and group simultaneously.
13
+ #
14
+ # @param [String, Integer] user_and_group a user in +user:group+
15
+ # notation or a uid
16
+ #
17
+ # @example
18
+ # owner = FileOwner.new
19
+ #
20
+ # owner.user_and_group = 'user:group'
21
+ # owner.user
22
+ # # => "user"
23
+ # owner.group
24
+ # # => "group"
25
+ #
26
+ # owner.user_and_group = 'newuser'
27
+ # owner.user
28
+ # # => "newuser"
29
+ # owner.group
30
+ # # => "group"
31
+ #
32
+ # owner.user_and_group = 42
33
+ # owner.user
34
+ # # => 42
35
+ #
36
+ # @return [void]
37
+ # @raise [ArgumentError] if the owner string contains more than
38
+ # one colon
39
+ def user_and_group=(user_and_group)
40
+ user, group = split_user_and_group(user_and_group)
41
+ @user = user
42
+ @group = group if group
43
+ end
44
+
45
+ private
46
+
47
+ def split_user_and_group(user_and_group)
48
+ user = user_and_group
49
+ group = nil
50
+ return [user, group] unless user_and_group.is_a?(String)
51
+
52
+ if user_and_group.count(':') > 1
53
+ fail ArgumentError, "Invalid owner: '#{user_and_group}'"
54
+ end
55
+
56
+ user, group = user_and_group.split(':')
57
+ [user, group]
58
+ end
59
+ end
60
+ end
61
+ end
@@ -14,26 +14,27 @@ module Wright
14
14
  #
15
15
  # @return [Wright::Util::FilePermissions] the FilePermissions
16
16
  # object
17
+ # @raise [ArgumentError] if the user or group are invalid
17
18
  def self.create_from_resource(resource, filetype)
18
19
  filepath = ::File.expand_path(resource.name)
19
20
  p = Wright::Util::FilePermissions.new(filepath, filetype)
20
- p.owner = resource.owner
21
- p.group = resource.group
21
+ p.uid = Wright::Util::User.user_to_uid(resource.owner)
22
+ p.gid = Wright::Util::User.group_to_gid(resource.group)
22
23
  p.mode = resource.mode
23
24
  p
24
25
  end
25
26
 
26
- # @return [String] the target file's name
27
+ # @return [String] the filename
27
28
  attr_accessor :filename
28
29
 
29
- # @return [Integer] the file's target group id
30
- attr_reader :group
30
+ # @return [Integer] the file's intended uid
31
+ attr_accessor :uid
31
32
 
32
- # @return [Integer] the file's target mode
33
- attr_reader :mode
33
+ # @return [Integer] the file's intended gid
34
+ attr_accessor :gid
34
35
 
35
- # @return [Integer] the file's target owner uid
36
- attr_reader :owner
36
+ # @return [Integer] the file's intended mode
37
+ attr_reader :mode
37
38
 
38
39
  VALID_FILETYPES = [:file, :directory]
39
40
  private_constant :VALID_FILETYPES
@@ -50,17 +51,7 @@ module Wright
50
51
  @filetype = filetype
51
52
  end
52
53
 
53
- # Sets the file's owner
54
- def owner=(owner)
55
- @owner = Util::User.user_to_uid(owner)
56
- end
57
-
58
- # Sets the file's group
59
- def group=(group)
60
- @group = Util::User.group_to_gid(group)
61
- end
62
-
63
- # Sets the file's mode
54
+ # @return [Integer] the file's target mode
64
55
  def mode=(mode)
65
56
  if mode.nil?
66
57
  @mode = nil
@@ -75,23 +66,23 @@ module Wright
75
66
  @mode = mode_i
76
67
  end
77
68
 
78
- # Checks if the file's owner, group and mode are up-to-date
69
+ # Checks if the file's uid, gid and mode are up-to-date
79
70
  # @return [Bool] +true+ if the file is up to date, +false+
80
71
  # otherwise
81
72
  def uptodate?
82
73
  if ::File.exist?(@filename)
83
- owner_uptodate? && group_uptodate? && mode_uptodate?
74
+ uid_uptodate? && gid_uptodate? && mode_uptodate?
84
75
  else
85
76
  false
86
77
  end
87
78
  end
88
79
 
89
- # Updates the file's owner, group and mode.
80
+ # Updates the file's uid, gid and mode.
90
81
  #
91
82
  # @return [void]
92
83
  def update
93
84
  ::File.chmod(@mode, @filename) if @mode
94
- ::File.chown(@owner, @group, @filename) if @owner || @group
85
+ ::File.chown(@uid, @gid, @filename) if @uid || @gid
95
86
  end
96
87
 
97
88
  # @return [Integer] the file's current mode
@@ -100,23 +91,23 @@ module Wright
100
91
  end
101
92
 
102
93
  # @return [Integer] the file's current owner's uid
103
- def current_owner
94
+ def current_uid
104
95
  Wright::Util::File.file_owner(@filename)
105
96
  end
106
97
 
107
98
  # @return [Integer] the file's current group's gid
108
- def current_group
99
+ def current_gid
109
100
  Wright::Util::File.file_group(@filename)
110
101
  end
111
102
 
112
103
  private
113
104
 
114
- def owner_uptodate?
115
- @owner.nil? || current_owner == @owner
105
+ def uid_uptodate?
106
+ @uid.nil? || current_uid == @uid
116
107
  end
117
108
 
118
- def group_uptodate?
119
- @group.nil? || current_group == @group
109
+ def gid_uptodate?
110
+ @gid.nil? || current_gid == @gid
120
111
  end
121
112
 
122
113
  def mode_uptodate?
@@ -85,7 +85,7 @@ module Wright
85
85
  # @return [String] the camelized string
86
86
  def self.camelize(s)
87
87
  s.to_s
88
- .gsub(/\/(.?)/) { "::#{Regexp.last_match[1].upcase}" }
88
+ .gsub(%r{/(.?)}) { "::#{Regexp.last_match[1].upcase}" }
89
89
  .gsub(/(?:^|_)(.)/) { Regexp.last_match[1].upcase }
90
90
  end
91
91
 
@@ -18,8 +18,7 @@ module Wright
18
18
  # @return [Integer] the integer uid of the given user or nil if
19
19
  # user was nil
20
20
  def self.user_to_uid(user)
21
- return nil if user.nil?
22
- user.is_a?(String) ? Etc.getpwnam(user).uid : user.to_i
21
+ to_id(user, :user)
23
22
  end
24
23
 
25
24
  # Returns a group's gid.
@@ -36,37 +35,63 @@ module Wright
36
35
  # @return [Integer] the integer gid of the given group or nil if
37
36
  # group was nil
38
37
  def self.group_to_gid(group)
39
- return nil if group.nil?
40
- group.is_a?(String) ? Etc.getgrnam(group).gid : group.to_i
38
+ to_id(group, :group)
41
39
  end
42
40
 
43
- # Splits a colon-separated owner string into owner and group.
41
+ def self.to_id(object, type)
42
+ fail ArgumentError unless [:group, :user].include?(type)
43
+ return nil if object.nil?
44
+ return object.to_i unless object.is_a?(String)
45
+ type == :user ? Etc.getpwnam(object).uid : Etc.getgrnam(object).gid
46
+ end
47
+ private_class_method :to_id
48
+
49
+ # Returns the the next free uid in a range.
44
50
  #
45
- # @param owner [String] the owner string
51
+ # @param uid_range [Range] the uid range
46
52
  #
47
53
  # @example
48
- # Wright::Util::User.owner_to_owner_group('foo:bar')
49
- # # => ["foo", "bar"]
54
+ # Wright::Util::User.next_free_uid(1...500)
55
+ # # => 2
50
56
  #
51
- # Wright::Util::User.owner_to_owner_group('foo')
52
- # # => ["foo", nil]
57
+ # @return [Integer] the next free uid
58
+ # @raise [RuntimeError] if there are no free uids in the range
59
+ def self.next_free_uid(uid_range)
60
+ next_free_id(uid_range, :uid)
61
+ end
62
+
63
+ # Returns the the next free gid in a range.
53
64
  #
54
- # Wright::Util::User.owner_to_owner_group(23)
55
- # # => [23, nil]
65
+ # @param gid_range [Range] the gid range
56
66
  #
57
- # @return [Array<(String, String)>] the owner and group. Returns
58
- # nil if no group was specified. Non-string owners are
59
- # returned unmodified.
60
- # @raise [ArgumentError] if the owner string contains more than
61
- # one colon
62
- def self.owner_to_owner_group(owner)
63
- group = nil
64
- return [owner, group] unless owner.is_a?(String)
67
+ # @example
68
+ # Wright::Util::User.next_free_gid(1...500)
69
+ # # => 11
70
+ #
71
+ # @return [Integer] the next free gid
72
+ # @raise [RuntimeError] if there are no free gids in the range
73
+ def self.next_free_gid(gid_range)
74
+ next_free_id(gid_range, :gid)
75
+ end
76
+
77
+ def self.next_free_id(id_range, id_type)
78
+ iterator = id_iterator(id_type)
79
+ used_ids = []
80
+ iterator.call do |o|
81
+ id = o.method(id_type).call
82
+ used_ids << id if id_range.include?(id)
83
+ end
84
+ free_ids = id_range.to_a - used_ids
85
+ fail "No free #{id_type} in range #{id_range}" if free_ids.empty?
86
+ free_ids.min
87
+ end
88
+ private_class_method(:next_free_id)
65
89
 
66
- fail ArgumentError, "Invalid owner: '#{owner}'" if owner.count(':') > 1
67
- owner, group = owner.split(':')
68
- [owner, group]
90
+ def self.id_iterator(id_type)
91
+ fail ArgumentError unless [:uid, :gid].include?(id_type)
92
+ id_type == :uid ? Etc.method(:passwd) : Etc.method(:group)
69
93
  end
94
+ private_class_method :id_iterator
70
95
  end
71
96
  end
72
97
  end
data/lib/wright/util.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'wright/util/stolen_from_activesupport'
2
- require 'open3'
3
2
 
4
3
  module Wright
5
4
  # @api private
@@ -43,9 +42,10 @@ module Wright
43
42
  return default unless ::File.exist?(release_file)
44
43
 
45
44
  os_release = ::File.read(release_file)
46
- /^ID_LIKE=(?<id_like>.*)$/ =~ os_release
47
- /^ID=(?<id>.*)$/ =~ os_release
48
- id_like || id || default
45
+ /^ID_LIKE="?(?<id_like>[^"]*)"?$/ =~ os_release
46
+ /^ID="?(?<id>[^"]*)"?$/ =~ os_release
47
+ return id_like.split(' ').first if id_like
48
+ id || default
49
49
  end
50
50
  private_class_method :distro
51
51
 
@@ -72,7 +72,12 @@ module Wright
72
72
  end
73
73
  end
74
74
 
75
- # :nocov:
75
+ # Runs a code block in a clean bundler environment.
76
+ #
77
+ # @example
78
+ # Wright::Util.bundler_clean_env { `brew search /^git$/` }
79
+ # # => "git\n"
80
+ # @return [Object] the return value of the code block
76
81
  def self.bundler_clean_env
77
82
  if defined?(Bundler)
78
83
  Bundler.with_clean_env { yield }
@@ -80,6 +85,5 @@ module Wright
80
85
  yield
81
86
  end
82
87
  end
83
- # :nocov:
84
88
  end
85
89
  end
@@ -1,4 +1,4 @@
1
1
  module Wright # rubocop:disable Documentation
2
2
  # Current wright version
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'
4
4
  end
data/lib/wright.rb CHANGED
@@ -2,6 +2,7 @@ require 'wright/config'
2
2
  require 'wright/dsl'
3
3
  require 'wright/provider'
4
4
  require 'wright/resource'
5
+ require 'wright/version'
5
6
 
6
7
  require 'wright/resource/directory'
7
8
  require 'wright/resource/file'