signore 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -1
- data/gems.locked +13 -2
- data/lib/signore/repo.rb +0 -9
- data/lib/signore/sig_from_stream.rb +2 -4
- data/signore.gemspec +10 -7
- data/test/signore/repo_test.rb +4 -26
- data/test/signore/sig_from_stream_test.rb +10 -0
- data/test/signore/signature_test.rb +3 -3
- data/test/signore/tags_test.rb +3 -0
- metadata +44 -6
- data/.overcommit.yml +0 -4
- data/.tool-versions +0 -1
- data/.travis.yml +0 -12
- data/test/fixtures/signatures.legacy.yml +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3836fca9879726bbdd969adeb450e296799c3bbcbce890d3f00bae4381ae0fde
|
4
|
+
data.tar.gz: 5bbe4c90bd1f80dd63d6062a89f2708f9f92be3f4f69917c0f8fa00cb08454a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5e6381cb3b0067c61c8f8951528c166deeca50b2cdaf00aff640f42b3ab203fe4366925948cf20f0506a8b2a432028933020d1918d46548c9fe90e5a3a4a1b0
|
7
|
+
data.tar.gz: 72170f9b4ae8a52d92ac780fa2a581b87cdc5202cd613ea440506c582b5aefd69515c55f784da530b34201febb915b65e0780c18221bc8242c660ba63a6a6070
|
data/.rubocop.yml
CHANGED
data/gems.locked
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
signore (0.
|
4
|
+
signore (1.0.0)
|
5
5
|
lovely_rufus (~> 1.0)
|
6
|
+
pstore (~> 0.2.0)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
@@ -52,6 +53,7 @@ GEM
|
|
52
53
|
ast (~> 2.4.1)
|
53
54
|
racc
|
54
55
|
prism (1.4.0)
|
56
|
+
pstore (0.2.0)
|
55
57
|
racc (1.8.1)
|
56
58
|
rainbow (3.1.1)
|
57
59
|
rake (13.2.1)
|
@@ -77,11 +79,18 @@ GEM
|
|
77
79
|
rubocop-ast (1.44.1)
|
78
80
|
parser (>= 3.3.7.2)
|
79
81
|
prism (~> 1.4)
|
82
|
+
rubocop-minitest (0.38.0)
|
83
|
+
lint_roller (~> 1.1)
|
84
|
+
rubocop (>= 1.75.0, < 2.0)
|
85
|
+
rubocop-ast (>= 1.38.0, < 2.0)
|
86
|
+
rubocop-rake (0.7.1)
|
87
|
+
lint_roller (~> 1.1)
|
88
|
+
rubocop (>= 1.72.1)
|
80
89
|
ruby-progressbar (1.13.0)
|
81
90
|
unicode-display_width (3.1.4)
|
82
91
|
unicode-emoji (~> 4.0, >= 4.0.4)
|
83
92
|
unicode-emoji (4.0.4)
|
84
|
-
zeitwerk (2.7.
|
93
|
+
zeitwerk (2.7.3)
|
85
94
|
|
86
95
|
PLATFORMS
|
87
96
|
ruby
|
@@ -92,6 +101,8 @@ DEPENDENCIES
|
|
92
101
|
rake (~> 13.0)
|
93
102
|
reek (~> 6.0)
|
94
103
|
rubocop (~> 1.0)
|
104
|
+
rubocop-minitest (~> 0.38.0)
|
105
|
+
rubocop-rake (~> 0.7.0)
|
95
106
|
signore!
|
96
107
|
|
97
108
|
BUNDLED WITH
|
data/lib/signore/repo.rb
CHANGED
@@ -17,7 +17,6 @@ module Signore
|
|
17
17
|
|
18
18
|
def initialize(path: self.class.default_path)
|
19
19
|
@path = path
|
20
|
-
convert if legacy?
|
21
20
|
end
|
22
21
|
|
23
22
|
def <<(signature)
|
@@ -34,14 +33,6 @@ module Signore
|
|
34
33
|
|
35
34
|
attr_reader :path
|
36
35
|
|
37
|
-
def convert
|
38
|
-
self.hashes = hashes.map(&:to_h)
|
39
|
-
end
|
40
|
-
|
41
|
-
def legacy?
|
42
|
-
path.exist? and path.read.include?('Signore::Signature')
|
43
|
-
end
|
44
|
-
|
45
36
|
def hashes
|
46
37
|
store.transaction(true) { store.fetch('signatures', []) }
|
47
38
|
end
|
@@ -3,9 +3,7 @@ require_relative 'tags'
|
|
3
3
|
|
4
4
|
module Signore
|
5
5
|
class SigFromStream
|
6
|
-
def self.call(input, tags: Tags.new)
|
7
|
-
new(input, tags: tags).call
|
8
|
-
end
|
6
|
+
def self.call(input, tags: Tags.new) = new(input, tags:).call
|
9
7
|
|
10
8
|
def initialize(input, tags: Tags.new)
|
11
9
|
@input = input
|
@@ -27,7 +25,7 @@ module Signore
|
|
27
25
|
def get_param(param)
|
28
26
|
puts "\n#{param}?"
|
29
27
|
separator = param == :text ? "\n\n" : "\n"
|
30
|
-
input.gets(separator).strip
|
28
|
+
input.gets(separator).strip.gsub(/(?<=\p{L})'/, '’').tr("'", '‘')
|
31
29
|
end
|
32
30
|
|
33
31
|
def params
|
data/signore.gemspec
CHANGED
@@ -10,20 +10,23 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.license = 'AGPL-3.0-or-later'
|
11
11
|
gem.name = 'signore'
|
12
12
|
gem.summary = 'signore: an email signature manager/randomiser'
|
13
|
-
gem.version = '1.
|
13
|
+
gem.version = '1.1.0'
|
14
14
|
|
15
|
-
gem.required_ruby_version = '~> 3.
|
15
|
+
gem.required_ruby_version = '~> 3.4'
|
16
16
|
|
17
17
|
gem.files = `git ls-files -z`.split "\0"
|
18
18
|
gem.executables = gem.files.grep(%r{^bin/}).map { |path| File.basename(path) }
|
19
19
|
|
20
20
|
gem.add_dependency 'lovely_rufus', '~> 1.0'
|
21
|
+
gem.add_dependency 'pstore', '~> 0.2.0'
|
21
22
|
|
22
|
-
gem.add_development_dependency 'minitest',
|
23
|
-
gem.add_development_dependency 'minitest-focus',
|
24
|
-
gem.add_development_dependency 'rake',
|
25
|
-
gem.add_development_dependency 'reek',
|
26
|
-
gem.add_development_dependency 'rubocop',
|
23
|
+
gem.add_development_dependency 'minitest', '~> 5.6'
|
24
|
+
gem.add_development_dependency 'minitest-focus', '~> 1.1'
|
25
|
+
gem.add_development_dependency 'rake', '~> 13.0'
|
26
|
+
gem.add_development_dependency 'reek', '~> 6.0'
|
27
|
+
gem.add_development_dependency 'rubocop', '~> 1.0'
|
28
|
+
gem.add_development_dependency 'rubocop-minitest', '~> 0.38.0'
|
29
|
+
gem.add_development_dependency 'rubocop-rake', '~> 0.7.0'
|
27
30
|
|
28
31
|
gem.metadata['rubygems_mfa_required'] = 'true'
|
29
32
|
end
|
data/test/signore/repo_test.rb
CHANGED
@@ -31,14 +31,6 @@ module Signore
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
describe '.new' do
|
35
|
-
it 'rewrites legacy file to hashes on first access' do
|
36
|
-
FileUtils.cp Pathname.new('test/fixtures/signatures.legacy.yml'), path
|
37
|
-
Repo.new(path: path)
|
38
|
-
_(path.read).wont_include 'Signore::Signature'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
34
|
describe '#<<' do
|
43
35
|
let(:sig) { Signature.new(text: text) }
|
44
36
|
let(:text) { 'Normaliser Unix c’est comme pasteuriser le camembert.' }
|
@@ -48,12 +40,6 @@ module Signore
|
|
48
40
|
_(path.read).must_include text
|
49
41
|
end
|
50
42
|
|
51
|
-
it 'rewrites legacy YAML files on save' do
|
52
|
-
FileUtils.cp Pathname.new('test/fixtures/signatures.legacy.yml'), path
|
53
|
-
Repo.new(path: path) << sig
|
54
|
-
_(path.read).wont_include 'Signore::Signature'
|
55
|
-
end
|
56
|
-
|
57
43
|
it 'handles edge cases' do
|
58
44
|
sig = Signature.new(author: '000___000')
|
59
45
|
Repo.new(path: path) << sig
|
@@ -62,12 +48,13 @@ module Signore
|
|
62
48
|
|
63
49
|
describe '#empty?' do
|
64
50
|
it 'is true when a repo is empty' do
|
65
|
-
|
51
|
+
assert_predicate Repo.new(path: path), :empty?
|
66
52
|
end
|
67
53
|
|
68
54
|
it 'is false when a repo is not empty' do
|
69
|
-
FileUtils.cp Pathname.new('test/fixtures/signatures.
|
70
|
-
|
55
|
+
FileUtils.cp Pathname.new('test/fixtures/signatures.yml'), path
|
56
|
+
|
57
|
+
refute_predicate Repo.new(path: path), :empty?
|
71
58
|
end
|
72
59
|
end
|
73
60
|
|
@@ -80,15 +67,6 @@ module Signore
|
|
80
67
|
_(sigs.last.subject).must_equal 'Star Wars ending explained'
|
81
68
|
end
|
82
69
|
|
83
|
-
it 'keeps working with legacy YAML files' do
|
84
|
-
legacy_path = Pathname.new('test/fixtures/signatures.legacy.yml')
|
85
|
-
temp_path = Pathname.new(Tempfile.new.path)
|
86
|
-
FileUtils.cp legacy_path, temp_path
|
87
|
-
legacy_repo = Repo.new(path: temp_path)
|
88
|
-
new_repo = Repo.new(path: Pathname.new('test/fixtures/signatures.yml'))
|
89
|
-
_(legacy_repo.sigs).must_equal new_repo.sigs
|
90
|
-
end
|
91
|
-
|
92
70
|
it 'doesn’t blow up if the path is missing' do
|
93
71
|
tempdir = Dir.mktmpdir
|
94
72
|
path = Pathname.new("#{tempdir}/some_intermediate_dir/sigs.yml")
|
@@ -51,6 +51,16 @@ module Signore
|
|
51
51
|
end
|
52
52
|
_(sig).must_equal Signature.new(author: 'Patrick Ewing', text: text)
|
53
53
|
end
|
54
|
+
|
55
|
+
it 'replaces apostrophes with proper quotation marks' do
|
56
|
+
simple = "There's no 'i' in 'denial'."
|
57
|
+
author = 'ʎoɟ ʎɹoɔ'
|
58
|
+
input = StringIO.new("#{simple}\n\n#{author}\n\n\n")
|
59
|
+
sig = nil
|
60
|
+
capture_io { sig = SigFromStream.call input }
|
61
|
+
text = 'There’s no ‘i’ in ‘denial’.'
|
62
|
+
_(sig).must_equal Signature.new(author:, text:)
|
63
|
+
end
|
54
64
|
end
|
55
65
|
end
|
56
66
|
end
|
@@ -42,11 +42,11 @@ module Signore # rubocop:disable Metrics/ModuleLength
|
|
42
42
|
|
43
43
|
describe '#empty?' do
|
44
44
|
it 'is true when the Signature is a null object' do
|
45
|
-
|
45
|
+
assert_predicate Signature.new, :empty?
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'is false when the Signature has some text' do
|
49
|
-
|
49
|
+
refute_predicate Signature.new(text: 'Node.jk'), :empty?
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -62,7 +62,7 @@ module Signore # rubocop:disable Metrics/ModuleLength
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'removes non-existing keys' do
|
65
|
-
|
65
|
+
assert_predicate Signature.new.to_h, :empty?
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
data/test/signore/tags_test.rb
CHANGED
@@ -3,9 +3,11 @@ require_relative '../../lib/signore/tags'
|
|
3
3
|
|
4
4
|
module Signore
|
5
5
|
describe Tags do
|
6
|
+
# rubocop:disable Minitest/AssertMatch, Minitest/RefuteMatch
|
6
7
|
describe '#match?' do
|
7
8
|
it 'is a predicate whether the Tags match the given list of tags' do
|
8
9
|
tags = %w[programming tech]
|
10
|
+
|
9
11
|
assert Tags.new.match?([])
|
10
12
|
assert Tags.new(forbidden: %w[fnord]).match?([])
|
11
13
|
assert Tags.new.match?(tags)
|
@@ -16,6 +18,7 @@ module Signore
|
|
16
18
|
refute Tags.new(forbidden: %w[tech], required: %w[tech]).match?(tags)
|
17
19
|
end
|
18
20
|
end
|
21
|
+
# rubocop:enable Minitest/AssertMatch, Minitest/RefuteMatch
|
19
22
|
|
20
23
|
describe '#to_s' do
|
21
24
|
it 'returns a CLI-like representation of the Tags' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Szotkowski
|
@@ -23,6 +23,20 @@ dependencies:
|
|
23
23
|
- - "~>"
|
24
24
|
- !ruby/object:Gem::Version
|
25
25
|
version: '1.0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: pstore
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.2.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.2.0
|
26
40
|
- !ruby/object:Gem::Dependency
|
27
41
|
name: minitest
|
28
42
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,6 +107,34 @@ dependencies:
|
|
93
107
|
- - "~>"
|
94
108
|
- !ruby/object:Gem::Version
|
95
109
|
version: '1.0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rubocop-minitest
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.38.0
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.38.0
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: rubocop-rake
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 0.7.0
|
131
|
+
type: :development
|
132
|
+
prerelease: false
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 0.7.0
|
96
138
|
description: signore helps manage email signatures and select random ones based on
|
97
139
|
their tags
|
98
140
|
email: chastell@chastell.net
|
@@ -101,11 +143,8 @@ executables:
|
|
101
143
|
extensions: []
|
102
144
|
extra_rdoc_files: []
|
103
145
|
files:
|
104
|
-
- ".overcommit.yml"
|
105
146
|
- ".reek.yml"
|
106
147
|
- ".rubocop.yml"
|
107
|
-
- ".tool-versions"
|
108
|
-
- ".travis.yml"
|
109
148
|
- LICENCE
|
110
149
|
- README.md
|
111
150
|
- Rakefile
|
@@ -122,7 +161,6 @@ files:
|
|
122
161
|
- lib/signore/tags.rb
|
123
162
|
- signore.gemspec
|
124
163
|
- test/fixtures/nosignatures.yml
|
125
|
-
- test/fixtures/signatures.legacy.yml
|
126
164
|
- test/fixtures/signatures.yml
|
127
165
|
- test/fixtures/wrapper.yml
|
128
166
|
- test/signore/cli_test.rb
|
@@ -145,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
183
|
requirements:
|
146
184
|
- - "~>"
|
147
185
|
- !ruby/object:Gem::Version
|
148
|
-
version: '3.
|
186
|
+
version: '3.4'
|
149
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
188
|
requirements:
|
151
189
|
- - ">="
|
data/.overcommit.yml
DELETED
data/.tool-versions
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby 2.6.1
|
data/.travis.yml
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
signatures:
|
2
|
-
- !ruby/struct:Signore::Signature
|
3
|
-
text: You do have to be mad to work here, but it doesn’t help.
|
4
|
-
author: Gary Barnes
|
5
|
-
source: asr
|
6
|
-
tags: [tech, work]
|
7
|
-
- !ruby/struct:Signore::Signature
|
8
|
-
text: More gangland camp than neo-noir.
|
9
|
-
author: Nicholas Christopher
|
10
|
-
subject: on Pulp Fiction
|
11
|
-
- !ruby/struct:Signore::Signature
|
12
|
-
text: // sometimes I believe compiler ignores all my comments
|
13
|
-
tags: [programming, tech]
|
14
|
-
- !ruby/struct:Signore::Signature
|
15
|
-
text: Bruce Schneier knows Alice and Bob’s shared secret.
|
16
|
-
source: Bruce Schneier Facts
|
17
|
-
tags: [security, tech]
|
18
|
-
- !ruby/struct:Signore::Signature
|
19
|
-
text: stay-at-home executives vs. wallstreet dads
|
20
|
-
author: kodz
|
21
|
-
- !ruby/struct:Signore::Signature
|
22
|
-
text: Amateur fighter pilot ignores orders, listens to the voices in his head and slaughters thousands.
|
23
|
-
subject: Star Wars ending explained
|