state_mate 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5aba1e0cd11231bc25d168f117aab8cf89056f3b
4
- data.tar.gz: 3c1bb3640ca889f7a5b19ed4530b2093dec734d5
3
+ metadata.gz: 4c226a8faea22d2b1e92ba9ec2b6a7e4bd05567d
4
+ data.tar.gz: 5a3aa7df4eaa5174c2da39cda349871f87d45d57
5
5
  SHA512:
6
- metadata.gz: e4c92a705ec2c6e6c62a887d0b0023ea69cdff660d01fde5ffbbcae8eaed2fc88d878b3f21686437ff07814beb5b99564a2dbcb74fe289920c93d31e3dceef90
7
- data.tar.gz: 2bf7d8f08317ca320acc21296791e8b3f92d165faf9c0161354c7cec8c9576d8896bf4eba7d6ff0c28af32f7ced6e1d180acd6906b0e07bc557e9f0763493b73
6
+ metadata.gz: 9a5cd92203f92b5fecb9aaf63198c16d64936e151bbc5f7b050161121e6a6f7700045b9cb62cbe39deac7ceb1021e3852721829a459ba66c5f6c02409dffcac8
7
+ data.tar.gz: 9ba7d11e17927dd298e769d29692ee9257299fdde999b849549c1e7f739672cd9f8235fc3361a0decbeae6aa4f7440d7d49605c2068f9b1984c8f4217d3f3d02
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "state_mate"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -8,37 +8,33 @@ module StateMate::Adapters; end
8
8
 
9
9
  module StateMate::Adapters::NVRAM
10
10
  def self.read key, options = {}
11
- cmd = NRSER::Exec.sub "nvram %{key}", key: key
11
+ result = Cmds "nvram %{key}", key: key
12
12
 
13
- begin
14
- output = NRSER::Exec.run cmd
15
- rescue SystemCallError => e
16
- if e.message.include? "nvram: Error getting variable"
13
+ if result.error?
14
+ if result.err.start_with? "nvram: Error getting variable"
17
15
  return nil
18
- else
19
- raise e
20
16
  end
17
+ result.assert
21
18
  end
22
19
 
23
- if m = /^#{ key }\t(.*)\n$/.match(output)
20
+ if m = /^#{ key }\t(.*)\n$/.match(result.out)
24
21
  m[1]
25
22
  else
26
- raise tpl binding, <<-BLOCK
23
+ raise binding.erb <<-BLOCK
27
24
  can't parse output for key <%= key.inspect %>:
28
25
 
29
- cmd: <%= cmd.inspect %>
26
+ cmd: <%= result.cmd %>
30
27
 
31
- output: <%= output.inspect %>
28
+ output: <%= result.out.inspect %>
32
29
  BLOCK
33
30
  end
34
31
  end
35
32
 
36
33
  def self.write key, value, options = {}
37
- unless value.is_a? String
34
+ unless value.is_a? String
38
35
  raise "value must be a String, not #{ value.inspect }"
39
36
  end
40
37
 
41
- cmd = "nvram #{ key }='#{ value }'"
42
- NRSER::Exec.run cmd
38
+ Cmds! "sudo nvram #{ key }='#{ value }'"
43
39
  end
44
- end # NVRAM
40
+ end # NVRAM
@@ -0,0 +1,59 @@
1
+ require 'cmds'
2
+
3
+ module StateMate; end
4
+ module StateMate::Adapters; end
5
+
6
+ # adapter to set global git config options
7
+ module StateMate::Adapters::SCUtil
8
+
9
+ # @api adapter
10
+ #
11
+ # adapter API call that reads a value from scutil.
12
+ #
13
+ # @param key [String] the key to read. from `man scutil`:
14
+ #
15
+ # Supported preferences include:
16
+ #
17
+ # ComputerName The user-friendly name for the system.
18
+ #
19
+ # LocalHostName The local (Bonjour) host name.
20
+ #
21
+ # HostName The name associated with hostname(1) and gethostname(3).
22
+ #
23
+ # @param options [Hash] unused options to conform to adapter API
24
+ #
25
+ # @return [String, nil] the scutil value, or `nil` if not set.
26
+ #
27
+ # @raise [SystemCallError] if the command failed.
28
+ #
29
+ def self.read key, options = {}
30
+ result = Cmds "scutil --get %{key}", key: key
31
+ if result.ok?
32
+ result.out.chomp
33
+ else
34
+ if result.err.match /^#{ key }\:\ not set/
35
+ nil
36
+ else
37
+ result.assert
38
+ end
39
+ end
40
+ end # ::read
41
+
42
+
43
+ # @api adapter
44
+ #
45
+ # adapter API call that writes a value to the git global config.
46
+ #
47
+ # @param key [String] the key to write
48
+ # @param value [String] the value to write
49
+ # @param options [Hash] unused options to conform to adapter API
50
+ #
51
+ # @return nil
52
+ #
53
+ def self.write key, value, options = {}
54
+ Cmds! "sudo scutil --set %{key} %{value}",
55
+ key: key,
56
+ value: value
57
+ nil
58
+ end # ::write
59
+ end # SCUtil
@@ -1,3 +1,3 @@
1
1
  module StateMate
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/state_mate.rb CHANGED
@@ -81,17 +81,51 @@ module StateMate
81
81
 
