mellon 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: def326c20e1ca30c9928c4832d30685545243fc0
4
- data.tar.gz: 21b5882854d42a868ae1dd13238f230f4d2894b1
3
+ metadata.gz: d8678fd19fa9cfae39812816421a3909d45eaeb2
4
+ data.tar.gz: 03e80fc20be1c93f769f25fcd081e3166fe1deb4
5
5
  SHA512:
6
- metadata.gz: 148f9e5dab12df775f0635d07f7f5da20b0d6f1c9361e8b8b757aa9a130f8a813634f48a2c5b9d4bbe5b2ef330c894fedc5d4fad7edf416e3fb355f124c108bd
7
- data.tar.gz: 75c894dcf7e31e103c29d0c049d9adb4820cc1984b9a2c4d5a76a3fa5588d5cebfb0df892f668cd589ed168e4d0581a997797281ee8556b9f70e110a59b03dd7
6
+ metadata.gz: a8da897237648b63ee5b3c21d9ae0dfad9f90e6c24a9a70ab714de7d352deb997201250eeb1995e17c8eae6fce8b315b2890627182631c9d1b67b2a9e6128ec4
7
+ data.tar.gz: f1d71b5cd507568290b8aed46feafe6390eedb4481043e1391a527a86ab5af875a41b6ea8ca5812f83a2339d726e0d11ea98368ec6909e1efac9e1f78d9456ec
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  [HEAD][]
2
2
  --------
3
3
 
4
+ [v1.1.1][]
5
+ ----------
6
+
7
+ - Fix Mellon::Store for empty keychain entries (c3d1da52)
8
+ - Fix mistaking error reading keychain from missing entry (782d2d82)
9
+ - Show stderr and exit status when `mellon edit` fails (fd2eecee)
10
+
4
11
  [v1.1.0][]
5
12
  ----------
6
13
 
@@ -14,6 +21,7 @@
14
21
 
15
22
  Initial release!
16
23
 
17
- [HEAD]: https://github.com/elabs/mellon/compare/v1.1.0...HEAD
24
+ [HEAD]: https://github.com/elabs/mellon/compare/v1.1.1...HEAD
25
+ [v1.1.1]: https://github.com/elabs/mellon/compare/v1.1.0...v1.1.1
18
26
  [v1.1.0]: https://github.com/elabs/mellon/compare/v1.0.0...v1.1.0
19
27
  [v1.0.0]: https://github.com/elabs/mellon/compare/24b83977d...v1.0.0
data/bin/mellon CHANGED
@@ -101,11 +101,20 @@ Slop.parse(strict: true, help: true) do
101
101
  exit false
102
102
  end
103
103
 
104
+ require "shellwords"
104
105
  require "tempfile"
105
106
  Tempfile.open([name, ".txt"]) do |io|
106
107
  File.write io.path, keychain[name]
107
- system editor, io.path
108
- keychain[name] = File.read(io.path)
108
+ stderr_r, stderr_w = IO.pipe
109
+ system("$EDITOR #{Shellwords.escape(io.path)}", :err => stderr_w)
110
+ status = $?
111
+ stderr_w.close
112
+
113
+ if status.success?
114
+ keychain[name] = File.read(io.path)
115
+ else
116
+ $stderr.puts "[#{status}] #{stderr_r.read}"
117
+ end
109
118
  end
110
119
  end
111
120
  end
@@ -3,6 +3,8 @@ require "plist"
3
3
  module Mellon
4
4
  # Keychain provides simple methods for reading and storing keychain entries.
5
5
  class Keychain
6
+ ENTRY_MISSING = /SecKeychainSearchCopyNext/.freeze
7
+
6
8
  class << self
7
9
  # Find the first keychain that contains the key.
8
10
  #
@@ -11,7 +13,8 @@ module Mellon
11
13
  def search(key)
12
14
  output = ShellUtils.security("find-generic-password", "-l", key)
13
15
  new(output[/keychain: "(.+)"/i, 1], ensure_exists: false)
