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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d6a5ab52ca772347f22c1c1edafe01c3b1ff6f2
4
- data.tar.gz: 1de61e65fea0d01bb5fd316e56a68ee03087a271
3
+ metadata.gz: c1a5292cb375e7c9e5a675459999789ef30c0dfd
4
+ data.tar.gz: b8c56a2de499328fd5eda249ba20f88f2ddb89db
5
5
  SHA512:
6
- metadata.gz: ed60cf371e93057783c7e6ea71729836e4a64813400ce24b1608166db55bb378ad8e8143e950237ac17f214d54b9ebd3234f97e2e5a4d20664ae1fc313600bda
7
- data.tar.gz: 92e0f956b0c204af3eeb309cc14b2196534baee73f0dba15762e8ee07171b0198993d0ac5532532f0336cc0a08a2a6e5b98eab06aa03f69e3242a0eaa996f02c
6
+ metadata.gz: bb841f115b6c3368e4c26871e98873dfb344f708f81a7cdf644cd0a8a098559ed702e744ffd8938b748d7ba6e4db74d459124a8ecfbdec27f77a94b10861300a
7
+ data.tar.gz: 1c5e087bd48151c54c9c118c1d7e44f42c1f8f20abdf6f79e230d98c0de27aedbdee6f6419952d06d829365692e525f28c82283ae9b5a2cdfa0dd8507eaf3e77
checksums.yaml.gz.sig ADDED
Binary file
data/.reek CHANGED
@@ -1,10 +1,2 @@
1
- FeatureEnvy:
2
- exclude:
3
- - Signore::Settings#forbidden
4
-
5
1
  IrresponsibleModule:
6
2
  enabled: false
7
-
8
- UtilityFunction:
9
- exclude:
10
- - Signore::Settings#repo_path
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/TrailingComma:
13
+ Style/TrailingCommaInArguments:
14
+ EnforcedStyleForMultiline: comma
15
+
16
+ Style/TrailingCommaInLiteral:
11
17
  EnforcedStyleForMultiline: comma
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2
1
+ 2.3
data/.travis.yml CHANGED
@@ -1,6 +1,12 @@
1
+ cache: bundler
2
+ fast_finish: true
1
3
  language: ruby
4
+ matrix:
5
+ allow_failures:
6
+ - rvm: ruby-head
2
7
  rvm:
3
8
  - ruby-2.1
4
9
  - ruby-2.2
10
+ - ruby-2.3.0
5
11
  - ruby-head
6
12
  sudo: false
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
  gemspec
data/Gemfile.lock CHANGED
@@ -2,77 +2,65 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  signore (0.4.2)
5
- lovely_rufus (~> 0.3.0)
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
- abstract_type (0.0.7)
12
- adamantium (0.2.0)
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
- memoizable (~> 0.4.0)
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
- celluloid (0.16.0)
21
- timers (~> 4.0.0)
22
- concord (0.1.5)
23
- adamantium (~> 0.2.0)
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
- diff-lcs (1.2.5)
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
- minitest (5.7.0)
40
- minitest-focus (1.1.1)
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.2.2.6)
43
- ast (>= 1.1, < 3.0)
35
+ parser (2.3.1.2)
36
+ ast (~> 2.2)
44
37
  powerpack (0.1.1)
45
- private_attr (1.1.0)
46
- procto (0.0.2)
47
- rainbow (2.0.0)
48
- rake (10.4.2)
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 (3.1)
53
- parser (~> 2.2.2.5)
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
- unparser (~> 0.2.2)
56
- rerun (0.10.0)
57
- listen (~> 2.7, >= 2.7.3)
58
- rubocop (0.32.1)
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.4)
64
- ruby-progressbar (1.7.5)
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
- timers (4.0.1)
67
- hitimes
68
- unparser (0.2.4)
69
- abstract_type (~> 0.0.7)
70
- adamantium (~> 0.2.0)
71
- concord (~> 0.1.5)
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 (~> 10.1)
85
- reek (~> 3.1)
86
- rerun (~> 0.10.0)
87
- rubocop (~> 0.32.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.10.5
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-MMXIV Piotr Szotkowski <chastell@chastell.net>, licensed under AGPL-3.0 (see LICENCE)
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
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require_relative '../lib/signore'
4
5
  trap(:INT) { exit }
@@ -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 puts retrieve_sig
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
- def create_sig_from(input)
30
- SigFromStream.sig_from(input, tags: tags).tap { |sig| repo << sig }
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 retrieve_sig
34
- repo.find(tags: tags)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'signature'
2
4
 
3
5
  module Signore
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
- def initialize(path: Settings.new.repo_path, sig_finder: SigFinder)
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
- sigs << sig
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
- elems = store.transaction(true) { store.fetch('signatures', []) }
27
- elems.map { |elem| elem.is_a?(Signature) ? elem : Mapper.from_h(elem) }
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
- def persist
36
- hashes = sigs.map { |sig| Mapper.to_h(sig) }
37
- store.transaction { store['signatures'] = hashes }
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
@@ -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
- Tags.new(forbidden: forbidden, required: required)
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
- def forbidden
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 []
@@ -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
- module SigFinder
6
- module_function
7
+ class SigFinder
8
+ def initialize(random: Random.new)
9
+ @random = random
10
+ end
7
11
 
8
- def find(sigs, random: Random.new, tags: Tags.new)
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
- ''.tap do |value|
30
- value << input.gets until value.lines.to_a.last == "\n"
31
- end.strip
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 { |name| get_param(name) })
41
+ @params ||= Params.new(*Params.members.map(&method(:get_param)))
36
42
  end
