signore 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.reek +0 -8
- data/.rubocop.yml +7 -1
- data/.ruby-version +1 -1
- data/.travis.yml +6 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +48 -60
- data/README.md +1 -8
- data/Rakefile +3 -0
- data/bin/signore +1 -0
- data/certs/chastell.pem +21 -0
- data/lib/signore/cli.rb +14 -7
- data/lib/signore/mapper.rb +2 -0
- data/lib/signore/repo.rb +22 -11
- data/lib/signore/settings.rb +6 -10
- data/lib/signore/sig_finder.rb +11 -3
- data/lib/signore/sig_from_stream.rb +14 -8
- data/lib/signore/signature.rb +13 -6
- data/lib/signore/tags.rb +6 -1
- data/lib/signore.rb +2 -1
- data/signore.gemspec +16 -7
- data/test/fixtures/nosignatures.yml +2 -0
- data/test/fixtures/signatures.legacy.yml +4 -4
- data/test/fixtures/signatures.yml +3 -3
- data/test/signore/cli_test.rb +18 -0
- data/test/signore/mapper_test.rb +2 -0
- data/test/signore/repo_test.rb +30 -7
- data/test/signore/settings_test.rb +2 -0
- data/test/signore/sig_finder_test.rb +14 -10
- data/test/signore/sig_from_stream_test.rb +5 -4
- data/test/signore/signature_test.rb +22 -11
- data/test/signore/tags_test.rb +14 -2
- data/test/test_helper.rb +2 -0
- data.tar.gz.sig +1 -0
- metadata +38 -29
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1a5292cb375e7c9e5a675459999789ef30c0dfd
|
4
|
+
data.tar.gz: b8c56a2de499328fd5eda249ba20f88f2ddb89db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb841f115b6c3368e4c26871e98873dfb344f708f81a7cdf644cd0a8a098559ed702e744ffd8938b748d7ba6e4db74d459124a8ecfbdec27f77a94b10861300a
|
7
|
+
data.tar.gz: 1c5e087bd48151c54c9c118c1d7e44f42c1f8f20abdf6f79e230d98c0de27aedbdee6f6419952d06d829365692e525f28c82283ae9b5a2cdfa0dd8507eaf3e77
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/.reek
CHANGED
data/.rubocop.yml
CHANGED
@@ -4,8 +4,14 @@ Style/AndOr:
|
|
4
4
|
Style/Documentation:
|
5
5
|
Enabled: false
|
6
6
|
|
7
|
+
Style/EmptyCaseCondition:
|
8
|
+
Enabled: false
|
9
|
+
|
7
10
|
Style/Not:
|
8
11
|
Enabled: false
|
9
12
|
|
10
|
-
Style/
|
13
|
+
Style/TrailingCommaInArguments:
|
14
|
+
EnforcedStyleForMultiline: comma
|
15
|
+
|
16
|
+
Style/TrailingCommaInLiteral:
|
11
17
|
EnforcedStyleForMultiline: comma
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.3
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,77 +2,65 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
signore (0.4.2)
|
5
|
-
lovely_rufus (~>
|
6
|
-
private_attr (~> 1.1)
|
5
|
+
lovely_rufus (~> 1.0)
|
7
6
|
|
8
7
|
GEM
|
9
8
|
remote: https://rubygems.org/
|
10
9
|
specs:
|
11
|
-
|
12
|
-
|
10
|
+
ast (2.3.0)
|
11
|
+
axiom-types (0.1.1)
|
12
|
+
descendants_tracker (~> 0.0.4)
|
13
13
|
ice_nine (~> 0.11.0)
|
14
|
-
|
15
|
-
ast (2.0.0)
|
16
|
-
astrolabe (1.3.1)
|
17
|
-
parser (~> 2.2)
|
14
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
18
15
|
bogus (0.1.6)
|
19
16
|
dependor (>= 0.0.4)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
equalizer (~> 0.0.9)
|
17
|
+
codeclimate-engine-rb (0.3.1)
|
18
|
+
virtus (~> 1.0)
|
19
|
+
coercible (1.0.0)
|
20
|
+
descendants_tracker (~> 0.0.1)
|
25
21
|
dependor (1.0.1)
|
26
|
-
|
27
|
-
equalizer (0.0.11)
|
28
|
-
ffi (1.9.10)
|
29
|
-
hitimes (1.2.2)
|
30
|
-
ice_nine (0.11.1)
|
31
|
-
listen (2.10.1)
|
32
|
-
celluloid (~> 0.16.0)
|
33
|
-
rb-fsevent (>= 0.9.3)
|
34
|
-
rb-inotify (>= 0.9)
|
35
|
-
lovely_rufus (0.3.1)
|
36
|
-
private_attr (~> 1.0)
|
37
|
-
memoizable (0.4.2)
|
22
|
+
descendants_tracker (0.0.4)
|
38
23
|
thread_safe (~> 0.3, >= 0.3.1)
|
39
|
-
|
40
|
-
|
24
|
+
equalizer (0.0.11)
|
25
|
+
ffi (1.9.14)
|
26
|
+
ice_nine (0.11.2)
|
27
|
+
listen (3.1.5)
|
28
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
29
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
30
|
+
ruby_dep (~> 1.2)
|
31
|
+
lovely_rufus (1.0.1)
|
32
|
+
minitest (5.9.0)
|
33
|
+
minitest-focus (1.1.2)
|
41
34
|
minitest (>= 4, < 6)
|
42
|
-
parser (2.
|
43
|
-
ast (
|
35
|
+
parser (2.3.1.2)
|
36
|
+
ast (~> 2.2)
|
44
37
|
powerpack (0.1.1)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
rb-fsevent (0.9.5)
|
50
|
-
rb-inotify (0.9.5)
|
38
|
+
rainbow (2.1.0)
|
39
|
+
rake (11.2.2)
|
40
|
+
rb-fsevent (0.9.7)
|
41
|
+
rb-inotify (0.9.7)
|
51
42
|
ffi (>= 0.5.0)
|
52
|
-
reek (
|
53
|
-
|
43
|
+
reek (4.4.0)
|
44
|
+
codeclimate-engine-rb (~> 0.3.1)
|
45
|
+
parser (~> 2.3.1, >= 2.3.1.2)
|
54
46
|
rainbow (~> 2.0)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
astrolabe (~> 1.3)
|
60
|
-
parser (>= 2.2.2.5, < 3.0)
|
47
|
+
rerun (0.11.0)
|
48
|
+
listen (~> 3.0)
|
49
|
+
rubocop (0.42.0)
|
50
|
+
parser (>= 2.3.1.1, < 3.0)
|
61
51
|
powerpack (~> 0.1)
|
62
52
|
rainbow (>= 1.99.1, < 3.0)
|
63
|
-
ruby-progressbar (~> 1.
|
64
|
-
|
53
|
+
ruby-progressbar (~> 1.7)
|
54
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
55
|
+
ruby-progressbar (1.8.1)
|
56
|
+
ruby_dep (1.4.0)
|
65
57
|
thread_safe (0.3.5)
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
diff-lcs (~> 1.2.5)
|
73
|
-
equalizer (~> 0.0.9)
|
74
|
-
parser (~> 2.2.2)
|
75
|
-
procto (~> 0.0.2)
|
58
|
+
unicode-display_width (1.1.0)
|
59
|
+
virtus (1.0.5)
|
60
|
+
axiom-types (~> 0.1)
|
61
|
+
coercible (~> 1.0)
|
62
|
+
descendants_tracker (~> 0.0, >= 0.0.3)
|
63
|
+
equalizer (~> 0.0, >= 0.0.9)
|
76
64
|
|
77
65
|
PLATFORMS
|
78
66
|
ruby
|
@@ -81,11 +69,11 @@ DEPENDENCIES
|
|
81
69
|
bogus (~> 0.1.3)
|
82
70
|
minitest (~> 5.6)
|
83
71
|
minitest-focus (~> 1.1)
|
84
|
-
rake (~>
|
85
|
-
reek (~>
|
86
|
-
rerun (~> 0.
|
87
|
-
rubocop (~> 0.
|
72
|
+
rake (~> 11.0)
|
73
|
+
reek (~> 4.0)
|
74
|
+
rerun (~> 0.11.0)
|
75
|
+
rubocop (~> 0.42.0)
|
88
76
|
signore!
|
89
77
|
|
90
78
|
BUNDLED WITH
|
91
|
-
1.
|
79
|
+
1.12.1
|
data/README.md
CHANGED
@@ -84,13 +84,6 @@ signore stores the signatures in a YAML file (for ease of editing, if such a nee
|
|
84
84
|
|
85
85
|
|
86
86
|
|
87
|
-
Requirements
|
88
|
-
------------
|
89
|
-
|
90
|
-
signore requires Ruby 1.9 and works best with Ruby 1.9.2 compiled with Psych (for sanity when hand-editing the YAML file, if it happens to sport non-US-ASCII characters).
|
91
|
-
|
92
|
-
|
93
|
-
|
94
87
|
---
|
95
88
|
|
96
|
-
© MMIX-
|
89
|
+
© MMIX-MMXV Piotr Szotkowski <chastell@chastell.net>, licensed under AGPL-3.0 (see LICENCE)
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake/testtask'
|
2
4
|
require 'reek/rake/task'
|
3
5
|
require 'rubocop/rake_task'
|
@@ -11,6 +13,7 @@ end
|
|
11
13
|
|
12
14
|
Reek::Rake::Task.new do |task|
|
13
15
|
task.fail_on_error = false
|
16
|
+
task.reek_opts = '--no-wiki-links'
|
14
17
|
end
|
15
18
|
|
16
19
|
RuboCop::RakeTask.new do |task|
|
data/bin/signore
CHANGED
data/certs/chastell.pem
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBCMREwDwYDVQQDDAhjaGFz
|
3
|
+
dGVsbDEYMBYGCgmSJomT8ixkARkWCGNoYXN0ZWxsMRMwEQYKCZImiZPyLGQBGRYD
|
4
|
+
bmV0MB4XDTE1MTEwOTIxMTMwOVoXDTE2MTEwODIxMTMwOVowQjERMA8GA1UEAwwI
|
5
|
+
Y2hhc3RlbGwxGDAWBgoJkiaJk/IsZAEZFghjaGFzdGVsbDETMBEGCgmSJomT8ixk
|
6
|
+
ARkWA25ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcf6OF3mi6D
|
7
|
+
UedwY2A6fYEQF2bJVYQxV8fWHA5Q2R6y7Eg0hM80Q0yod7pJxlJTpnAPzuIl1u4y
|
8
|
+
hhfa/Vz0u6PVRhBYQ/Bcj9UEwgiXcy3P4ybINDeDt7GRVs3R9rRoT1aAsb5RCS0z
|
9
|
+
u/JKS2RcAS5XPpFow3Cfs5A/pM2NLsR/zeiaKg8rRB59A/tWw26F+YTaWfPAPFGv
|
10
|
+
d6af29NKWQh+EPkX1JwwtSwjKfVOeFr0csC6QLWKpp1z/7Lla8d3px426Ccjca0I
|
11
|
+
5VwtQeZ5LClTjqaYyH7vSojpOtgRuvVKspZ2jfe1KZq9jz//a/rSUrFcPlEQuXQp
|
12
|
+
i8E3TKoJrW0CAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
|
13
|
+
BBYEFLi/J921Nb53s8GKtKptC08QmHnwMCAGA1UdEQQZMBeBFWNoYXN0ZWxsQGNo
|
14
|
+
YXN0ZWxsLm5ldDAgBgNVHRIEGTAXgRVjaGFzdGVsbEBjaGFzdGVsbC5uZXQwDQYJ
|
15
|
+
KoZIhvcNAQEFBQADggEBAA+rUbXujzqDv8WE7kkiJadQhxldq/cRhaJDMKSWF3/H
|
16
|
+
6PL/Me8zq8Ok7/pQtxBvAhKcy3DdsH0q5pyPHoMrYySxEo9lNXLvwCPsi21rR53b
|
17
|
+
2w5rBytYCxrhsXISKwCkBYwVwtICafZ8VtRbD3pgnsPv+9NYJJ/rN4Z34doWM7oK
|
18
|
+
CAfY6o0LcY+qmvqLvqpweyoO73wkfKGUSz1a09dJfAP5aIREQDvpYrWx2ZoDrAct
|
19
|
+
srwnZ6g5uTvNbd0I1SnvnCJJ5y5iPvJIBlnGb3QZ77y2XXCOy3Yc0rjK7A8bQt5t
|
20
|
+
xOlyYMPKhWx2IqEip+J7PBpBwMnxIPhTcNlFOj8mSa0=
|
21
|
+
-----END CERTIFICATE-----
|
data/lib/signore/cli.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'forwardable'
|
2
4
|
require_relative 'repo'
|
3
5
|
require_relative 'settings'
|
@@ -16,22 +18,27 @@ module Signore
|
|
16
18
|
|
17
19
|
def run(input: $stdin)
|
18
20
|
case action
|
19
|
-
when 'prego' then
|
21
|
+
when 'prego' then prego
|
20
22
|
when 'pronto' then puts create_sig_from(input)
|
21
23
|
else abort 'usage: signore prego|pronto [tag, …]'
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
private_attr_reader :repo, :settings
|
26
|
-
|
27
27
|
private
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
attr_reader :repo, :settings
|
30
|
+
|
31
|
+
def prego
|
32
|
+
sig = repo.find(tags: tags)
|
33
|
+
puts case
|
34
|
+
when repo.empty? then 'No signatures found.'
|
35
|
+
when sig.empty? then "Sadly no signatures are tagged #{tags}."
|
36
|
+
else sig
|
37
|
+
end
|
31
38
|
end
|
32
39
|
|
33
|
-
def
|
34
|
-
|
40
|
+
def create_sig_from(input)
|
41
|
+
SigFromStream.sig_from(input, tags: tags).tap { |sig| repo << sig }
|
35
42
|
end
|
36
43
|
end
|
37
44
|
end
|
data/lib/signore/mapper.rb
CHANGED
data/lib/signore/repo.rb
CHANGED
@@ -1,40 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
1
4
|
require 'yaml/store'
|
2
5
|
require_relative 'mapper'
|
3
6
|
require_relative 'settings'
|
4
7
|
require_relative 'sig_finder'
|
5
|
-
require_relative 'signature'
|
6
8
|
require_relative 'tags'
|
7
9
|
|
8
10
|
module Signore
|
9
11
|
class Repo
|
10
|
-
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
def initialize(path: Settings.new.repo_path, sig_finder: SigFinder.new)
|
11
15
|
@path = path
|
12
16
|
@sig_finder = sig_finder
|
17
|
+
convert if legacy?
|
13
18
|
end
|
14
19
|
|
15
20
|
def <<(sig)
|
16
|
-
|
17
|
-
persist
|
21
|
+
store.transaction { (store['signatures'] ||= []) << Mapper.to_h(sig) }
|
18
22
|
end
|
19
23
|
|
24
|
+
delegate empty?: :sigs
|
25
|
+
|
20
26
|
def find(tags: Tags.new)
|
21
27
|
sig_finder.find(sigs, tags: tags)
|
22
28
|
end
|
23
29
|
|
24
30
|
def sigs
|
25
31
|
@sigs ||= begin
|
26
|
-
|
27
|
-
|
32
|
+
hashes = store.transaction(true) { store.fetch('signatures', []) }
|
33
|
+
hashes.map(&Mapper.method(:from_h))
|
28
34
|
end
|
29
35
|
end
|
30
36
|
|
31
|
-
private_attr_reader :path, :sig_finder
|
32
|
-
|
33
37
|
private
|
34
38
|
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
attr_reader :path, :sig_finder
|
40
|
+
|
41
|
+
def convert
|
42
|
+
store.transaction do
|
43
|
+
store['signatures'] = store.fetch('signatures', []).map(&:to_h)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def legacy?
|
48
|
+
path.exist? and path.read.include?('Signore::Signature')
|
38
49
|
end
|
39
50
|
|
40
51
|
def store
|
data/lib/signore/settings.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'pathname'
|
2
4
|
require_relative 'tags'
|
3
5
|
|
@@ -11,26 +13,20 @@ module Signore
|
|
11
13
|
args.first
|
12
14
|
end
|
13
15
|
|
16
|
+
# :reek:UtilityFunction
|
14
17
|
def repo_path
|
15
18
|
dir = ENV.fetch('XDG_DATA_HOME') { File.expand_path('~/.local/share') }
|
16
19
|
Pathname.new("#{dir}/signore/signatures.yml")
|
17
20
|
end
|
18
21
|
|
19
22
|
def tags
|
20
|
-
|
23
|
+
negated, required = tag_names.partition { |name| name.start_with?('~') }
|
24
|
+
Tags.new(forbidden: negated.map { |neg| neg[1..-1] }, required: required)
|
21
25
|
end
|
22
26
|
|
23
|
-
private_attr_reader :args
|
24
|
-
|
25
27
|
private
|
26
28
|
|
27
|
-
|
28
|
-
tag_names.select { |tag| tag.start_with?('~') }.map { |tag| tag[1..-1] }
|
29
|
-
end
|
30
|
-
|
31
|
-
def required
|
32
|
-
tag_names.reject { |tag| tag.start_with?('~') }
|
33
|
-
end
|
29
|
+
attr_reader :args
|
34
30
|
|
35
31
|
def tag_names
|
36
32
|
args[1..-1] or []
|
data/lib/signore/sig_finder.rb
CHANGED
@@ -1,13 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'signature'
|
2
4
|
require_relative 'tags'
|
3
5
|
|
4
6
|
module Signore
|
5
|
-
|
6
|
-
|
7
|
+
class SigFinder
|
8
|
+
def initialize(random: Random.new)
|
9
|
+
@random = random
|
10
|
+
end
|
7
11
|
|
8
|
-
def find(sigs,
|
12
|
+
def find(sigs, tags: Tags.new)
|
9
13
|
shuffled = sigs.shuffle(random: random)
|
10
14
|
shuffled.find(-> { Signature.new }) { |sig| tags.match?(sig.tags) }
|
11
15
|
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :random
|
12
20
|
end
|
13
21
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'signature'
|
2
4
|
require_relative 'tags'
|
3
5
|
|
4
6
|
module Signore
|
5
7
|
class SigFromStream
|
6
|
-
Params = Struct.new(*%i(text author subject source))
|
7
|
-
|
8
8
|
def self.sig_from(input, tags: Tags.new)
|
9
9
|
new(input, tags: tags).to_sig
|
10
10
|
end
|
@@ -20,19 +20,25 @@ module Signore
|
|
20
20
|
text: params.text)
|
21
21
|
end
|
22
22
|
|
23
|
-
private_attr_reader :input, :tags
|
24
|
-
|
25
23
|
private
|
26
24
|
|
25
|
+
attr_reader :input, :tags
|
26
|
+
|
27
|
+
Params = Struct.new(*%i(text author subject source))
|
28
|
+
|
27
29
|
def get_param(param)
|
28
30
|
puts "#{param}?"
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
param == :text ? multiline : input.gets.strip
|
32
|
+
end
|
33
|
+
|
34
|
+
def multiline
|
35
|
+
value = ''
|
36
|
+
value += input.gets until value.lines.to_a.last == "\n"
|
37
|
+
value.strip
|
32
38
|
end
|
33
39
|
|
34
40
|
def params
|
35
|
-
@params ||= Params.new(*Params.members.map
|
41
|
+
@params ||= Params.new(*Params.members.map(&method(:get_param)))
|
36
42
|
end
|
37
43
|
end
|
38
44
|
end
|
data/lib/signore/signature.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'lovely_rufus'
|
2
4
|
|
3
5
|
module Signore
|
4
6
|
Signature = Struct.new(*%i(text author source subject tags)) do
|
5
|
-
def initialize(author:
|
7
|
+
def initialize(author: '', source: '', subject: '', tags: [], text: '')
|
6
8
|
super text, author, source, subject, tags
|
7
|
-
|
9
|
+
end
|
10
|
+
|
11
|
+
def empty?
|
12
|
+
to_s.empty?
|
8
13
|
end
|
9
14
|
|
10
15
|
undef text if defined?(:text)
|
@@ -13,7 +18,9 @@ module Signore
|
|
13
18
|
end
|
14
19
|
|
15
20
|
def to_h
|
16
|
-
super.map { |key, val| [key.to_s, val] }.to_h.keep_if
|
21
|
+
super.map { |key, val| [key.to_s, val] }.to_h.keep_if do |_, value|
|
22
|
+
value and not value.empty?
|
23
|
+
end
|
17
24
|
end
|
18
25
|
|
19
26
|
def to_s
|
@@ -27,12 +34,12 @@ module Signore
|
|
27
34
|
|
28
35
|
def indent_size_for(text)
|
29
36
|
indent = text.split("\n").map(&:size).max - meta.size - 2
|
30
|
-
indent
|
37
|
+
indent.negative? ? 0 : indent
|
31
38
|
end
|
32
39
|
|
33
40
|
def meta
|
34
|
-
stem = [author, subject].
|
35
|
-
|
41
|
+
stem = [author, subject].reject(&:empty?).join(' ')
|
42
|
+
[stem, source].reject(&:empty?).join(', ')
|
36
43
|
end
|
37
44
|
|
38
45
|
def meta_for(text)
|
data/lib/signore/tags.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Signore
|
2
4
|
Tags = Struct.new(:forbidden, :required) do
|
3
5
|
def initialize(forbidden: [], required: [])
|
@@ -5,8 +7,11 @@ module Signore
|
|
5
7
|
end
|
6
8
|
|
7
9
|
def match?(sig_tags)
|
8
|
-
sig_tags ||= []
|
9
10
|
(required & sig_tags) == required and (forbidden & sig_tags).empty?
|
10
11
|
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
(required + forbidden.map { |tag| '~' + tag }).join(' ')
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
data/lib/signore.rb
CHANGED
data/signore.gemspec
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
require 'pathname'
|
5
|
+
|
1
6
|
Gem::Specification.new do |gem|
|
2
7
|
gem.author = 'Piotr Szotkowski'
|
3
8
|
gem.description = 'signore helps manage email signatures and select ' \
|
@@ -7,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
7
12
|
gem.license = 'AGPL-3.0'
|
8
13
|
gem.name = 'signore'
|
9
14
|
gem.summary = 'signore: an email signature manager/randomiser'
|
10
|
-
gem.version = '0.
|
15
|
+
gem.version = '0.5.0'
|
11
16
|
|
12
17
|
gem.required_ruby_version = '~> 2.1'
|
13
18
|
|
@@ -15,14 +20,18 @@ Gem::Specification.new do |gem|
|
|
15
20
|
gem.executables = gem.files.grep(%r{^bin/}).map { |path| File.basename(path) }
|
16
21
|
gem.test_files = gem.files.grep(%r{^test/.*\.rb$})
|
17
22
|
|
18
|
-
gem.
|
19
|
-
|
23
|
+
gem.cert_chain = ['certs/chastell.pem']
|
24
|
+
if Pathname.new($PROGRAM_NAME).basename == Pathname.new('gem')
|
25
|
+
gem.signing_key = Pathname.new('~/.ssh/gem-private_key.pem').expand_path
|
26
|
+
end
|
27
|
+
|
28
|
+
gem.add_dependency 'lovely_rufus', '~> 1.0'
|
20
29
|
|
21
30
|
gem.add_development_dependency 'bogus', '~> 0.1.3'
|
22
31
|
gem.add_development_dependency 'minitest', '~> 5.6'
|
23
32
|
gem.add_development_dependency 'minitest-focus', '~> 1.1'
|
24
|
-
gem.add_development_dependency 'rake', '~>
|
25
|
-
gem.add_development_dependency 'reek', '~>
|
26
|
-
gem.add_development_dependency 'rerun', '~> 0.
|
27
|
-
gem.add_development_dependency 'rubocop', '~> 0.
|
33
|
+
gem.add_development_dependency 'rake', '~> 11.0'
|
34
|
+
gem.add_development_dependency 'reek', '~> 4.0'
|
35
|
+
gem.add_development_dependency 'rerun', '~> 0.11.0'
|
36
|
+
gem.add_development_dependency 'rubocop', '~> 0.42.0'
|
28
37
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
signatures:
|
2
|
-
- !ruby/struct:Signore::Signature
|
3
|
-
text: She was good at playing abstract confusion in the same way a midget is good at being short.
|
4
|
-
author: Clive James
|
5
|
-
subject: on Marilyn Monroe
|
6
2
|
- !ruby/struct:Signore::Signature
|
7
3
|
text: You do have to be mad to work here, but it doesn’t help.
|
8
4
|
author: Gary Barnes
|
9
5
|
source: asr
|
10
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
11
|
- !ruby/struct:Signore::Signature
|
12
12
|
text: // sometimes I believe compiler ignores all my comments
|
13
13
|
tags: [programming, tech]
|
@@ -1,11 +1,11 @@
|
|
1
1
|
signatures:
|
2
|
-
- text: She was good at playing abstract confusion in the same way a midget is good at being short.
|
3
|
-
author: Clive James
|
4
|
-
subject: on Marilyn Monroe
|
5
2
|
- text: You do have to be mad to work here, but it doesn’t help.
|
6
3
|
author: Gary Barnes
|
7
4
|
source: asr
|
8
5
|
tags: [tech, work]
|
6
|
+
- text: More gangland camp than neo-noir.
|
7
|
+
author: Nicholas Christopher
|
8
|
+
subject: on Pulp Fiction
|
9
9
|
- text: // sometimes I believe compiler ignores all my comments
|
10
10
|
tags: [programming, tech]
|
11
11
|
- text: Bruce Schneier knows Alice and Bob’s shared secret.
|
data/test/signore/cli_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'pathname'
|
2
4
|
require 'stringio'
|
3
5
|
require 'tempfile'
|
@@ -37,6 +39,22 @@ module Signore
|
|
37
39
|
[Gary Barnes, asr]
|
38
40
|
end
|
39
41
|
end
|
42
|
+
|
43
|
+
it 'tells the user if no signatures are found' do
|
44
|
+
path = Pathname.new('test/fixtures/nosignatures.yml')
|
45
|
+
repo = Repo.new(path: path)
|
46
|
+
args = %w(prego)
|
47
|
+
out = capture_io { CLI.new(args, repo: repo).run }.first
|
48
|
+
_(out).must_include 'No signatures found.'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'tells the user if no signatures with selected tag are found' do
|
52
|
+
path = Pathname.new('test/fixtures/signatures.yml')
|
53
|
+
repo = Repo.new(path: path)
|
54
|
+
args = %w(prego esse ~percipi)
|
55
|
+
out = capture_io { CLI.new(args, repo: repo).run }.first
|
56
|
+
_(out).must_include 'Sadly no signatures are tagged esse ~percipi.'
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
describe 'pronto' do
|
data/test/signore/mapper_test.rb
CHANGED
data/test/signore/repo_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'pathname'
|
3
5
|
require 'tempfile'
|
@@ -9,8 +11,17 @@ require_relative '../../lib/signore/tags'
|
|
9
11
|
|
10
12
|
module Signore
|
11
13
|
describe Repo do
|
14
|
+
let(:path) { Pathname.new(Tempfile.new('').path) }
|
15
|
+
|
16
|
+
describe '.new' do
|
17
|
+
it 'rewrites legacy file to hashes on first access' do
|
18
|
+
FileUtils.cp Pathname.new('test/fixtures/signatures.legacy.yml'), path
|
19
|
+
Repo.new(path: path)
|
20
|
+
_(path.read).wont_include 'Signore::Signature'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
12
24
|
describe '#<<' do
|
13
|
-
let(:path) { Pathname.new(Tempfile.new('').path) }
|
14
25
|
let(:sig) { Signature.new(text: text) }
|
15
26
|
let(:text) { 'Normaliser Unix c’est comme pasteuriser le camembert.' }
|
16
27
|
|
@@ -26,10 +37,21 @@ module Signore
|
|
26
37
|
end
|
27
38
|
end
|
28
39
|
|
40
|
+
describe '#empty?' do
|
41
|
+
it 'is true when a repo is empty' do
|
42
|
+
assert Repo.new(path: path).empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'is false when a repo is not empty' do
|
46
|
+
FileUtils.cp Pathname.new('test/fixtures/signatures.legacy.yml'), path
|
47
|
+
refute Repo.new(path: path).empty?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
29
51
|
describe '#find' do
|
30
52
|
let(:path) { Pathname.new('test/fixtures/signatures.yml') }
|
31
53
|
let(:repo) { Repo.new(path: path, sig_finder: sig_finder) }
|
32
|
-
let(:sig_finder) { fake(
|
54
|
+
let(:sig_finder) { fake(SigFinder) }
|
33
55
|
let(:sigs) { repo.sigs }
|
34
56
|
let(:store) { YAML::Store.new(path) }
|
35
57
|
|
@@ -39,9 +61,9 @@ module Signore
|
|
39
61
|
end
|
40
62
|
|
41
63
|
it 'returns a random signature based on required and forbidden tags' do
|
42
|
-
tags = Tags.new(forbidden: %w(
|
43
|
-
stub(sig_finder).find(sigs, tags: tags) { sigs.
|
44
|
-
_(repo.find(tags: tags)).must_equal sigs.
|
64
|
+
tags = Tags.new(forbidden: %w(programming security), required: %w(tech))
|
65
|
+
stub(sig_finder).find(sigs, tags: tags) { sigs.first }
|
66
|
+
_(repo.find(tags: tags)).must_equal sigs.first
|
45
67
|
end
|
46
68
|
|
47
69
|
it 'doesn’t blow up if the path is missing' do
|
@@ -55,7 +77,8 @@ module Signore
|
|
55
77
|
end
|
56
78
|
|
57
79
|
it 'keeps working with legacy YAML files' do
|
58
|
-
path = Pathname.new(
|
80
|
+
path = Pathname.new(Tempfile.new('').path)
|
81
|
+
FileUtils.cp Pathname.new('test/fixtures/signatures.legacy.yml'), path
|
59
82
|
repo = Repo.new(path: path, sig_finder: sig_finder)
|
60
83
|
stub(sig_finder).find(sigs, tags: Tags.new) { sigs.last }
|
61
84
|
_(repo.find).must_equal sigs.last
|
@@ -67,7 +90,7 @@ module Signore
|
|
67
90
|
path = Pathname.new('test/fixtures/signatures.yml')
|
68
91
|
sigs = Repo.new(path: path).sigs
|
69
92
|
_(sigs.size).must_equal 6
|
70
|
-
_(sigs.first.author).must_equal '
|
93
|
+
_(sigs.first.author).must_equal 'Gary Barnes'
|
71
94
|
_(sigs.last.subject).must_equal 'Star Wars ending explained'
|
72
95
|
end
|
73
96
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'yaml/store'
|
2
4
|
require_relative '../test_helper'
|
3
5
|
require_relative '../../lib/signore/sig_finder'
|
@@ -5,40 +7,42 @@ require_relative '../../lib/signore/tags'
|
|
5
7
|
|
6
8
|
module Signore
|
7
9
|
describe SigFinder do
|
10
|
+
verify_contract SigFinder
|
11
|
+
|
8
12
|
let(:sigs) do
|
9
13
|
Repo.new(path: Pathname.new('test/fixtures/signatures.yml')).sigs
|
10
14
|
end
|
11
15
|
|
12
|
-
let(:sig_finder) { SigFinder.new
|
16
|
+
let(:sig_finder) { SigFinder.new }
|
13
17
|
|
14
|
-
describe '
|
18
|
+
describe '#find' do
|
15
19
|
it 'returns a random Signature by default' do
|
16
|
-
_(SigFinder.
|
20
|
+
_(SigFinder.new(random: Random.new(0)).find(sigs).text)
|
17
21
|
.must_include 'Amateur fighter pilot ignores orders'
|
18
|
-
_(SigFinder.
|
22
|
+
_(SigFinder.new(random: Random.new(1)).find(sigs).text)
|
19
23
|
.must_equal '// sometimes I believe compiler ignores all my comments'
|
20
24
|
end
|
21
25
|
|
22
26
|
it 'returns a random signature if the tags are empty' do
|
23
|
-
_(SigFinder.find(sigs, tags: Tags.new
|
24
|
-
.
|
27
|
+
_(SigFinder.new(random: Random.new(0)).find(sigs, tags: Tags.new).text)
|
28
|
+
.must_include 'Amateur fighter pilot ignores orders'
|
25
29
|
end
|
26
30
|
|
27
31
|
it 'returns a random signature based on provided tags' do
|
28
|
-
_(
|
32
|
+
_(sig_finder.find(sigs, tags: Tags.new(required: %w(programming))).text)
|
29
33
|
.must_equal '// sometimes I believe compiler ignores all my comments'
|
30
|
-
_(
|
34
|
+
_(sig_finder.find(sigs, tags: Tags.new(required: %w(work))).text)
|
31
35
|
.must_equal 'You do have to be mad to work here, but it doesn’t help.'
|
32
36
|
end
|
33
37
|
|
34
38
|
it 'returns a random signature based on required and forbidden tags' do
|
35
39
|
tags = Tags.new(forbidden: %w(programming security), required: %w(tech))
|
36
|
-
_(
|
40
|
+
_(sig_finder.find(sigs, tags: tags).text)
|
37
41
|
.must_equal 'You do have to be mad to work here, but it doesn’t help.'
|
38
42
|
end
|
39
43
|
|
40
44
|
it 'returns a null object if there are no results' do
|
41
|
-
_(
|
45
|
+
_(sig_finder.find([])).must_equal Signature.new
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'stringio'
|
2
4
|
require_relative '../test_helper'
|
3
5
|
require_relative '../../lib/signore/sig_from_stream'
|
@@ -21,9 +23,7 @@ module Signore
|
|
21
23
|
|
22
24
|
Gary Barnes
|
23
25
|
|
24
|
-
|
25
26
|
asr
|
26
|
-
|
27
27
|
end
|
28
28
|
sig = nil
|
29
29
|
capture_io { sig = SigFromStream.sig_from input }
|
@@ -37,9 +37,10 @@ module Signore
|
|
37
37
|
‘You’ve got an interesting accent. Subtle. I can’t place it.’
|
38
38
|
‘It’s text-to-speech… I was raised by smartphones.’
|
39
39
|
|
40
|
-
Patrick Ewing
|
41
|
-
|
40
|
+
Patrick Ewing
|
41
|
+
|
42
42
|
|
43
|
+
end
|
43
44
|
sig = nil
|
44
45
|
capture_io { sig = SigFromStream.sig_from input }
|
45
46
|
text = <<-end.dedent.strip
|
@@ -1,8 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'yaml'
|
2
4
|
require_relative '../test_helper'
|
5
|
+
require_relative '../../lib/signore/mapper'
|
3
6
|
require_relative '../../lib/signore/signature'
|
4
7
|
|
5
|
-
module Signore
|
8
|
+
module Signore # rubocop:disable Metrics/ModuleLength
|
6
9
|
describe Signature do
|
7
10
|
describe '.new' do
|
8
11
|
it 'instantiates Signatures via parameters' do
|
@@ -22,8 +25,18 @@ module Signore
|
|
22
25
|
it 'nils empty parameters' do
|
23
26
|
new = Signature.new(author: '', source: '', subject: '', tags: [],
|
24
27
|
text: '')
|
25
|
-
_(new).must_equal Signature.new(author:
|
26
|
-
tags:
|
28
|
+
_(new).must_equal Signature.new(author: '', source: '', subject: '',
|
29
|
+
tags: [], text: '')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#empty?' do
|
34
|
+
it 'is true when the Signature is a null object' do
|
35
|
+
assert Signature.new.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is false when the Signature has some text' do
|
39
|
+
refute Signature.new(text: 'Node.jk').empty?
|
27
40
|
end
|
28
41
|
end
|
29
42
|
|
@@ -82,14 +95,12 @@ module Signore
|
|
82
95
|
end
|
83
96
|
|
84
97
|
it 'shows author and subject, space separated' do
|
85
|
-
text = '
|
86
|
-
|
87
|
-
|
88
|
-
text: text)
|
98
|
+
text = 'More gangland camp than neo-noir.'
|
99
|
+
sig = Signature.new(author: 'Nicholas Christopher',
|
100
|
+
subject: 'on Pulp Fiction', text: text)
|
89
101
|
_(sig.to_s).must_equal <<-end.dedent.strip
|
90
|
-
|
91
|
-
|
92
|
-
[Clive James on Marilyn Monroe]
|
102
|
+
More gangland camp than neo-noir.
|
103
|
+
[Nicholas Christopher on Pulp Fiction]
|
93
104
|
end
|
94
105
|
end
|
95
106
|
|
@@ -106,7 +117,7 @@ module Signore
|
|
106
117
|
|
107
118
|
it 'handles edge cases properly' do
|
108
119
|
YAML.load_file('test/fixtures/wrapper.yml').each do |sig, wrapped|
|
109
|
-
_(sig.to_s).must_equal wrapped
|
120
|
+
_(Mapper.from_h(sig.to_h).to_s).must_equal wrapped
|
110
121
|
end
|
111
122
|
end
|
112
123
|
end
|
data/test/signore/tags_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../test_helper'
|
2
4
|
require_relative '../../lib/signore/tags'
|
3
5
|
|
@@ -6,8 +8,8 @@ module Signore
|
|
6
8
|
describe '#match?' do
|
7
9
|
it 'is a predicate whether the Tags match the given list of tags' do
|
8
10
|
tags = %w(programming tech)
|
9
|
-
assert Tags.new.match?(
|
10
|
-
assert Tags.new(forbidden: %w(fnord)).match?(
|
11
|
+
assert Tags.new.match?([])
|
12
|
+
assert Tags.new(forbidden: %w(fnord)).match?([])
|
11
13
|
assert Tags.new.match?(tags)
|
12
14
|
assert Tags.new(required: %w(programming)).match?(tags)
|
13
15
|
assert Tags.new(required: %w(programming tech)).match?(tags)
|
@@ -16,5 +18,15 @@ module Signore
|
|
16
18
|
refute Tags.new(forbidden: %w(tech), required: %w(tech)).match?(tags)
|
17
19
|
end
|
18
20
|
end
|
21
|
+
|
22
|
+
describe '#to_s' do
|
23
|
+
it 'returns a CLI-like representation of the Tags' do
|
24
|
+
_(Tags.new.to_s).must_equal ''
|
25
|
+
_(Tags.new(required: %w(tech)).to_s).must_equal 'tech'
|
26
|
+
_(Tags.new(forbidden: %w(fnord)).to_s).must_equal '~fnord'
|
27
|
+
_(Tags.new(forbidden: %w(fnord), required: %w(tech)).to_s)
|
28
|
+
.must_equal 'tech ~fnord'
|
29
|
+
end
|
30
|
+
end
|
19
31
|
end
|
20
32
|
end
|
data/test/test_helper.rb
CHANGED
data.tar.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
+9b�fS���Y������?�N��i�+>p����㇈mM��5@�.��5,y�d��'����*w�Rg�^�㌵� zYx/�q]�/|�� �A�������>`�����ޡb�!��T��hV��JN/ �U7�ST`vv�B�_*��68�G��->��\������fs�� �f��mJ;���s��^"i�:�^Ca*��@��5 5j!ύu[�vn�2�*P��(���
|
metadata
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Szotkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBCMREwDwYDVQQDDAhjaGFz
|
14
|
+
dGVsbDEYMBYGCgmSJomT8ixkARkWCGNoYXN0ZWxsMRMwEQYKCZImiZPyLGQBGRYD
|
15
|
+
bmV0MB4XDTE1MTEwOTIxMTMwOVoXDTE2MTEwODIxMTMwOVowQjERMA8GA1UEAwwI
|
16
|
+
Y2hhc3RlbGwxGDAWBgoJkiaJk/IsZAEZFghjaGFzdGVsbDETMBEGCgmSJomT8ixk
|
17
|
+
ARkWA25ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcf6OF3mi6D
|
18
|
+
UedwY2A6fYEQF2bJVYQxV8fWHA5Q2R6y7Eg0hM80Q0yod7pJxlJTpnAPzuIl1u4y
|
19
|
+
hhfa/Vz0u6PVRhBYQ/Bcj9UEwgiXcy3P4ybINDeDt7GRVs3R9rRoT1aAsb5RCS0z
|
20
|
+
u/JKS2RcAS5XPpFow3Cfs5A/pM2NLsR/zeiaKg8rRB59A/tWw26F+YTaWfPAPFGv
|
21
|
+
d6af29NKWQh+EPkX1JwwtSwjKfVOeFr0csC6QLWKpp1z/7Lla8d3px426Ccjca0I
|
22
|
+
5VwtQeZ5LClTjqaYyH7vSojpOtgRuvVKspZ2jfe1KZq9jz//a/rSUrFcPlEQuXQp
|
23
|
+
i8E3TKoJrW0CAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
|
24
|
+
BBYEFLi/J921Nb53s8GKtKptC08QmHnwMCAGA1UdEQQZMBeBFWNoYXN0ZWxsQGNo
|
25
|
+
YXN0ZWxsLm5ldDAgBgNVHRIEGTAXgRVjaGFzdGVsbEBjaGFzdGVsbC5uZXQwDQYJ
|
26
|
+
KoZIhvcNAQEFBQADggEBAA+rUbXujzqDv8WE7kkiJadQhxldq/cRhaJDMKSWF3/H
|
27
|
+
6PL/Me8zq8Ok7/pQtxBvAhKcy3DdsH0q5pyPHoMrYySxEo9lNXLvwCPsi21rR53b
|
28
|
+
2w5rBytYCxrhsXISKwCkBYwVwtICafZ8VtRbD3pgnsPv+9NYJJ/rN4Z34doWM7oK
|
29
|
+
CAfY6o0LcY+qmvqLvqpweyoO73wkfKGUSz1a09dJfAP5aIREQDvpYrWx2ZoDrAct
|
30
|
+
srwnZ6g5uTvNbd0I1SnvnCJJ5y5iPvJIBlnGb3QZ77y2XXCOy3Yc0rjK7A8bQt5t
|
31
|
+
xOlyYMPKhWx2IqEip+J7PBpBwMnxIPhTcNlFOj8mSa0=
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2016-09-04 00:00:00.000000000 Z
|
12
34
|
dependencies:
|
13
35
|
- !ruby/object:Gem::Dependency
|
14
36
|
name: lovely_rufus
|
@@ -16,28 +38,14 @@ dependencies:
|
|
16
38
|
requirements:
|
17
39
|
- - "~>"
|
18
40
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
41
|
+
version: '1.0'
|
20
42
|
type: :runtime
|
21
43
|
prerelease: false
|
22
44
|
version_requirements: !ruby/object:Gem::Requirement
|
23
45
|
requirements:
|
24
46
|
- - "~>"
|
25
47
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: private_attr
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.1'
|
48
|
+
version: '1.0'
|
41
49
|
- !ruby/object:Gem::Dependency
|
42
50
|
name: bogus
|
43
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,56 +94,56 @@ dependencies:
|
|
86
94
|
requirements:
|
87
95
|
- - "~>"
|
88
96
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
97
|
+
version: '11.0'
|
90
98
|
type: :development
|
91
99
|
prerelease: false
|
92
100
|
version_requirements: !ruby/object:Gem::Requirement
|
93
101
|
requirements:
|
94
102
|
- - "~>"
|
95
103
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
104
|
+
version: '11.0'
|
97
105
|
- !ruby/object:Gem::Dependency
|
98
106
|
name: reek
|
99
107
|
requirement: !ruby/object:Gem::Requirement
|
100
108
|
requirements:
|
101
109
|
- - "~>"
|
102
110
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
111
|
+
version: '4.0'
|
104
112
|
type: :development
|
105
113
|
prerelease: false
|
106
114
|
version_requirements: !ruby/object:Gem::Requirement
|
107
115
|
requirements:
|
108
116
|
- - "~>"
|
109
117
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
118
|
+
version: '4.0'
|
111
119
|
- !ruby/object:Gem::Dependency
|
112
120
|
name: rerun
|
113
121
|
requirement: !ruby/object:Gem::Requirement
|
114
122
|
requirements:
|
115
123
|
- - "~>"
|
116
124
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
125
|
+
version: 0.11.0
|
118
126
|
type: :development
|
119
127
|
prerelease: false
|
120
128
|
version_requirements: !ruby/object:Gem::Requirement
|
121
129
|
requirements:
|
122
130
|
- - "~>"
|
123
131
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
132
|
+
version: 0.11.0
|
125
133
|
- !ruby/object:Gem::Dependency
|
126
134
|
name: rubocop
|
127
135
|
requirement: !ruby/object:Gem::Requirement
|
128
136
|
requirements:
|
129
137
|
- - "~>"
|
130
138
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
139
|
+
version: 0.42.0
|
132
140
|
type: :development
|
133
141
|
prerelease: false
|
134
142
|
version_requirements: !ruby/object:Gem::Requirement
|
135
143
|
requirements:
|
136
144
|
- - "~>"
|
137
145
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
146
|
+
version: 0.42.0
|
139
147
|
description: signore helps manage email signatures and select random ones based on
|
140
148
|
their tags
|
141
149
|
email: chastell@chastell.net
|
@@ -154,6 +162,7 @@ files:
|
|
154
162
|
- README.md
|
155
163
|
- Rakefile
|
156
164
|
- bin/signore
|
165
|
+
- certs/chastell.pem
|
157
166
|
- lib/signore.rb
|
158
167
|
- lib/signore/cli.rb
|
159
168
|
- lib/signore/mapper.rb
|
@@ -164,6 +173,7 @@ files:
|
|
164
173
|
- lib/signore/signature.rb
|
165
174
|
- lib/signore/tags.rb
|
166
175
|
- signore.gemspec
|
176
|
+
- test/fixtures/nosignatures.yml
|
167
177
|
- test/fixtures/signatures.legacy.yml
|
168
178
|
- test/fixtures/signatures.yml
|
169
179
|
- test/fixtures/wrapper.yml
|
@@ -196,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
206
|
version: '0'
|
197
207
|
requirements: []
|
198
208
|
rubyforge_project:
|
199
|
-
rubygems_version: 2.4
|
209
|
+
rubygems_version: 2.6.4
|
200
210
|
signing_key:
|
201
211
|
specification_version: 4
|
202
212
|
summary: 'signore: an email signature manager/randomiser'
|
@@ -210,4 +220,3 @@ test_files:
|
|
210
220
|
- test/signore/signature_test.rb
|
211
221
|
- test/signore/tags_test.rb
|
212
222
|
- test/test_helper.rb
|
213
|
-
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|