s7n 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.
Files changed (47) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +28 -0
  4. data/LICENCE +24 -0
  5. data/README.rdoc +54 -0
  6. data/Rakefile +67 -0
  7. data/bin/s7ncli +23 -0
  8. data/lib/s7n.rb +12 -0
  9. data/lib/s7n/action.rb +7 -0
  10. data/lib/s7n/attribute.rb +226 -0
  11. data/lib/s7n/cipher.rb +110 -0
  12. data/lib/s7n/configuration.rb +41 -0
  13. data/lib/s7n/entry.rb +106 -0
  14. data/lib/s7n/entry_collection.rb +44 -0
  15. data/lib/s7n/entry_template.rb +10 -0
  16. data/lib/s7n/exception.rb +116 -0
  17. data/lib/s7n/file.rb +77 -0
  18. data/lib/s7n/gpass_file.rb +203 -0
  19. data/lib/s7n/key.rb +83 -0
  20. data/lib/s7n/message_catalog.rb +5 -0
  21. data/lib/s7n/s7n_file.rb +47 -0
  22. data/lib/s7n/s7ncli.rb +226 -0
  23. data/lib/s7n/s7ncli/attribute_command.rb +83 -0
  24. data/lib/s7n/s7ncli/command.rb +215 -0
  25. data/lib/s7n/s7ncli/entry_collection_command.rb +63 -0
  26. data/lib/s7n/s7ncli/entry_command.rb +728 -0
  27. data/lib/s7n/s7ncli/option.rb +101 -0
  28. data/lib/s7n/secret_generator.rb +30 -0
  29. data/lib/s7n/undo_stack.rb +7 -0
  30. data/lib/s7n/unicode_data.rb +29 -0
  31. data/lib/s7n/utils.rb +37 -0
  32. data/lib/s7n/version.rb +3 -0
  33. data/lib/s7n/world.rb +158 -0
  34. data/po/ja/s7n.po +533 -0
  35. data/po/s7n.pot +533 -0
  36. data/s7n.gemspec +30 -0
  37. data/test/s7n/attribute_test.rb +50 -0
  38. data/test/s7n/gpass_file_test.rb +169 -0
  39. data/test/s7n/gpass_file_test/passwords.gps.empty +1 -0
  40. data/test/s7n/gpass_file_test/passwords.gps.one_entry +2 -0
  41. data/test/s7n/gpass_file_test/passwords.gps.three_entries +3 -0
  42. data/test/s7n/gpass_file_test/passwords.gps.with_folders +0 -0
  43. data/test/s7n/secret_generator_test.rb +29 -0
  44. data/test/s7n/unicode_data_test.rb +28 -0
  45. data/test/s7n/world_test.rb +35 -0
  46. data/test/test_helper.rb +11 -0
  47. metadata +153 -0
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "s7n/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "s7n"
7
+ s.version = S7n::VERSION
8
+ s.authors = ["Kouji Takao"]
9
+ s.email = ["kouji@takao7.net"]
10
+ s.homepage = ""
11
+ s.summary = %q{The secret informations manager.}
12
+ s.description = %q{s7 (seven) is the secret informations(password, credit number, file, etc..) manager.}
13
+
14
+ s.rubyforge_project = "s7n"
15
+
16
+ s.files = `git ls-files`.split("\n") + Dir.glob("data/locale/**/*.mo")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.default_executable = "s7ncli"
22
+ s.requirements << "Ruby, version 1.9.3 (or newer)"
23
+ s.required_ruby_version = '>= 1.9.3'
24
+
25
+ # specify any dependencies here; for example:
26
+ s.add_development_dependency "test-unit"
27
+ s.add_development_dependency "shoulda"
28
+ s.add_development_dependency "rr"
29
+ s.add_runtime_dependency "gettext"
30
+ end
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
4
+ require "s7n/attribute"
5
+
6
+ module S7n
7
+ class BooleanAttributeTest < Test::Unit::TestCase
8
+ def test_display_value__true
9
+ attr = BooleanAttribute.new("value" => true)
10
+ assert_equal(_("Yes"), attr.display_value)
11
+ end
12
+
13
+ def test_display_value__false
14
+ attr = BooleanAttribute.new("value" => false)
15
+ assert_equal(_("No"), attr.display_value)
16
+ end
17
+
18
+ def test_display_value__secret
19
+ values = [true, false]
20
+ values.each do |value|
21
+ attr = BooleanAttribute.new("value" => value, "secret" => "true")
22
+ assert_equal("*", attr.display_value)
23
+ end
24
+ end
25
+
26
+ def test_display_value__機密情報は*にする
27
+ attr = BooleanAttribute.new("value" => true, "secret" => "true")
28
+ assert_equal("*", attr.display_value)
29
+ end
30
+ end
31
+
32
+ class DateTimeAttributeTest < Test::Unit::TestCase
33
+ def test_display_value
34
+ t = Time.mktime(2008, 10, 21, 18, 14, 30).to_datetime
35
+ attr = DateTimeAttribute.new("value" => t)
36
+ assert_equal("2008/10/21 18:14:30", attr.display_value)
37
+ end
38
+
39
+ def test_display_value__only_date
40
+ t = Time.mktime(2008, 10, 21, 0, 0, 0).to_datetime
41
+ attr = DateTimeAttribute.new("value" => t)
42
+ assert_equal("2008/10/21", attr.display_value)
43
+ end
44
+
45
+ def test_display_value__secret
46
+ attr = DateTimeAttribute.new("secret" => "true")
47
+ assert_equal("*", attr.display_value)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,169 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
4
+ require "s7n/gpass_file"
5
+ require "time"
6
+
7
+ module S7n
8
+ class GPassFileTest < Test::Unit::TestCase
9
+ # パスフレーズが不正な場合、 InvalidPassphrase 例外が発生する。
10
+ def test_read__invalid_passphrase
11
+ invalid_passphrases = ["", "1234", "qwert", "qwertyu", "QWERTY"]
12
+ file = GPassFile.new
13
+ invalid_passphrases.each do |s|
14
+ assert_raises(InvalidPassphrase) do
15
+ file.read(s, gpass_file_path("empty"))
16
+ end
17
+ end
18
+ end
19
+
20
+ # 機密情報がひとつもないファイルを読み込む。
21
+ def test_read__empty
22
+ file = GPassFile.new
23
+ res = file.read("qwerty", gpass_file_path("empty"))
24
+ assert(res.entries.empty?)
25
+ end
26
+
27
+ # 機密情報がひとつのファイルを読み込む。
28
+ def test_read__one_entry
29
+ file = GPassFile.new
30
+ res = file.read("qwerty", gpass_file_path("one_entry"))
31
+ entry = res.entries.first
32
+ assert_equal(1, entry.id)
33
+ assert_equal("entry1", entry.name)
34
+ assert_equal("This is entry 1.", entry.description)
35
+ assert_equal(Time.parse("2008-10-05 00:17:06").to_datetime, entry.created_at)
36
+ assert_equal(Time.parse("2008-10-05 00:17:06").to_datetime, entry.updated_at)
37
+ assert_equal("foo", entry.username)
38
+ assert_equal("1234", entry.password)
39
+ assert_equal(true, entry.expiration)
40
+ assert_equal(Time.parse("2009-10-05 09:00:00").to_datetime, entry.expire_at)
41
+ assert_equal([], entry.tags)
42
+ assert_equal(1, res.entries.length)
43
+ end
44
+
45
+ # 機密情報が 3 つのファイルを読み込む。
46
+ def test_read__three_entry
47
+ file = GPassFile.new
48
+ res = file.read("qwerty", gpass_file_path("three_entries"))
49
+
50
+ entry = res.entries[0]
51
+ assert_equal(1, entry.id)
52
+ assert_equal("entry1", entry.name)
53
+ assert_equal("This is entry 1.", entry.description)
54
+ assert_equal(Time.parse("2008-10-05 00:17:06").to_datetime, entry.created_at)
55
+ assert_equal(Time.parse("2008-10-05 00:17:06").to_datetime, entry.updated_at)
56
+ assert_equal("foo", entry.username)
57
+ assert_equal("1234", entry.password)
58
+ assert_equal(true, entry.expiration)
59
+ assert_equal(Time.parse("2009-10-05 09:00:00").to_datetime, entry.expire_at)
60
+ assert_equal("example.com", entry.hostname)
61
+ assert_equal([], entry.tags)
62
+
63
+ entry = res.entries[1]
64
+ assert_equal(2, entry.id)
65
+ assert_equal("entry2", entry.name)
66
+ assert_equal("This is entry 2.", entry.description)
67
+ assert_equal(Time.parse("2008-10-05 00:18:41").to_datetime, entry.created_at)
68
+ assert_equal(Time.parse("2008-10-05 00:18:41").to_datetime, entry.updated_at)
69
+ assert_equal("bar", entry.username)
70
+ assert_equal("5678", entry.password)
71
+ assert_equal(false, entry.expiration)
72
+ assert_equal("", entry.hostname)
73
+ assert_equal([], entry.tags)
74
+
75
+ entry = res.entries[2]
76
+ assert_equal(3, entry.id)
77
+ assert_equal("entry3", entry.name)
78
+ assert_equal("This is entry 3.", entry.description)
79
+ assert_equal(Time.parse("2008-10-05 00:19:15").to_datetime, entry.created_at)
80
+ assert_equal(Time.parse("2008-10-05 00:19:15").to_datetime, entry.updated_at)
81
+ assert_equal("baz", entry.username)
82
+ assert_equal("9876", entry.password)
83
+ assert_equal(false, entry.expiration)
84
+ assert_equal("", entry.hostname)
85
+ assert_equal([], entry.tags)
86
+
87
+ assert_equal(3, res.entries.length)
88
+ end
89
+
90
+ # フォルダを含むファイルを読み込む。
91
+ def test_read__with_folders
92
+ file = GPassFile.new
93
+ res = file.read("qwerty", gpass_file_path("with_folders"))
94
+
95
+ entry = res.entries[0]
96
+ assert_equal(1, entry.id)
97
+ assert_equal("entry1-1", entry.name)
98
+ assert_equal("This is entry 1-1.", entry.description)
99
+ assert_equal(Time.parse("2008-10-05 00:17:06").to_datetime, entry.created_at)
100
+ assert_equal(Time.parse("2008-10-05 00:20:58").to_datetime, entry.updated_at)
101
+ assert_equal("foo", entry.username)
102
+ assert_equal("1234", entry.password)
103
+ assert_equal(true, entry.expiration)
104
+ assert_equal(Time.parse("2009-10-05 09:00:00").to_datetime, entry.expire_at)
105
+ assert_equal("example.com", entry.hostname)
106
+ assert_equal(["folder1"], entry.tags)
107
+
108
+ entry = res.entries[1]
109
+ assert_equal(2, entry.id)
110
+ assert_equal("entry1-2", entry.name)
111
+ assert_equal("This is entry 1-2.", entry.description)
112
+ assert_equal(Time.parse("2008-10-05 00:20:33").to_datetime, entry.created_at)
113
+ assert_equal(Time.parse("2008-10-05 00:20:33").to_datetime, entry.updated_at)
114
+ assert_equal("", entry.username)
115
+ assert_equal("", entry.password)
116
+ assert_equal(false, entry.expiration)
117
+ assert_equal("", entry.hostname)
118
+ assert_equal(["folder1"], entry.tags)
119
+
120
+ entry = res.entries[2]
121
+ assert_equal(3, entry.id)
122
+ assert_equal("entry2-1", entry.name)
123
+ assert_equal("This is entry 2-1.", entry.description)
124
+ assert_equal(Time.parse("2008-10-05 00:18:41").to_datetime, entry.created_at)
125
+ assert_equal(Time.parse("2008-10-05 00:21:33").to_datetime, entry.updated_at)
126
+ assert_equal("bar", entry.username)
127
+ assert_equal("5678", entry.password)
128
+ assert_equal(false, entry.expiration)
129
+ assert_equal("", entry.hostname)
130
+ assert_equal(["folder2"], entry.tags)
131
+
132
+ entry = res.entries[3]
133
+ assert_equal(4, entry.id)
134
+ assert_equal("entry 2-2-1", entry.name)
135
+ assert_equal("This is entry 2-2-1.", entry.description)
136
+ assert_equal(Time.parse("2008-10-05 00:22:00").to_datetime, entry.created_at)
137
+ assert_equal(Time.parse("2008-10-05 00:22:00").to_datetime, entry.updated_at)
138
+ assert_equal("", entry.username)
139
+ assert_equal("", entry.password)
140
+ assert_equal(false, entry.expiration)
141
+ assert_equal("", entry.hostname)
142
+ assert_equal(["folder2", "folder2-2"], entry.tags)
143
+
144
+ entry = res.entries[4]
145
+ assert_equal(5, entry.id)
146
+ assert_equal("entry3", entry.name)
147
+ assert_equal("This is entry 3.", entry.description)
148
+ assert_equal(Time.parse("2008-10-05 00:19:15").to_datetime, entry.created_at)
149
+ assert_equal(Time.parse("2008-10-05 00:19:15").to_datetime, entry.updated_at)
150
+ assert_equal("baz", entry.username)
151
+ assert_equal("9876", entry.password)
152
+ assert_equal(false, entry.expiration)
153
+ assert_equal("", entry.hostname)
154
+ assert_equal([], entry.tags)
155
+
156
+ assert_equal(5, res.entries.length)
157
+ end
158
+
159
+ private
160
+
161
+ # 本テストで使用する GPass のファイル名を取得する。
162
+ # name には gpass_file_test/passwords.gps. より後の部分を指定する。
163
+ def gpass_file_path(name)
164
+ return File.join(File.dirname(__FILE__),
165
+ "gpass_file_test",
166
+ "passwords.gps." + name)
167
+ end
168
+ end
169
+ end
@@ -0,0 +1 @@
1
+ ���A2�I P{�Ɉ�H��N���
@@ -0,0 +1,2 @@
1
+ ���A2�I P{�Ɉ�H��N���M�Kdd6B�� ?nQ����o��
2
+ ՍG�&���j� ^+ҍ��z�e��N�2�R����A�`N�s�jB>�3FN:��?��i�/"
@@ -0,0 +1,3 @@
1
+ ���A2�I P{�Ɉ�H��N���M�Kdd6B�� ?nQ����o��
2
+ ՍG�&���j� ^+ҍ��z�e��N�2�R����A�`N�s�jB>�3FN:� ���1�B�u*��<�&��
3
+
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
4
+ require "s7n/secret_generator"
5
+
6
+ module S7n
7
+ class SecretGeneratorTest < Test::Unit::TestCase
8
+ def test_s_generate__length
9
+ (1..1000).each do |length|
10
+ value = SecretGenerator.generate(length: length)
11
+ assert_equal(length, value.length)
12
+ end
13
+ end
14
+
15
+ def test_s_generate__characters
16
+ value = SecretGenerator.generate(length: 100,
17
+ characters: [:upper_alphabet])
18
+ assert_equal("", value.delete("A-Z"))
19
+
20
+ value = SecretGenerator.generate(length: 100,
21
+ characters: [:lower_alphabet])
22
+ assert_equal("", value.delete("a-z"))
23
+
24
+ value = SecretGenerator.generate(length: 100,
25
+ characters: [:number])
26
+ assert_equal("", value.delete("0-9"))
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
4
+ require "s7n/unicode_data"
5
+
6
+ module S7n
7
+ class UnicodeDataTest < Test::Unit::TestCase
8
+ include UnicodeData
9
+
10
+ def test_s_east_asian_width
11
+ # ASCII
12
+ ("\u0020".."\u007D").each do |i|
13
+ assert_equal(:N, UnicodeData.east_asian_width(i.chr), "character=<#{i}>")
14
+ end
15
+ assert_equal(:N, UnicodeData.east_asian_width("\u203E"), "character=<\u203E>")
16
+
17
+ # 半角カナ
18
+ ("\uFF61".."\uFF9F").each do |i|
19
+ assert_equal(:H, UnicodeData.east_asian_width(i.chr), "character=<#{i}>")
20
+ end
21
+
22
+ # 上記以外
23
+ ("あ".."ん").each do |i|
24
+ assert_equal(:F, UnicodeData.east_asian_width(i.chr), "character=<#{i}>")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.expand_path("../test_helper", File.dirname(__FILE__))
4
+ require "s7n/world"
5
+ require "tmpdir"
6
+
7
+ module S7n
8
+ class WorldTest < Test::Unit::TestCase
9
+ def test_save__not_changed
10
+ world = World.new
11
+ tmpdir = Dir.mktmpdir
12
+ begin
13
+ world.base_dir = tmpdir
14
+ world.master_key = "qwerty"
15
+ world.save
16
+ assert_equal(false, File.file?(world.secrets_path))
17
+ ensure
18
+ FileUtils.remove_entry_secure(tmpdir)
19
+ end
20
+ end
21
+
22
+ def test_save__force
23
+ world = World.new
24
+ tmpdir = Dir.mktmpdir
25
+ begin
26
+ world.base_dir = tmpdir
27
+ world.master_key = "qwerty"
28
+ world.save(true)
29
+ assert_equal(true, File.file?(world.secrets_path))
30
+ ensure
31
+ FileUtils.remove_entry_secure(tmpdir)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ $:.unshift(File.expand_path("../lib", File.dirname(__FILE__)))
2
+
3
+ require "test/unit"
4
+ require "pp"
5
+ require "tempfile"
6
+ require "stringio"
7
+ require "gettext"
8
+
9
+ class Test::Unit::TestCase
10
+ include GetText
11
+ end
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s7n
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kouji Takao
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: test-unit
16
+ requirement: &2153588880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2153588880
25
+ - !ruby/object:Gem::Dependency
26
+ name: shoulda
27
+ requirement: &2153587920 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2153587920
36
+ - !ruby/object:Gem::Dependency
37
+ name: rr
38
+ requirement: &2153577540 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2153577540
47
+ - !ruby/object:Gem::Dependency
48
+ name: gettext
49
+ requirement: &2153572480 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2153572480
58
+ description: s7 (seven) is the secret informations(password, credit number, file,
59
+ etc..) manager.
60
+ email:
61
+ - kouji@takao7.net
62
+ executables:
63
+ - s7ncli
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - .gitignore
68
+ - Gemfile
69
+ - Gemfile.lock
70
+ - LICENCE
71
+ - README.rdoc
72
+ - Rakefile
73
+ - bin/s7ncli
74
+ - lib/s7n.rb
75
+ - lib/s7n/action.rb
76
+ - lib/s7n/attribute.rb
77
+ - lib/s7n/cipher.rb
78
+ - lib/s7n/configuration.rb
79
+ - lib/s7n/entry.rb
80
+ - lib/s7n/entry_collection.rb
81
+ - lib/s7n/entry_template.rb
82
+ - lib/s7n/exception.rb
83
+ - lib/s7n/file.rb
84
+ - lib/s7n/gpass_file.rb
85
+ - lib/s7n/key.rb
86
+ - lib/s7n/message_catalog.rb
87
+ - lib/s7n/s7n_file.rb
88
+ - lib/s7n/s7ncli.rb
89
+ - lib/s7n/s7ncli/attribute_command.rb
90
+ - lib/s7n/s7ncli/command.rb
91
+ - lib/s7n/s7ncli/entry_collection_command.rb
92
+ - lib/s7n/s7ncli/entry_command.rb
93
+ - lib/s7n/s7ncli/option.rb
94
+ - lib/s7n/secret_generator.rb
95
+ - lib/s7n/undo_stack.rb
96
+ - lib/s7n/unicode_data.rb
97
+ - lib/s7n/utils.rb
98
+ - lib/s7n/version.rb
99
+ - lib/s7n/world.rb
100
+ - po/ja/s7n.po
101
+ - po/s7n.pot
102
+ - s7n.gemspec
103
+ - test/s7n/attribute_test.rb
104
+ - test/s7n/gpass_file_test.rb
105
+ - test/s7n/gpass_file_test/passwords.gps.empty
106
+ - test/s7n/gpass_file_test/passwords.gps.one_entry
107
+ - test/s7n/gpass_file_test/passwords.gps.three_entries
108
+ - test/s7n/gpass_file_test/passwords.gps.with_folders
109
+ - test/s7n/secret_generator_test.rb
110
+ - test/s7n/unicode_data_test.rb
111
+ - test/s7n/world_test.rb
112
+ - test/test_helper.rb
113
+ - data/locale/ja/LC_MESSAGES/s7.mo
114
+ - data/locale/ja/LC_MESSAGES/s7n.mo
115
+ homepage: ''
116
+ licenses: []
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: 1.9.3
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ segments:
134
+ - 0
135
+ hash: 645769782418414901
136
+ requirements:
137
+ - Ruby, version 1.9.3 (or newer)
138
+ rubyforge_project: s7n
139
+ rubygems_version: 1.8.10
140
+ signing_key:
141
+ specification_version: 3
142
+ summary: The secret informations manager.
143
+ test_files:
144
+ - test/s7n/attribute_test.rb
145
+ - test/s7n/gpass_file_test.rb
146
+ - test/s7n/gpass_file_test/passwords.gps.empty
147
+ - test/s7n/gpass_file_test/passwords.gps.one_entry
148
+ - test/s7n/gpass_file_test/passwords.gps.three_entries
149
+ - test/s7n/gpass_file_test/passwords.gps.with_folders
150
+ - test/s7n/secret_generator_test.rb
151
+ - test/s7n/unicode_data_test.rb
152
+ - test/s7n/world_test.rb
153
+ - test/test_helper.rb