purse 0.1.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.
@@ -0,0 +1,168 @@
1
+ require 'test_helper.rb'
2
+
3
+ class TestPocket < Test::Unit::TestCase
4
+
5
+ context "Purse" do
6
+ context "Pocket" do
7
+
8
+ context "an instance" do
9
+ setup do
10
+ @pocket = Pocket.new(purse_path)
11
+ end
12
+
13
+ should "require a path" do
14
+ assert_raise(MissingParameter) do
15
+ Pocket.new(nil)
16
+ end
17
+ end
18
+
19
+ context "initialize" do
20
+
21
+ should "assign path to @path" do
22
+ assert purse_path, @pocket.path
23
+ end
24
+
25
+ end
26
+ context "notes" do
27
+
28
+ setup do
29
+ @notes = @pocket.notes
30
+ end
31
+
32
+ should "find notes by Dir[]" do
33
+ assert Dir[purse_path + '/*.note'], @pocket.notes_paths
34
+ end
35
+
36
+ should "assign notes to an array in @notes" do
37
+ assert_set_of Note, @notes
38
+ end
39
+ end
40
+
41
+ context "find" do
42
+ setup do
43
+ Dir.expects(:[]).at_most_once.returns([File.join(purse_path, 'jagger.note')])
44
+ @notes = @pocket.notes
45
+ end
46
+
47
+ context "with a loaded note name" do
48
+ setup do
49
+ @note = @pocket.find('jagger')
50
+ end
51
+
52
+ should "return the note" do
53
+ assert @note.is_a?(Note)
54
+ assert_equal 'jagger', @note.name
55
+ end
56
+ end
57
+
58
+ context "with an unknown note" do
59
+ should "raise error" do
60
+ assert_raise(MissingFile) do
61
+ @pocket.find('bloober')
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ context "edit" do
68
+ should "yield the note to the block" do
69
+ @pocket.edit('jagger') do |note|
70
+ assert note.is_a?(Note)
71
+ assert_equal @pocket.find('jagger'), note
72
+ end
73
+ end
74
+ end
75
+
76
+ context "re_encrypt" do
77
+ should "require a password" do
78
+ assert_raise(MissingParameter) do
79
+ @pocket.re_encrypt(nil)
80
+ end
81
+ end
82
+
83
+ context "with a password" do
84
+ should "call save on each note" do
85
+ password = 'newpass'
86
+ Note.any_instance.stubs(:save).times(3).with(password)
87
+ @pocket.re_encrypt(password)
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+ context "init" do
94
+ context "if the directory already exists" do
95
+ context "if the git directory already exists" do
96
+ should "not call Git init" do
97
+ Git.init(purse_path)
98
+ Git.expects(:init).once
99
+ @pocket.init
100
+ FileUtils.rm_rf(File.join(purse_path, '.git'))
101
+ end
102
+ end
103
+
104
+ context "if the git directory does not exist" do
105
+ should "initialize the git repo" do
106
+ Git.expects(:init).with(purse_path).once
107
+ @pocket.init
108
+ # assert File.readable?(File.join(purse_path, '.git/config'))
109
+ FileUtils.rm_rf(File.join(purse_path, '.git'))
110
+ end
111
+ end
112
+ end
113
+
114
+ context "if the directory doesn't exist" do
115
+ setup do
116
+ @other_purse_path = File.expand_path(File.join('~', 'tmp', 'tmp_purse_path'))
117
+ @pocket = Pocket.new(@other_purse_path)
118
+ Git.expects(:init).with(@other_purse_path).once
119
+ @pocket.init
120
+ end
121
+
122
+ teardown do
123
+ FileUtils.rm_rf(@other_purse_path)
124
+ end
125
+
126
+ should "create the directory" do
127
+ assert File.readable?(@other_purse_path)
128
+ end
129
+
130
+ # should "create the git directory" do
131
+ # assert File.directory?(File.join(@other_purse_path, '.git'))
132
+ # end
133
+ end
134
+
135
+ end
136
+
137
+ context "push" do
138
+ context "if there is already a git directory" do
139
+
140
+ end
141
+
142
+ context "if there is no git remote setting" do
143
+
144
+ end
145
+
146
+ context "if there is a remote setting but there is no repository" do
147
+
148
+ end
149
+
150
+ should_eventually "push to git repo" do
151
+
152
+ end
153
+
154
+ end
155
+
156
+ context "pull" do
157
+
158
+ should_eventually "pull from a git server" do
159
+
160
+ end
161
+
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+
168
+ end
@@ -0,0 +1,141 @@
1
+ require 'test_helper.rb'
2
+
3
+ class TestSettings < Test::Unit::TestCase
4
+
5
+ context "Purse" do
6
+ context "Settings" do
7
+ setup do
8
+ @other_path = File.join(purse_path, 'other_settings.yml')
9
+ end
10
+
11
+ teardown do
12
+ FileUtils.rm(@other_path, :force => true)
13
+ end
14
+
15
+
16
+ context "path" do
17
+ setup do
18
+ Settings.path = Settings.default_path
19
+ @path = Settings.path
20
+ end
21
+
22
+ should "return readable file path" do
23
+ assert File.readable?(@path)
24
+ end
25
+
26
+ should "be a file in ~/" do
27
+ assert_match(/#{File.expand_path('~/')}/,@path)
28
+ end
29
+ end
30
+
31
+ context "path=" do
32
+
33
+ context "with a path string" do
34
+ setup do
35
+ Settings.path = File.join(purse_path, 'settings.yml')
36
+ end
37
+
38
+ should "set path for class" do
39
+ assert_equal File.join(purse_path, 'settings.yml'), Settings.path
40
+ end
41
+ end
42
+ end
43
+
44
+ context "load" do
45
+ context "when the file already exists" do
46
+ setup do
47
+ Settings.path = File.join(purse_path, 'settings.yml')
48
+ YAML.expects(:load_file).with(File.join(purse_path, 'settings.yml')).returns({'repository' => 'github.com', 'path' => '~/aaron/.purse'})
49
+ Settings.load
50
+ end
51
+
52
+ should "store parsed settings in @settings" do
53
+ assert Settings.settings.is_a?(Hash)
54
+ assert_equal 'github.com', Settings.settings['repository']
55
+ end
56
+ end
57
+
58
+ context "when the file does not exist" do
59
+ setup do
60
+ Settings.path = @other_path
61
+ Settings.load
62
+ end
63
+
64
+ should "create the file at path" do
65
+ assert File.readable?(@other_path)
66
+ end
67
+
68
+ should "initialize @settings" do
69
+ assert Settings.settings.is_a?(Hash)
70
+ end
71
+
72
+ end
73
+ end
74
+
75
+ context "save" do
76
+ setup do
77
+ Settings.path = @other_path
78
+ Settings.settings = {:path => 'farts', :key => '12345'}
79
+ Settings.save
80
+ end
81
+
82
+ should "convert @settings to_yaml" do
83
+ assert_match(/key\:.+12345/, File.open(@other_path) {|f| f.read })
84
+ end
85
+
86
+ should "write yaml to path" do
87
+ assert File.readable?(@other_path)
88
+ end
89
+
90
+ end
91
+
92
+ context "get" do
93
+ context "if @settings are loaded" do
94
+ setup do
95
+ Settings.path = @other_path
96
+ Settings.stubs(:loaded?).returns(true)
97
+ Settings.settings = {:path => purse_path}
98
+ end
99
+
100
+ should "retrieve setting by key" do
101
+ assert_equal purse_path, Settings.get('path')
102
+ assert_equal purse_path, Settings.get(:path)
103
+ end
104
+ end
105
+
106
+ context "if settings are not loaded" do
107
+ setup do
108
+ Settings.path = File.join(purse_path, 'settings.yml')
109
+ YAML.expects(:load_file).returns({'repository' => 'github.com', 'path' => '~/aaron/.purse'})
110
+ Settings.get('repository')
111
+ end
112
+
113
+ should "load settings from path" do
114
+ assert Settings.settings
115
+ end
116
+
117
+ should "retrieve setting by key" do
118
+ assert_equal 'github.com', Settings.get('repository')
119
+ assert_equal 'github.com', Settings.get(:repository)
120
+ end
121
+ end
122
+ end
123
+
124
+ context "set" do
125
+ setup do
126
+ Settings.path = @other_path
127
+ end
128
+
129
+ should "put setting with key into @settings" do
130
+ Settings.set('key', 'value')
131
+ assert_equal 'value', Settings.settings['key']
132
+ end
133
+
134
+ should "save settings to path" do
135
+ Settings.expects(:save).at_most_once
136
+ Settings.set('key', 'value')
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'shoulda'
4
+ require 'mocha'
5
+
6
+ require File.dirname(__FILE__) + '/../lib/purse'
7
+
8
+ class Test::Unit::TestCase
9
+
10
+ include Purse
11
+
12
+ def purse_path
13
+ File.expand_path(File.join(File.dirname(__FILE__), 'test_purse_data'))
14
+ end
15
+
16
+ def assert_all(collection)
17
+ collection.each do |one|
18
+ assert yield(one), "#{one} is not true"
19
+ end
20
+ end
21
+
22
+ def assert_any(collection, &block)
23
+ has = collection.any? do |one|
24
+ yield(one)
25
+ end
26
+ assert has
27
+ end
28
+
29
+ def assert_ordered(array_of_ordered_items, message = nil, &block)
30
+ raise "Parameter must be an Array" unless array_of_ordered_items.is_a?(Array)
31
+ message ||= "Items were not in the correct order"
32
+ i = 0
33
+ # puts array_of_ordered_items.length
34
+ while i < (array_of_ordered_items.length - 1)
35
+ # puts "j"
36
+ a, b = array_of_ordered_items[i], array_of_ordered_items[i+1]
37
+ comparison = yield(a,b)
38
+ # raise "#{comparison}"
39
+ assert(comparison, message + " - #{a}, #{b}")
40
+ i += 1
41
+ end
42
+ end
43
+
44
+ def assert_set_of(klass, set)
45
+ assert set.respond_to?(:each), "#{set} is not a set (does not include Enumerable)"
46
+ assert_all(set) {|a| a.is_a?(klass) }
47
+ end
48
+
49
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: purse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Quint
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-29 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.2
24
+ version:
25
+ description: A simple but secure password storage solution using git and crypt
26
+ email:
27
+ - aaron@quirkey.com
28
+ executables:
29
+ - purse
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - License.txt
35
+ - Manifest.txt
36
+ - PostInstall.txt
37
+ - README.txt
38
+ - lib/purse/help.txt
39
+ files:
40
+ - History.txt
41
+ - License.txt
42
+ - Manifest.txt
43
+ - PostInstall.txt
44
+ - README.txt
45
+ - Rakefile
46
+ - bin/purse
47
+ - lib/purse.rb
48
+ - lib/purse/cli.rb
49
+ - lib/purse/error.rb
50
+ - lib/purse/note.rb
51
+ - lib/purse/pocket.rb
52
+ - lib/purse/settings.rb
53
+ - lib/purse/version.rb
54
+ - lib/purse/help.txt
55
+ has_rdoc: true
56
+ homepage: http://quirkey.rubyforge.org
57
+ post_install_message: |
58
+
59
+ For more information on purse, see http://quirkey.com/blog
60
+
61
+ rdoc_options:
62
+ - --main
63
+ - README.txt
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ requirements: []
79
+
80
+ rubyforge_project: quirkey
81
+ rubygems_version: 1.2.0
82
+ signing_key:
83
+ specification_version: 2
84
+ summary: A simple but secure password storage solution using git and crypt
85
+ test_files:
86
+ - test/purse/test_cli.rb
87
+ - test/purse/test_note.rb
88
+ - test/purse/test_pocket.rb
89
+ - test/purse/test_settings.rb
90
+ - test/test_helper.rb