82
82
  key = nil
83
83
  directives = []
84
- options = {}
85
-
84
+ type_name = nil
85
+ options = state['options'] || {}
86
+
87
+ unless options.is_a? Hash
88
+ raise TypeError.new binding.erb <<-END
89
+ options must be a hash, found <%= options.class %>:
90
+
91
+ <%= options.inspect %>
92
+
93
+ state:
94
+
95
+ <%= state.inspect %>
96
+
97
+ END
98
+ end
99
+
86
100
  state.each do |k, v|
87
101
  if k == 'key'
88
102
  key = v
89
103
  elsif k == 'options'
90
- options = v
104
+ # pass, dealt with above
91
105
  elsif DIRECTIVES.include? k
92
106
  directives << [k, v]
107
+ elsif k == 'type'
108
+ type_name = v
93
109
  else
94
- raise "bad key #{ k.inspect } in state #{ state.inspect }"
110
+ # any other keys are set as options
111
+ # this is a little convience feature that avoids having to
112
+ # nest inside an `options` key unless your option conflicts
113
+ # with 'key' or a directive.
114
+ #
115
+ # check for conflicts
116
+ if options.key? k
117
+ raise ArgumentError.new binding.erb <<-END
118
+ top-level state key #{ k.inspect } was also provided in the
119
+ options.
120
+
121
+ state:
122
+
123
+ <%= state.inspect %>
124
+
125
+ END
126
+ end
127
+
128
+ options[k] = v
95
129
  end
96
130
  end
97
131
 
@@ -103,6 +137,10 @@ module StateMate
103
137
  else
104
138
  raise "multiple directives found in #{ state.inspect }"
105
139
  end
140
+
141
+ unless type_name.nil?
142
+ value = StateMate.cast type_name, value
143
+ end
106
144
 
107
145
  state_set.add adapter, key, directive, value, options
108
146
  end # state.each
@@ -246,6 +284,36 @@ module StateMate
246
284
  end
247
285
  end # rollback
248
286
  end # StateSet
287
+
288
+ # @api util
289
+ # *pure*
290
+ #
291
+ # casts a value to a type, or raises an error if not possible.
292
+ # this is useful because ansible in particular likes to pass things
293
+ # as strings.
294
+ #
295
+ # @param type_name [String] the 'name' of the type to cast to.
296
+
297
+ def self.cast type_name, value
298
+ case type_name
299
+ when 'string', 'str'
300
+ value.to_s
301
+ when 'integer', 'int'
302
+ value.to_i
303
+ when 'float'
304
+ value.to_f
305
+ when 'boolean', 'bool'
306
+ if value.to_s.downcase == 'true'
307
+ true
308
+ elsif value.to_s.downcase == 'false'
309
+ false
310
+ else
311
+ raise ArgumentError.new "can't cast to boolean: #{ value.inspect }"
312
+ end
313
+ else
314
+ raise ArgumentError.new "bad type name: #{ type_name.inspect }"
315
+ end
316
+ end
249
317
 
250
318
  def self.get_adapter adapter_name
251
319
  begin
data/state_mate.gemspec CHANGED
@@ -9,12 +9,16 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["nrser"]
10
10
  spec.email = ["neil@ztkae.com"]
