sugar_utils 0.4.0 → 0.4.1
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 +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/sugar_utils/file.rb +54 -5
- data/lib/sugar_utils/version.rb +1 -1
- data/spec/spec_helper.rb +22 -1
- data/spec/sugar_utils/file_spec.rb +26 -16
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e0e229f79ac2862d3410a0af00c9193c63e95bc
|
4
|
+
data.tar.gz: db296249a7db975a57b0931ae02bd2f5f3e7339c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12f986da3764bc8c2ef501a0f93eed04309f0a8d1063de8595a82af448e2d02fbe7ba89ebbcbd0e970a5e51af232e77366d3dc9827d8c260693dbf6a1599a2de
|
7
|
+
data.tar.gz: 24f18068100970ee7eff0fcf0d63d1aa8ab50dbf130e0f608d3367ca52f7a896a7d7a45e5b5f129ee6af712783eaac4d96c792eefb96715e949a7f96422f3ff3
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
+
## [0.4.1] - 2017-05-17
|
6
|
+
### Added
|
7
|
+
- options :owner, :group, :mode to SugarUtils::File.write and .touch
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
- marked the :perm option as deprecated by :mode
|
11
|
+
|
5
12
|
## [0.4.0] - 2017-05-17
|
6
13
|
### Added
|
7
14
|
- SugarUtils::File.touch, which will ensure the directory before touching the
|
data/lib/sugar_utils/file.rb
CHANGED
@@ -74,11 +74,24 @@ module SugarUtils
|
|
74
74
|
end
|
75
75
|
|
76
76
|
# @param [String] filename
|
77
|
+
# @param [Hash] options
|
78
|
+
# @option options [String, Integer] :owner
|
79
|
+
# @option options [String, Integer] :group
|
80
|
+
# @option options [Integer] :mode
|
81
|
+
# @option options [Integer] :perm @deprecated
|
77
82
|
#
|
78
83
|
# @return [void]
|
79
|
-
def self.touch(filename)
|
84
|
+
def self.touch(filename, options = {})
|
85
|
+
owner = options[:owner]
|
86
|
+
group = options[:group]
|
87
|
+
mode = options[:mode] || options[:perm]
|
88
|
+
|
89
|
+
deprecate_option(:touch, :perm, :mode, 2017, 8) if options.has_key?(:perm)
|
90
|
+
|
80
91
|
FileUtils.mkdir_p(::File.dirname(filename))
|
81
92
|
FileUtils.touch(filename)
|
93
|
+
FileUtils.chown(owner, group, filename)
|
94
|
+
FileUtils.chmod(mode, filename) if mode
|
82
95
|
end
|
83
96
|
|
84
97
|
# @param [String] filename
|
@@ -86,17 +99,24 @@ module SugarUtils
|
|
86
99
|
# @param [Hash] options
|
87
100
|
# @option options [Integer] :timeout (10)
|
88
101
|
# @option options [Boolean] :flush (false)
|
89
|
-
# @option options [Integer] :
|
102
|
+
# @option options [String, Integer] :owner
|
103
|
+
# @option options [String, Integer] :group
|
104
|
+
# @option options [Integer] :mode (0o666)
|
105
|
+
# @option options [Integer] :perm (0o666) @deprecated
|
90
106
|
#
|
91
107
|
# @raise [SugarUtils::File::Error]
|
92
108
|
#
|
93
109
|
# @return [void]
|
94
110
|
def self.write(filename, data, options = {})
|
95
|
-
perm = options[:perm] || 0o666
|
96
111
|
flush = options[:flush] || false
|
112
|
+
owner = options[:owner]
|
113
|
+
group = options[:group]
|
114
|
+
mode = options[:mode] || options[:perm] || 0o666
|
115
|
+
|
116
|
+
deprecate_option(:touch, :perm, :mode, 2017, 8) if options.has_key?(:perm)
|
97
117
|
|
98
118
|
FileUtils.mkdir_p(::File.dirname(filename))
|
99
|
-
::File.open(filename, ::File::RDWR | ::File::CREAT,
|
119
|
+
::File.open(filename, ::File::RDWR | ::File::CREAT, mode) do |file|
|
100
120
|
flock_exclusive(file, options)
|
101
121
|
|
102
122
|
file.truncate(0) # Ensure file is empty before proceeding.
|
@@ -112,8 +132,9 @@ module SugarUtils
|
|
112
132
|
end
|
113
133
|
|
114
134
|
# Ensure that the permissions are correct if the file already existed.
|
115
|
-
file.chmod(
|
135
|
+
file.chmod(mode)
|
116
136
|
end
|
137
|
+
FileUtils.chown(owner, group, filename)
|
117
138
|
rescue Timeout::Error
|
118
139
|
raise(Error, "Unable to write #{filename} because it is locked")
|
119
140
|
rescue SystemCallError, IOError => boom
|
@@ -133,5 +154,33 @@ module SugarUtils
|
|
133
154
|
def self.write_json(filename, data, options = {})
|
134
155
|
write(filename, MultiJson.dump(data, pretty: true), options)
|
135
156
|
end
|
157
|
+
|
158
|
+
############################################################################
|
159
|
+
|
160
|
+
# Following the same pattern as the existing stdlib method deprecation
|
161
|
+
# module.
|
162
|
+
# @see http://ruby-doc.org/stdlib-2.0.0/libdoc/rubygems/rdoc/Gem/Deprecate.html
|
163
|
+
def self.deprecate_option(_method, option_name, option_repl, year, month)
|
164
|
+
return if Gem::Deprecate.skip
|
165
|
+
|
166
|
+
klass = self.is_a?(Module)
|
167
|
+
target = klass ? "#{self}." : "#{self.class}#"
|
168
|
+
|
169
|
+
# Determine the method
|
170
|
+
method = caller_locations(1,1).first.label
|
171
|
+
|
172
|
+
# Determine the caller
|
173
|
+
external_caller = caller_locations(2,1).first
|
174
|
+
location_of_external_caller = "#{external_caller.absolute_path}:#{external_caller.lineno}"
|
175
|
+
|
176
|
+
msg = [
|
177
|
+
"NOTE: #{target}#{method} option :#{option_name} is deprecated",
|
178
|
+
option_repl == :none ? ' with no replacement' : "; use :#{option_repl} instead",
|
179
|
+
". It will be removed on or after %4d-%02d-01." % [year, month],
|
180
|
+
"\n#{target}#{method} called from #{location_of_external_caller}"
|
181
|
+
]
|
182
|
+
warn("#{msg.join}.")
|
183
|
+
end
|
184
|
+
private_class_method :deprecate_option
|
136
185
|
end
|
137
186
|
end
|
data/lib/sugar_utils/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
4
4
|
require 'sugar_utils'
|
5
5
|
require 'rspec/tabular'
|
6
6
|
require 'fakefs/spec_helpers'
|
7
|
+
require 'etc'
|
7
8
|
# HACK: including pp seems to resolve an error with FakeFS and File.read
|
8
9
|
# This seems to be related to but not the same as the problem mentioned in the
|
9
10
|
# README
|
@@ -46,8 +47,28 @@ RSpec::Matchers.define :have_file_permission do |expected|
|
|
46
47
|
match do |actual|
|
47
48
|
next false unless File.exist?(actual)
|
48
49
|
|
49
|
-
@actual = format('%o', File.stat(
|
50
|
+
@actual = format('%o', File.stat(actual).mode)
|
50
51
|
@expected = format('%o', expected)
|
51
52
|
values_match?(@expected, @actual)
|
52
53
|
end
|
53
54
|
end
|
55
|
+
|
56
|
+
RSpec::Matchers.define :have_owner do |expected|
|
57
|
+
match do |actual|
|
58
|
+
next false unless File.exist?(actual)
|
59
|
+
|
60
|
+
@actual = Etc.getpwuid(File.stat(filename).uid).name
|
61
|
+
@expected = expected
|
62
|
+
values_match?(@expected, @actual)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
RSpec::Matchers.define :have_group do |expected|
|
67
|
+
match do |actual|
|
68
|
+
next false unless File.exist?(actual)
|
69
|
+
|
70
|
+
@actual = Etc.getgrgid(File.stat(actual).gid).name
|
71
|
+
@expected = expected
|
72
|
+
values_match?(@expected, @actual)
|
73
|
+
end
|
74
|
+
end
|
@@ -98,23 +98,22 @@ describe SugarUtils::File do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
describe '.touch', :fakefs do
|
101
|
-
subject { described_class.touch(filename) }
|
101
|
+
subject { described_class.touch(filename, *options) }
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
context 'without path' do
|
106
|
-
let(:filename) { 'filename' }
|
107
|
-
it { expect(File.exist?(filename)).to eq(true) }
|
108
|
-
end
|
103
|
+
let(:filename) { 'path1/path2/filename' }
|
109
104
|
|
110
|
-
|
111
|
-
let(:filename) { 'path1/path2/filename' }
|
112
|
-
it { expect(File.exist?(filename)).to eq(true) }
|
113
|
-
end
|
105
|
+
before { subject }
|
114
106
|
|
115
|
-
|
116
|
-
|
117
|
-
|
107
|
+
inputs :options
|
108
|
+
specify_with([]) { expect(File.exist?(filename)).to eq(true) }
|
109
|
+
specify_with([{ owner: 'nobody' }]) { expect(filename).to have_owner('nobody') }
|
110
|
+
specify_with([{ group: 'nogroup' }]) { expect(filename).to have_group('nogroup') }
|
111
|
+
specify_with([{ mode: 0o600 }]) { expect(filename).to have_file_permission(0o100600) }
|
112
|
+
specify_with([{ perm: 0o600 }]) { expect(filename).to have_file_permission(0o100600) }
|
113
|
+
specify_with([{ owner: 'nobody', group: 'nogroup', mode: 0o600 }]) do
|
114
|
+
expect(filename).to have_owner('nobody')
|
115
|
+
expect(filename).to have_group('nogroup')
|
116
|
+
expect(filename).to have_file_permission(0o100600)
|
118
117
|
end
|
119
118
|
end
|
120
119
|
|
@@ -161,14 +160,25 @@ describe SugarUtils::File do
|
|
161
160
|
specify { expect(filename).to have_file_permission(0o100666) }
|
162
161
|
end
|
163
162
|
|
164
|
-
context 'options' do
|
165
|
-
let(:options) { {
|
163
|
+
context 'with deprecated options' do
|
164
|
+
let(:options) { { perm: 0o600 } }
|
165
|
+
before { subject }
|
166
|
+
specify { expect(filename).to have_content(data) }
|
167
|
+
specify { expect(filename).to have_file_permission(0o100600) }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'with deprecated options' do
|
171
|
+
let(:options) do
|
172
|
+
{ flush: true, owner: 'nobody', group: 'nogroup', mode: 0o600 }
|
173
|
+
end
|
166
174
|
before do
|
167
175
|
expect_any_instance_of(File).to receive(:flush)
|
168
176
|
expect_any_instance_of(File).to receive(:fsync)
|
169
177
|
subject
|
170
178
|
end
|
171
179
|
specify { expect(filename).to have_content(data) }
|
180
|
+
specify { expect(filename).to have_owner('nobody') }
|
181
|
+
specify { expect(filename).to have_group('nogroup') }
|
172
182
|
specify { expect(filename).to have_file_permission(0o100600) }
|
173
183
|
end
|
174
184
|
end
|