14
- rescue CommandError
16
+ rescue CommandError => e
17
+ raise unless e.message =~ ENTRY_MISSING
15
18
  nil
16
19
  end
17
20
 
@@ -140,6 +143,7 @@ module Mellon
140
143
  [Utils.parse_info(info), Utils.parse_contents(password_info)]
141
144
  end
142
145
  rescue CommandError => e
146
+ raise unless e.message =~ ENTRY_MISSING
143
147
  nil
144
148
  end
145
149
 
data/lib/mellon/store.rb CHANGED
@@ -63,12 +63,8 @@ module Mellon
63
63
 
64
64
  def data
65
65
  config = @keychain[@project_name]
66
-
67
- if config
68
- @serializer.load(config)
69
- else
70
- {}
71
- end
66
+ data = @serializer.load(config) if config
67
+ data or {}
72
68
  end
73
69
 
74
70
  def dump(hash)
@@ -1,3 +1,3 @@
1
1
  module Mellon
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
@@ -86,6 +86,15 @@ describe Mellon::Keychain do
86
86
  it "returns nil when there is no entry with the given name" do
87
87
  keychain["nonexisting note"].should be_nil
88
88
  end
89
+
90
+ it "raises an error when command exits for a reason other than key missing" do
91
+ error = Mellon::CommandError.new(<<-ERROR)
92
+ security find-generic-password -g -l unreadable /Users/dev/Projects/mellon/spec/temporary_keychain.keychain
93
+ security: SecKeychainItemCopyAccess: In dark wake, no UI possible
94
+ ERROR
95
+ Mellon::ShellUtils.should_receive(:sh).and_raise(error)
96
+ expect { keychain["simple"] }.to raise_error(Mellon::CommandError, /dark wake/)
97
+ end
89
98
  end
90
99
 
91
100
  describe "#[]=" do
@@ -50,6 +50,13 @@ describe Mellon::Store do
50
50
  store = Mellon::Store.new("missing project", keychain: keychain)
51
51
  store["some value"].should be_nil
52
52
  end
53
+
54
+ it "returns nil if keychain item is empty" do
55
+ store = Mellon::Store.new("empty", keychain: keychain)
56
+ store["some value"].should be_nil
57
+ store["some value"] = "New value"
58
+ store["some value"].should eq "New value"
59
+ end
53
60
  end
54
61
 
55
62
  describe "#[]=" do
data/spec/mellon_spec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  describe Mellon do
2
2
  specify "VERSION" do
3
- defined?(Mellon::VERSION).should be_true
3
+ defined?(Mellon::VERSION).should_not be_nil
4
4
  end
5
5
  end
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,14 @@ keychain_path = File.expand_path("./temporary_keychain.keychain", __dir__)
6
6
  original_keychain_path = File.expand_path("./keychain.keychain", __dir__)
7
7
 
8
8
  RSpec.configure do |config|
9
+ config.expect_with :rspec do |c|
10
+ c.syntax = [:expect, :should]
11
+ end
12
+
13
+ config.mock_with :rspec do |c|
14
+ c.syntax = :should
15
+ end
16
+
9
17
  config.around do |example|
10
18
  FileUtils.cp(original_keychain_path, keychain_path)
11
19
  example.run
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mellon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kim Burgestrand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-10 00:00:00.000000000 Z
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: plist
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: slop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.6'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.6'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description:
@@ -102,8 +102,8 @@ executables:
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
- - .gitignore
106
- - .rspec
105
+ - ".gitignore"
106
+ - ".rspec"
107
107
  - CHANGELOG.md
108
108
  - Gemfile
109
109
  - LICENSE
@@ -133,17 +133,17 @@ require_paths:
133
133
  - lib
134
134
  required_ruby_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  requirements:
141
- - - '>='
141
+ - - ">="
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
145
  rubyforge_project:
146
- rubygems_version: 2.2.2
146
+ rubygems_version: 2.2.1
147
147
  signing_key:
148
148
  specification_version: 4
149
149
  summary: A command-line utility for managing secret application credentials via OSX