11
11
  spec.summary = %q{i heard it's meant to help you with your state, mate!}
12
+ spec.description = <<-END
13
+ helps manage state on OSX by wrapping system commands like `defaults`, `nvram`,
14
+ `lanuchctl`, `scutil` and more.
15
+ END
12
16
  spec.homepage = "https://github.com/nrser/state_mate"
13
17
  spec.license = "MIT"
14
18
 
15
- spec.files = `git ls-files -z`.split("\x0")
16
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
22
  spec.require_paths = ["lib"]
19
23
 
20
24
  spec.add_development_dependency "bundler", "~> 1.5"
@@ -22,8 +26,8 @@ Gem::Specification.new do |spec|
22
26
  spec.add_development_dependency "rspec"
23
27
  spec.add_development_dependency "yard"
24
28
  spec.add_development_dependency "redcarpet"
25
-
26
- spec.add_dependency 'nrser', '>= 0.0.13'
29
+
30
+ spec.add_dependency 'nrser', '~> 0.0', '>= 0.0.13'
27
31
  spec.add_dependency 'CFPropertyList', '~> 2.3'
28
- spec.add_dependency 'cmds', '>= 0.0.7'
32
+ spec.add_dependency 'cmds', '~> 0.0', '>= 0.0.9'
29
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_mate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - nrser
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2015-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,6 +84,9 @@ dependencies:
84
84
  name: nrser
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.0'
87
90
  - - ">="
88
91
  - !ruby/object:Gem::Version
89
92
  version: 0.0.13
@@ -91,6 +94,9 @@ dependencies:
91
94
  prerelease: false
92
95
  version_requirements: !ruby/object:Gem::Requirement
93
96
  requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.0'
94
100
  - - ">="
95
101
  - !ruby/object:Gem::Version
96
102
  version: 0.0.13
@@ -112,17 +118,25 @@ dependencies:
112
118
  name: cmds
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.0'
115
124
  - - ">="
116
125
  - !ruby/object:Gem::Version
117
- version: 0.0.7
126
+ version: 0.0.9
118
127
  type: :runtime
119
128
  prerelease: false
120
129
  version_requirements: !ruby/object:Gem::Requirement
121
130
  requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0.0'
122
134
  - - ">="
123
135
  - !ruby/object:Gem::Version
124
- version: 0.0.7
125
- description:
136
+ version: 0.0.9
137
+ description: |
138
+ helps manage state on OSX by wrapping system commands like `defaults`, `nvram`,
139
+ `lanuchctl`, `scutil` and more.
126
140
  email:
127
141
  - neil@ztkae.com
128
142
  executables: []
@@ -137,36 +151,18 @@ files:
137
151
  - README.md
138
152
  - Rakefile
139
153
  - ansible/library/state
154
+ - bin/console
140
155
  - lib/state_mate.rb
141
156
  - lib/state_mate/adapters/defaults.rb
142
157
  - lib/state_mate/adapters/git_config.rb
143
158
  - lib/state_mate/adapters/json.rb
144
159
  - lib/state_mate/adapters/launchd.rb
145
160
  - lib/state_mate/adapters/nvram.rb
161
+ - lib/state_mate/adapters/scutil.rb
146
162
  - lib/state_mate/adapters/time_machine.rb
147
163
  - lib/state_mate/version.rb
148
164
  - notes/state-set-steps.md
149
- - spec/spec_helper.rb
150
- - spec/state_mate/adapters/defaults/hardware_uuid_spec.rb
151
- - spec/state_mate/adapters/defaults/hash_deep_write_spec.rb
152
- - spec/state_mate/adapters/defaults/read_defaults_spec.rb
153
- - spec/state_mate/adapters/defaults/read_spec.rb
154
- - spec/state_mate/adapters/defaults/read_type_spec.rb
155
- - spec/state_mate/adapters/defaults/write_spec.rb
156
- - spec/state_mate/adapters/git_config/read_spec.rb
157
- - spec/state_mate/adapters/git_config/write_spec.rb
158
- - spec/state_mate/adapters/json/read_spec.rb
159
- - spec/state_mate/adapters/json/write_spec.rb
160
- - spec/state_mate/execute_spec.rb
161
- - spec/state_mate_spec.rb
162
165
  - state_mate.gemspec
163
- - test/ansible/ansible.cfg
164
- - test/ansible/clear
165
- - test/ansible/hosts
166
- - test/ansible/play
167
- - test/ansible/playbook.yml
168
- - test/ansible/read
169
- - test/bin/install.rb
170
166
  homepage: https://github.com/nrser/state_mate
171
167
  licenses:
172
168
  - MIT
@@ -191,25 +187,5 @@ rubygems_version: 2.2.2
191
187
  signing_key:
192
188
  specification_version: 4
193
189
  summary: i heard it's meant to help you with your state, mate!
194
- test_files:
195
- - spec/spec_helper.rb
196
- - spec/state_mate/adapters/defaults/hardware_uuid_spec.rb
197
- - spec/state_mate/adapters/defaults/hash_deep_write_spec.rb
198
- - spec/state_mate/adapters/defaults/read_defaults_spec.rb
199
- - spec/state_mate/adapters/defaults/read_spec.rb
200
- - spec/state_mate/adapters/defaults/read_type_spec.rb
201
- - spec/state_mate/adapters/defaults/write_spec.rb
202
- - spec/state_mate/adapters/git_config/read_spec.rb
203
- - spec/state_mate/adapters/git_config/write_spec.rb
204
- - spec/state_mate/adapters/json/read_spec.rb
205
- - spec/state_mate/adapters/json/write_spec.rb
206
- - spec/state_mate/execute_spec.rb
207
- - spec/state_mate_spec.rb
208
- - test/ansible/ansible.cfg
209
- - test/ansible/clear
210
- - test/ansible/hosts
211
- - test/ansible/play
212
- - test/ansible/playbook.yml
213
- - test/ansible/read
214
- - test/bin/install.rb
190
+ test_files: []
215
191
  has_rdoc:
data/spec/spec_helper.rb DELETED
@@ -1,77 +0,0 @@
1
- require 'tempfile'
2
-
3
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
- require 'state_mate'
5
-
6
- DOMAIN = 'com.nrser.state_mate'
7
-
8
- class MockError < StandardError; end
9
-
10
- shared_context "#{ DOMAIN } empty" do
11
- before(:each) {
12
- `defaults delete #{ DOMAIN } 2>&1 > /dev/null`
13
- `defaults -currentHost delete #{ DOMAIN } 2>&1 > /dev/null`
14
- }
15
- end
16
-
17
- shared_context "defaults" do
18
- let(:defaults) {
19
- StateMate::Adapters::Defaults
20
- }
21
- end
22
-
23
- shared_context "git_config" do
24
- let(:git_config) {
25
- StateMate::Adapters::GitConfig
26
- }
27
-
28
- let(:section) {
29
- "statemate"
30
- }
31
-
32
- let(:key) {
33
- "#{ section }.test"
34
- }
35
-
36
- before(:each) {
37
- `git config --global --unset-all #{ key } 2>&1`
38
- }
39
-
40
- after(:each) {
41
- `git config --global --unset-all #{ key } 2>&1`
42
- `git config --global --remove-section #{ section } 2>&1`
43
- }
44
- end
45
-
46
- shared_context "json" do
47
- let(:json) {
48
- StateMate::Adapters::JSON
49
- }
50
-
51
- before(:each) {
52
- @f = Tempfile.new "state_mate_json_spec"
53
- @filepath = @f.path
54
- }
55
-
56
- after(:each) {
57
- @f.close
58
- @f.unlink
59
- }
60
- end
61
-
62
- def expect_defaults_read key, matcher, type
63
- expect( `defaults read #{ DOMAIN } #{ key.shellescape }`.chomp ).to matcher
64
- expect(
65
- `defaults read-type #{ DOMAIN } #{ key.shellescape }`.chomp
66
- ).to eq "Type is #{ type }"
67
- end
68
-
69
- def remove_whitepsace str
70
- str.gsub /[[:space:]]/, ''
71
- end
72
-
73
- RSpec::Matchers.define :struct_eq do |expected|
74
- match do |actual|
75
- remove_whitepsace(actual) == remove_whitepsace(expected)
76
- end
77
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/defaults'
4
-
5
- describe "StateMate::Adapters::Defaults.hardware_uuid" do
6
- let(:defaults) {
7
- StateMate::Adapters::Defaults
8
- }
9
-
10
- it "returns something that looks like an apple hardware uuid" do
11
- expect( defaults.hardware_uuid ).to(
12
- match /[0-9A-F]{8}\-[0-9A-F]{4}\-[0-9A-F]{4}\-[0-9A-F]{4}\-[0-9A-F]{12}/
13
- )
14
- end
15
- end # hardware_uuid
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/defaults'
4
-
5
- describe "StateMate::Adapters::Defaults.hash_deep_write!" do
6
- let(:defaults) {
7
- StateMate::Adapters::Defaults
8
- }
9
-
10
- it "does a basic set on an empty hash" do
11
- h = {}
12
- defaults.hash_deep_write! h, [:x], 1
13
- expect( h ).to eq({x: 1})
14
- end
15
-
16
- it "does a deep set on an empty hash" do
17
- h = {}
18
- defaults.hash_deep_write! h, [:x, :y], 1
19
- expect( h ).to eq({x: {y: 1}})
20
- end
21
-
22
- it "does a deep set on an non-empty hash" do
23
- h = {a: 1}
24
- defaults.hash_deep_write! h, [:x, :y], 1
25
- expect( h ).to eq({a: 1, x: {y: 1}})
26
- end
27
-
28
- it "clobbers values" do
29
- h = {x: [1, 2, 3]}
30
- defaults.hash_deep_write! h, [:x, :y], 1
31
- expect( h ).to eq({x: {y: 1}})
32
-
33
- h = {x: 'ex'}
34
- defaults.hash_deep_write! h, [:x, :y, :z], 1
35
- expect( h ).to eq({x: {y: {z: 1}}})
36
- end
37
- end # hardware_uuid
@@ -1,57 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/defaults'
4
-
5
- describe "StateMate::Adapters::Defaults.read_defaults" do
6
- include_context "defaults"
7
- include_context "#{ DOMAIN } empty"
8
-
9
- let(:key) {
10
- 'x'
11
- }
12
-
13
- it "returns an empty hash when the domain is empty" do
14
- expect( defaults.read_defaults DOMAIN ).to eq({})
15
- end
16
-
17
- context "string value" do
18
-
19
- let(:string) {
20
- 'en_US@currency=USD'
21
- }
22
-
23
- before(:each) {
24
- `defaults write #{ DOMAIN } #{ key } -string '#{ string }'`
25
- }
26
-
27
- it "reads the domain with a string in it" do
28
- expect( defaults.read_defaults DOMAIN ).to eq({key => string})
29
- end
30
-
31
- it "still reads the current host domain as empty" do
32
- expect( defaults.read_defaults DOMAIN, true ).to eq({})
33
- end
34
-
35
- end
36
-
37
- context "string value in current host" do
38
-
39
- let(:string) {
40
- 'en_US@currency=USD'
41
- }
42
-
43
- before(:each) {
44
- `defaults -currentHost write #{ DOMAIN } #{ key } -string '#{ string }'`
45
- }
46
-
47
- it "reads the domain with a string in it" do
48
- expect( defaults.read_defaults DOMAIN, true ).to eq({key => string})
49
- end
50
-
51
- it "still reads the current host domain as empty" do
52
- expect( defaults.read_defaults DOMAIN, false ).to eq({})
53
- end
54
-
55
- end
56
-
57
- end
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/defaults'
4
-
5
- describe "StateMate::Adapters::Defaults.read" do
6
- include_context "defaults"
7
- include_context "#{ DOMAIN } empty"
8
-
9
- let(:key) {
10
- 'x'
11
- }
12
-
13
- it "returns nil when the key is missing" do
14
- expect( defaults.read [DOMAIN, key] ).to be nil
15
- end
16
-
17
- it "reads boolean values as a booleans (not ints)" do
18
- bools = {
19
- 't' => [true, 1],
20
- 'f' => [false, 0],
21
- }
22
-
23
- bools.each {|key, (bool, int)|
24
- # write boolean values
25
- `defaults write #{ DOMAIN } #{ key } -boolean #{ bool }`
26
-
27
- # when it's read by `defaults read`, it says it's a boolean
28
- # but it returns it as an integer
29
- expect_defaults_read key, eq(int.to_s), 'boolean'
30
-
31
- # however, since we use `defaults export` it reads it correctly
32
- # as a boolean
33
- expect( defaults.read [DOMAIN, key] ).to be(bool)
34
- }
35
- end
36
-
37
- context "string value with @ in it" do
38
-
39
- let(:string) {
40
- 'en_US@currency=USD'
41
- }
42
-
43
- before(:each) {
44
- `defaults write #{ DOMAIN } #{ key } -string '#{ string }'`
45
- }
46
-
47
- it "reads a string with an @ in it" do
48
- expect( defaults.read [DOMAIN, key] ).to eq string
49
- end
50
- end
51
-
52
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/defaults'
4
-
5
- describe "StateMate::Adapters::Defaults.read_type" do
6
- include_context "defaults"
7
- include_context "#{ DOMAIN } empty"
8
-
9
- {
10
- string: 'en_US@currency=USD',
11
- data: '62706c697374',
12
- int: '1',
13
- float: '1',
14
- bool: 'true',
15
- date: '2014-03-27',
16
- array: '1 2 3',
17
- dict: 'x 1 y 2',
18
- }.each do |type, input|
19
-
20
- it "reads a #{ type } type" do
21
- `defaults write #{ DOMAIN } x -#{ type } #{ input }`
22
- expect( defaults.read_type DOMAIN, 'x', false ).to be type
23
- end
24
-
25
- it "reads a #{ type } type from current host" do
26
- `defaults -currentHost write #{ DOMAIN } x -#{ type } #{ input }`
27
- expect( defaults.read_type DOMAIN, 'x', true ).to be type
28
- end
29
-
30
- end
31
-
32
- end
@@ -1,103 +0,0 @@
1
- require 'shellwords'
2
-
3
- require 'spec_helper'
4
-
5
- require 'state_mate/adapters/defaults'
6
-
7
- describe "StateMate::Adapters::Defaults.read" do
8
- include_context "defaults"
9
- include_context "#{ DOMAIN } empty"
10
-
11
- it "writes a basic value" do
12
- defaults.write [DOMAIN, 'x'], 'ex'
13
- expect_defaults_read 'x', eq('ex'), 'string'
14
- end
15
-
16
- it "writes a complex value" do
17
- defaults.write [DOMAIN, 'one'], {'two' => 3}
18
- expect_defaults_read 'one', struct_eq("{two=3;}"), 'dictionary'
19
- end
20
-
21
- it "writes a deep key" do
22
- defaults.write [DOMAIN, 'one', 'two'], 3
23
- expect_defaults_read 'one', struct_eq("{two=3;}"), 'dictionary'
24
- end
25
-
26
- context "key has string values" do
27
- values = {'x' => 'ex', 'y' => 'why'}
28
-
29
- before(:each) {
30
- values.each do |key, value|
31
- `defaults write #{ DOMAIN } #{ key } -string '#{ value }'`
32
- end
33
- }
34
-
35
- it "clobbers with a deep key" do
36
- defaults.write [DOMAIN, 'x', 'two'], 3
37
- expect_defaults_read 'x', struct_eq("{two=3;}"), 'dictionary'
38
- end
39
-
40
- it "deletes the value when nil is written to the key" do
41
- # make sure they're there
42
- values.each do |key, value|
43
- expect_defaults_read key, eq(value), 'string'
44
- end
45
-
46
- # do the delete by writing `nil`
47
- defaults.write [DOMAIN, 'x'], nil
48
-
49
- # check that it's gone via the system command
50
- expect(
51
- `defaults read #{ DOMAIN } x 2>&1`
52
- ).to match /does\ not\ exist$/
53
-
54
- # and check that it's gone to us
55
- expect( defaults.read [DOMAIN, 'x'] ).to eq nil
56
-
57
- # and check that the other one is still there
58
- expect_defaults_read 'y', eq(values['y']), 'string'
59
- expect( defaults.read [DOMAIN, 'y'] ).to eq values['y']
60
- end
61
-
62
- it "deletes the whole domain when nil is written to it with no key" do
63
- # make sure they're there
64
- values.each do |key, value|
65
- expect_defaults_read key, eq(value), 'string'
66
- end
67
-
68
- # do the delete by writing `nil`
69
- defaults.write [DOMAIN], nil
70
-
71
- values.each do |key, value|
72
- # check that it's gone via the system command
73
- expect(
74
- `defaults read #{ DOMAIN } #{ key } 2>&1`
75
- ).to match /does\ not\ exist$/
76
-
77
- # and check that it's gone to us
78
- expect( defaults.read [DOMAIN, key] ).to eq nil
79
- end
80
- end
81
- end
82
-
83
- it "errors trying to write an empty domain or key" do
84
- [
85
- [DOMAIN, ''],
86
- [''],
87
- [],
88
- '',
89
- # these are actually ok, for some reason it drops trailing empty strings:
90
- # "#{ DOMAIN }:",
91
- # "#{ DOMAIN }::",
92
- # but not leading ones:
93
- ":#{ DOMAIN }",
94
- # or ones with non-empty following
95
- "#{ DOMAIN }::x",
96
- ].each do |key|
97
- expect {
98
- defaults.write key, nil
99
- }.to raise_error ArgumentError
100
- end
101
- end
102
-
103
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/git_config'
4
-
5
- describe "StateMate::Adapters::GitConfig.read" do
6
- include_context "git_config"
7
-
8
- it "reads a missing key as nil" do
9
- expect( git_config.read key ).to eq nil
10
- end
11
-
12
- it "should error on a bad key" do
13
- # can't have underscore in the name
14
- expect{ git_config.read "state_mate.test" }.to raise_error SystemCallError
15
- end
16
-
17
- it "should read a present value" do
18
- value = "blah"
19
- `git config --global --add #{ key } #{ value }`
20
- expect( git_config.read key ).to eq value
21
- end
22
-
23
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate/adapters/git_config'
4
-
5
- describe "StateMate::Adapters::GitConfig.read" do
6
- include_context "git_config"
7
-
8
- it "writes a value" do
9
- value = "blah"
10
- git_config.write key, value
11
- expect( `git config --global --get #{ key }`.chomp ).to eq "#{ value }"
12
- end
13
- end
@@ -1,56 +0,0 @@
1
- require 'json'
2
-
3
- require 'spec_helper'
4
-
5
- require 'state_mate/adapters/json'
6
-
7
- describe "StateMate::Adapters::JSON.read" do
8
- include_context "json"
9
-
10
- it "reads an empty file as nil" do
11
- expect( json.read [@filepath] ).to be nil
12
- end
13
-
14
- context "file with a string value in it" do
15
- let(:value) {
16
- "blah"
17
- }
18
-
19
- before(:each) {
20
- File.open(@filepath, 'w') {|f|
21
- f.write JSON.dump(value)
22
- }
23
- }
24
-
25
- it "should read the value" do
26
- expect( json.read [@filepath] ).to eq value
27
- end
28
- end
29
-
30
- context "file with a dict value in it" do
31
- let(:value) {
32
- {
33
- 'x' => 1,
34
- 'y' => 2,
35
- 'z' => {
36
- 'a' => 3,
37
- }
38
- }
39
- }
40
-
41
- before(:each) {
42
- File.open(@filepath, 'w') {|f|
43
- f.write JSON.dump(value)
44
- }
45
- }
46
-
47
- it "should read the root value" do
48
- expect( json.read [@filepath] ).to eq value
49
- end
50
-
51
- it "should read a deeper value" do
52
- expect( json.read "#{ @filepath }:z:a" ).to eq 3
53
- end
54
- end
55
-
56
- end
@@ -1,54 +0,0 @@
1
- require 'json'
2
-
3
- require 'spec_helper'
4
-
5
- require 'state_mate/adapters/json'
6
-
7
- describe "StateMate::Adapters::JSON.write" do
8
- include_context "json"
9
-
10
- context "root value" do
11
- let(:value) {
12
- {
13
- "some_key" => "some value"
14
- }
15
- }
16
-
17
- it "should write the value" do
18
- json.write @filepath, value
19
- expect( JSON.load(File.read(@filepath)) ).to eq value
20
- end
21
- end
22
-
23
- context "deep value" do
24
- let(:doc) {
25
- {
26
- "top-level-key" => {
27
- 'second-level-key' => "old value"
28
- }
29
- }
30
- }
31
-
32
- let(:key) {
33
- [@filepath, "top-level-key", "second-level-key"]
34
- }
35
-
36
- let(:value) {
37
- "new value"
38
- }
39
-
40
- before(:each) {
41
- File.open(@filepath, 'w') do |f|
42
- f.write JSON.dump(doc)
43
- end
44
- }
45
-
46
- it "should write the value" do
47
- json.write key, value
48
- expect(
49
- JSON.load(File.read(@filepath))[key[1]][key[2]]
50
- ).to eq value
51
- end
52
- end
53
-
54
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'state_mate'
4
-
5
- describe "StateMate::execute" do
6
- context "defaults" do
7
- include_context "#{ DOMAIN } empty"
8
-
9
- it "writes a basic value" do
10
- StateMate.execute({
11
- 'defaults' => {
12
- 'key' => [DOMAIN, 'x'],
13
- 'set' => 'ex',
14
- },
15
- })
16
-
17
- expect_defaults_read 'x', eq('ex'), 'string'
18
- end
19
- end # context defaults
20
-
21
- context "write failure" do
22
- include_context "#{ DOMAIN } empty"
23
-
24
- it "raises StateMate::Error::WriteError" do
25
- allow(StateMate::Adapters::Defaults).to receive(:write) do
26
- raise MockError.new
27
- end
28
-
29
- expect {
30
- StateMate.execute({
31
- 'defaults' => {
32
- 'key' => [DOMAIN, 'x'],
33
- 'set' => 'ex',
34
- },
35
- })
36
- }.to raise_error StateMate::Error::WriteError
37
-
38
- end # it raises StateMate::Error::WriteError
39
- end # context write failure
40
- end
@@ -1,7 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe StateMate do
4
- it 'has a version number' do
5
- expect(StateMate::VERSION).not_to be nil
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- [defaults]
2
-
3
- hostfile = ./hosts
4
-
5
- library = ../../ansible/library:/usr/share/ansible
data/test/ansible/clear DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env bash
2
- defaults delete /Users/nrser/Library/Preferences/com.nrser.state_mate.plist
data/test/ansible/hosts DELETED
@@ -1 +0,0 @@
1
- localhost ansible_connection=local
data/test/ansible/play DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env bash
2
- bundle exec ansible-playbook -v playbook.yml
@@ -1,38 +0,0 @@
1
- ---
2
- - hosts: localhost
3
- gather_facts: false
4
- tasks:
5
- # - name: test defaults
6
- # state:
7
- # defaults:
8
- # - key: com.nrser.state_mate:x
9
- # set: 1
10
- # - key: com.nrser.state_mate:blah
11
- # set:
12
- # blow: me
13
- # - key: com.nrser.state_mate:key with spaces
14
- # set: value with spaces
15
-
16
- # - name: test launchd
17
- # state:
18
- # launchd:
19
- # key:
20
- # - /System/Library/LaunchAgents/com.apple.notificationcenterui.plist
21
- # - Disabled
22
- # set: true
23
-
24
- # - name: Disable local Time Machine snapshots
25
- # #
26
- # # sudo tmutil disablelocal
27
- # #
28
- # state:
29
- # time_machine:
30
- # key: local_backups
31
- # set: false
32
- # sudo: true
33
- - name: test deep key
34
- state:
35
- defaults:
36
- key: com.nrser.state_mate:x
37
- set: en_US@currency=USD
38
-
data/test/ansible/read DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env bash
2
- defaults read /Users/nrser/Library/Preferences/com.nrser.state_mate.plist
data/test/bin/install.rb DELETED
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # build and install gem from current source
4
-
5
- require 'pathname'
6
- require 'fileutils'
7
- require 'cmds'
8
-
9
- sudo = Cmds("rbenv version").out.start_with?("system") ? 'sudo' : nil
10
-
11
- ROOT = Pathname.new(__FILE__).dirname.join("..", "..").expand_path
12
-
13
- Cmds.stream "%{sudo?} gem uninstall state_mate", sudo: sudo
14
-
15
- Dir.chdir ROOT do
16
- Dir["./*.gem"].each {|fn| FileUtils.rm fn}
17
- Cmds.stream "gem build state_mate.gemspec"
18
- end
19
-
20
- Cmds.stream "%{sudo?} gem install %{path}",
21
- path: Dir[ROOT + "*.gem"].first,
22
- sudo: sudo