signore 0.4.2 → 0.5.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 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