37
43
  end
38
44
  end
@@ -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: nil, source: nil, subject: nil, tags: nil, text: nil)
7
+ def initialize(author: '', source: '', subject: '', tags: [], text: '')
6
8
  super text, author, source, subject, tags
7
- each_pair { |key, value| self[key] = nil if value and value.empty? }
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 { |_, value| value }
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 < 0 ? 0 : indent
37
+ indent.negative? ? 0 : indent
31
38
  end
32
39
 
33
40
  def meta
34
- stem = [author, subject].compact.join(' ')
35
- stem.empty? ? "#{source}" : [stem, source].compact.join(', ')
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
@@ -1,2 +1,3 @@
1
- require 'private_attr/everywhere'
1
+ # frozen_string_literal: true
2
+
2
3
  require_relative 'signore/cli'
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.4.2'
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.add_dependency 'lovely_rufus', '~> 0.3.0'
19
- gem.add_dependency 'private_attr', '~> 1.1'
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', '~> 10.1'
25
- gem.add_development_dependency 'reek', '~> 3.1'
26
- gem.add_development_dependency 'rerun', '~> 0.10.0'
27
- gem.add_development_dependency 'rubocop', '~> 0.32.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
@@ -0,0 +1,2 @@
1
+ ---
2
+ signatures: []
@@ -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.
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../test_helper'
2
4
  require_relative '../../lib/signore/mapper'
3
5
  require_relative '../../lib/signore/signature'
@@ -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(:sig_finder, as: :class) }
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(tech), required: %w(programming security))
43
- stub(sig_finder).find(sigs, tags: tags) { sigs.last }
44
- _(repo.find(tags: tags)).must_equal sigs.last
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('test/fixtures/signatures.legacy.yml')
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 'Clive James'
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 'pathname'
2
4
  require 'tmpdir'
3
5
  require_relative '../test_helper'
@@ -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(sigs) }
16
+ let(:sig_finder) { SigFinder.new }
13
17
 
14
- describe '.find' do
18
+ describe '#find' do
15
19
  it 'returns a random Signature by default' do
16
- _(SigFinder.find(sigs, random: Random.new(0)).text)
20
+ _(SigFinder.new(random: Random.new(0)).find(sigs).text)
17
21
  .must_include 'Amateur fighter pilot ignores orders'
18
- _(SigFinder.find(sigs, random: Random.new(1)).text)
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, random: Random.new(1)).text)
24
- .must_equal '// sometimes I believe compiler ignores all my comments'
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
- _(SigFinder.find(sigs, tags: Tags.new(required: %w(programming))).text)
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
- _(SigFinder.find(sigs, tags: Tags.new(required: %w(work))).text)
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
- _(SigFinder.find(sigs, tags: tags).text)
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
- _(SigFinder.find([])).must_equal Signature.new
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\n\n\n
41
- end
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: nil, source: nil, subject: nil,
26
- tags: nil, text: nil)
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 = 'She was good at playing abstract confusion ' \
86
- 'in the same way a midget is good at being short.'
87
- sig = Signature.new(author: 'Clive James', subject: 'on Marilyn Monroe',
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
- She was good at playing abstract confusion in
91
- the same way a midget is good at being short.
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
@@ -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?(nil)
10
- assert Tags.new(forbidden: %w(fnord)).match?(nil)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ENV['MT_NO_EXPECTATIONS'] = 'true'
2
4
  require 'bundler/setup'
3
5
  require 'minitest/autorun'
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.2
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
- date: 2015-07-21 00:00:00.000000000 Z
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: 0.3.0
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: 0.3.0
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: '10.1'
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: '10.1'
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: '3.1'
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: '3.1'
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.10.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.10.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.32.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.32.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.8
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