signore 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -10
- data/Gemfile.lock +38 -33
- data/README.md +0 -12
- data/Rakefile +5 -3
- data/bin/signore +1 -1
- data/config/reek.yml +8 -5
- data/lib/signore/cli.rb +28 -0
- data/lib/signore/database.rb +32 -19
- data/lib/signore/settings.rb +36 -0
- data/lib/signore/sig_finder.rb +24 -0
- data/lib/signore/sig_from_stream.rb +38 -0
- data/lib/signore/signature.rb +37 -39
- data/lib/signore/tags.rb +7 -0
- data/lib/signore.rb +1 -9
- data/signore.gemspec +13 -10
- data/spec/signore/cli_spec.rb +92 -0
- data/spec/signore/database_spec.rb +46 -33
- data/spec/signore/settings_spec.rb +47 -0
- data/spec/signore/sig_finder_spec.rb +46 -0
- data/spec/signore/sig_from_stream_spec.rb +54 -0
- data/spec/signore/signature_spec.rb +85 -74
- data/spec/spec_helper.rb +4 -4
- metadata +49 -12
- data/lib/signore/executable.rb +0 -69
- data/spec/signore/executable_spec.rb +0 -125
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b5b9c7abacbf5730fdbadf79e7d5fe61ec37cdd3
|
|
4
|
+
data.tar.gz: 587a3996c7fabb7e31b3bd27250310749b588f0c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0f04915b49b5d7f3678bd178def6607a7bd20727f2bcf1db2731ee86ef8e058c5107004183d7ac4fd47c5aa418b00ccc5df3f53cee0f0f1de35a8c5ca2c3ad14
|
|
7
|
+
data.tar.gz: b37a86a56e2309943664de9ad3a5b1934d037fca249d123dcfb82cf6bd05f29357c91fa177c8d0e8bd0eb4ab14571c451dbf6014365c9c50568d17ef8158a1c2
|
data/.rubocop.yml
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
AccessModifierIndentation:
|
|
2
|
-
Enabled: false
|
|
3
|
-
|
|
4
1
|
AndOr:
|
|
5
2
|
Enabled: false
|
|
6
3
|
|
|
7
4
|
Documentation:
|
|
8
5
|
Enabled: false
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
Enabled: false
|
|
12
|
-
|
|
13
|
-
IndentationWidth:
|
|
7
|
+
Not:
|
|
14
8
|
Enabled: false
|
|
15
9
|
|
|
16
|
-
MethodDefParentheses:
|
|
17
|
-
EnforcedStyle: require_no_parentheses
|
|
18
|
-
|
|
19
10
|
SingleSpaceBeforeFirstArg:
|
|
20
11
|
Enabled: false
|
|
12
|
+
|
|
13
|
+
TrailingComma:
|
|
14
|
+
EnforcedStyleForMultiline: comma
|
data/Gemfile.lock
CHANGED
|
@@ -2,66 +2,71 @@ PATH
|
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
4
|
signore (0.2.2)
|
|
5
|
-
lovely_rufus (~> 0.
|
|
5
|
+
lovely_rufus (~> 0.2.0)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
ast (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
ast (2.0.0)
|
|
11
|
+
astrolabe (1.3.0)
|
|
12
|
+
parser (>= 2.2.0.pre.3, < 3.0)
|
|
13
|
+
bogus (0.1.5)
|
|
14
|
+
dependor (>= 0.0.4)
|
|
15
|
+
celluloid (0.16.0)
|
|
16
|
+
timers (~> 4.0.0)
|
|
17
|
+
dependor (1.0.1)
|
|
16
18
|
ffi (1.9.3)
|
|
17
|
-
|
|
18
|
-
listen (2.7.
|
|
19
|
+
hitimes (1.2.2)
|
|
20
|
+
listen (2.7.9)
|
|
19
21
|
celluloid (>= 0.15.2)
|
|
20
|
-
celluloid-io (>= 0.15.0)
|
|
21
22
|
rb-fsevent (>= 0.9.3)
|
|
22
23
|
rb-inotify (>= 0.9)
|
|
23
|
-
lovely_rufus (0.
|
|
24
|
-
minitest (5.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
lovely_rufus (0.2.0)
|
|
25
|
+
minitest (5.4.1)
|
|
26
|
+
minitest-focus (1.1.0)
|
|
27
|
+
minitest (>= 4, < 6)
|
|
28
|
+
parser (2.2.0.pre.4)
|
|
29
|
+
ast (>= 1.1, < 3.0)
|
|
28
30
|
slop (~> 3.4, >= 3.4.5)
|
|
29
31
|
powerpack (0.0.9)
|
|
30
32
|
rainbow (2.0.0)
|
|
31
|
-
rake (10.
|
|
33
|
+
rake (10.3.2)
|
|
32
34
|
rb-fsevent (0.9.4)
|
|
33
|
-
rb-inotify (0.9.
|
|
35
|
+
rb-inotify (0.9.5)
|
|
34
36
|
ffi (>= 0.5.0)
|
|
35
|
-
reek (1.3.
|
|
36
|
-
rainbow
|
|
37
|
-
ruby2ruby (
|
|
37
|
+
reek (1.3.8)
|
|
38
|
+
rainbow (>= 1.99, < 3.0)
|
|
39
|
+
ruby2ruby (>= 2.0.8, < 3.0)
|
|
38
40
|
ruby_parser (~> 3.3)
|
|
39
41
|
sexp_processor
|
|
40
|
-
rerun (0.
|
|
41
|
-
listen (~> 2.7)
|
|
42
|
-
rubocop (0.
|
|
43
|
-
|
|
44
|
-
parser (
|
|
42
|
+
rerun (0.10.0)
|
|
43
|
+
listen (~> 2.7, >= 2.7.3)
|
|
44
|
+
rubocop (0.26.0)
|
|
45
|
+
astrolabe (~> 1.3)
|
|
46
|
+
parser (>= 2.2.0.pre.4, < 3.0)
|
|
45
47
|
powerpack (~> 0.0.6)
|
|
46
48
|
rainbow (>= 1.99.1, < 3.0)
|
|
47
49
|
ruby-progressbar (~> 1.4)
|
|
48
|
-
ruby-progressbar (1.
|
|
49
|
-
ruby2ruby (2.
|
|
50
|
+
ruby-progressbar (1.5.1)
|
|
51
|
+
ruby2ruby (2.1.2)
|
|
50
52
|
ruby_parser (~> 3.1)
|
|
51
53
|
sexp_processor (~> 4.0)
|
|
52
|
-
ruby_parser (3.
|
|
54
|
+
ruby_parser (3.6.2)
|
|
53
55
|
sexp_processor (~> 4.1)
|
|
54
|
-
sexp_processor (4.4.
|
|
55
|
-
slop (3.
|
|
56
|
-
timers (
|
|
56
|
+
sexp_processor (4.4.4)
|
|
57
|
+
slop (3.6.0)
|
|
58
|
+
timers (4.0.1)
|
|
59
|
+
hitimes
|
|
57
60
|
|
|
58
61
|
PLATFORMS
|
|
59
62
|
ruby
|
|
60
63
|
|
|
61
64
|
DEPENDENCIES
|
|
65
|
+
bogus (~> 0.1.3)
|
|
62
66
|
minitest (~> 5.0)
|
|
67
|
+
minitest-focus (~> 1.1)
|
|
63
68
|
rake (~> 10.1)
|
|
64
69
|
reek (~> 1.3)
|
|
65
|
-
rerun (~> 0.
|
|
66
|
-
rubocop (~> 0.
|
|
70
|
+
rerun (~> 0.10.0)
|
|
71
|
+
rubocop (~> 0.26.0)
|
|
67
72
|
signore!
|
data/README.md
CHANGED
|
@@ -68,18 +68,6 @@ Another aproach would be to create a named pipe that your email program reads fr
|
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
Options
|
|
72
|
-
-------
|
|
73
|
-
|
|
74
|
-
signore supports a single option, `--database` (or `-d` for short), which can be used to use a non-default signature database location:
|
|
75
|
-
|
|
76
|
-
$ signore prego -d spec/fixtures/signatures.yml
|
|
77
|
-
Amateur fighter pilot ignores orders, listens to
|
|
78
|
-
the voices in his head and slaughters thousands.
|
|
79
|
-
[Star Wars ending explained]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
71
|
Properties
|
|
84
72
|
----------
|
|
85
73
|
|
data/Rakefile
CHANGED
|
@@ -2,9 +2,9 @@ require 'rake/testtask'
|
|
|
2
2
|
require 'reek/rake/task'
|
|
3
3
|
require 'rubocop/rake_task'
|
|
4
4
|
|
|
5
|
-
task default: %i
|
|
5
|
+
task default: %i(spec rubocop reek)
|
|
6
6
|
|
|
7
|
-
Rake::TestTask.new
|
|
7
|
+
Rake::TestTask.new(:spec) do |task|
|
|
8
8
|
task.test_files = FileList['spec/**/*_spec.rb']
|
|
9
9
|
task.warning = true
|
|
10
10
|
end
|
|
@@ -15,4 +15,6 @@ Reek::Rake::Task.new do |task|
|
|
|
15
15
|
task.reek_opts = '--quiet'
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
RuboCop::RakeTask.new do |task|
|
|
19
|
+
task.options << '--display-cop-names'
|
|
20
|
+
end
|
data/bin/signore
CHANGED
data/config/reek.yml
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
DuplicateMethodCall:
|
|
2
2
|
exclude:
|
|
3
|
-
|
|
3
|
+
- Signore::SigFinder#find_tagged
|
|
4
|
+
|
|
5
|
+
FeatureEnvy:
|
|
6
|
+
exclude:
|
|
7
|
+
- Signore::Settings#forbidden
|
|
4
8
|
|
|
5
9
|
IrresponsibleModule:
|
|
6
10
|
enabled: false
|
|
7
11
|
|
|
8
12
|
NestedIterators:
|
|
9
|
-
exclude:
|
|
10
|
-
- Signore::Database#find
|
|
11
13
|
max_allowed_nesting: 2
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
UtilityFunction:
|
|
16
|
+
exclude:
|
|
17
|
+
- Signore::Settings#db_path
|
data/lib/signore/cli.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require_relative 'database'
|
|
2
|
+
require_relative 'settings'
|
|
3
|
+
require_relative 'sig_from_stream'
|
|
4
|
+
|
|
5
|
+
module Signore
|
|
6
|
+
class CLI
|
|
7
|
+
def initialize(args = ARGV, db: Database.new)
|
|
8
|
+
@settings = Settings.new(args)
|
|
9
|
+
@db = db
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run(input: $stdin)
|
|
13
|
+
case settings.action
|
|
14
|
+
when 'prego'
|
|
15
|
+
puts db.find(tags: settings.tags)
|
|
16
|
+
when 'pronto'
|
|
17
|
+
sig = SigFromStream.sig_from(input, tags: settings.tags)
|
|
18
|
+
db << sig
|
|
19
|
+
puts sig
|
|
20
|
+
else
|
|
21
|
+
abort 'usage: signore prego|pronto [tag, …]'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_reader :db, :settings
|
|
26
|
+
private :db, :settings
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/signore/database.rb
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'yaml/store'
|
|
3
|
+
require_relative 'settings'
|
|
4
|
+
require_relative 'sig_finder'
|
|
5
|
+
require_relative 'tags'
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
module Signore
|
|
8
|
+
class Database
|
|
9
|
+
def initialize(path: Settings.new.db_path, sig_finder: SigFinder)
|
|
10
|
+
@path = path
|
|
11
|
+
@sig_finder = sig_finder
|
|
12
|
+
initialise_store if path.zero? or not path.exist?
|
|
13
|
+
@store = YAML::Store.new(path)
|
|
10
14
|
end
|
|
11
|
-
end
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
def <<(sig)
|
|
17
|
+
store.transaction { store['signatures'] << sig }
|
|
18
|
+
sig
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def find(tags: Tags.new)
|
|
22
|
+
sigs = store.transaction(true) { store['signatures'] }
|
|
23
|
+
sig_finder.find(sigs, tags: tags)
|
|
19
24
|
end
|
|
20
|
-
end
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
attr_reader :path, :sig_finder, :store
|
|
27
|
+
private :path, :sig_finder, :store
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def initialise_store
|
|
32
|
+
FileUtils.mkdir_p path.dirname
|
|
33
|
+
FileUtils.touch path
|
|
34
|
+
YAML::Store.new(path).transaction { |store| store['signatures'] = [] }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require_relative 'tags'
|
|
3
|
+
|
|
4
|
+
module Signore
|
|
5
|
+
class Settings
|
|
6
|
+
def initialize(args = [])
|
|
7
|
+
@args = args
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def action
|
|
11
|
+
args.first
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def db_path
|
|
15
|
+
db_dir = ENV.fetch('XDG_DATA_HOME') { File.expand_path('~/.local/share') }
|
|
16
|
+
Pathname.new("#{db_dir}/signore/signatures.yml")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tags
|
|
20
|
+
Tags.new(forbidden: forbidden, required: required)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_reader :args
|
|
24
|
+
private :args
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def forbidden
|
|
29
|
+
args[1..-1].select { |tag| tag.start_with?('~') }.map { |tag| tag[1..-1] }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def required
|
|
33
|
+
args[1..-1].reject { |tag| tag.start_with?('~') }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require_relative 'tags'
|
|
2
|
+
|
|
3
|
+
module Signore
|
|
4
|
+
class SigFinder
|
|
5
|
+
def self.find(sigs, random: Random.new, tags: Tags.new)
|
|
6
|
+
new(sigs, random: random).find_tagged(tags: tags)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def initialize(sigs, random: Random.new)
|
|
10
|
+
@random = random
|
|
11
|
+
@sigs = sigs
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def find_tagged(tags: Tags.new)
|
|
15
|
+
sigs
|
|
16
|
+
.select { |sig| tags.required.all? { |tag| sig.tagged_with?(tag) } }
|
|
17
|
+
.reject { |sig| tags.forbidden.any? { |tag| sig.tagged_with?(tag) } }
|
|
18
|
+
.sample(random: random) or Signature.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
attr_reader :random, :sigs
|
|
22
|
+
private :random, :sigs
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require_relative 'signature'
|
|
2
|
+
require_relative 'tags'
|
|
3
|
+
|
|
4
|
+
module Signore
|
|
5
|
+
class SigFromStream
|
|
6
|
+
Params = Struct.new(*%i(text author subject source))
|
|
7
|
+
|
|
8
|
+
def self.sig_from(input, tags: Tags.new)
|
|
9
|
+
new(input, tags: tags).to_sig
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def initialize(input, tags: Tags.new)
|
|
13
|
+
@input = input
|
|
14
|
+
@tags = tags
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_sig
|
|
18
|
+
Signature.new(params.text, author: params.author, source: params.source,
|
|
19
|
+
subject: params.subject, tags: tags.required)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
attr_reader :input, :tags
|
|
23
|
+
private :input, :tags
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def get_param(param)
|
|
28
|
+
puts "#{param}?"
|
|
29
|
+
''.tap do |value|
|
|
30
|
+
value << input.gets until value.lines.to_a.last == "\n"
|
|
31
|
+
end.strip
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def params
|
|
35
|
+
@params ||= Params.new(*Params.members.map { |name| get_param(name) })
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/lib/signore/signature.rb
CHANGED
|
@@ -1,39 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end
|
|
39
|
-
end end
|
|
1
|
+
require 'lovely_rufus'
|
|
2
|
+
|
|
3
|
+
module Signore
|
|
4
|
+
Signature = Struct.new(*%i(text author source subject tags)) do
|
|
5
|
+
def initialize(text = '', author: nil, source: nil, subject: nil, tags: nil)
|
|
6
|
+
super text, author, source, subject, tags
|
|
7
|
+
each_pair { |key, value| self[key] = nil if value and value.empty? }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def tagged_with?(tag)
|
|
11
|
+
tags and tags.include?(tag)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
spaced = text.gsub("\n", "\n\n")
|
|
16
|
+
wrapped = LovelyRufus.wrap(spaced, width: 80)
|
|
17
|
+
squeezed = wrapped.gsub("\n\n", "\n").chomp
|
|
18
|
+
squeezed + meta_for(squeezed)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def indent_size_for(text)
|
|
24
|
+
indent = text.split("\n").map(&:size).max - meta.size - 2
|
|
25
|
+
indent < 0 ? 0 : indent
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def meta
|
|
29
|
+
stem = [author, subject].compact.join(' ')
|
|
30
|
+
stem.empty? ? "#{source}" : [stem, source].compact.join(', ')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def meta_for(text)
|
|
34
|
+
meta.empty? ? '' : "\n#{' ' * indent_size_for(text)}[#{meta}]"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/signore/tags.rb
ADDED
data/lib/signore.rb
CHANGED
data/signore.gemspec
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
Gem::Specification.new do |gem|
|
|
2
2
|
gem.author = 'Piotr Szotkowski'
|
|
3
|
-
gem.description = 'signore helps manage email signatures and select
|
|
3
|
+
gem.description = 'signore helps manage email signatures and select ' \
|
|
4
|
+
'random ones based on their tags'
|
|
4
5
|
gem.email = 'chastell@chastell.net'
|
|
5
6
|
gem.homepage = 'http://github.com/chastell/signore'
|
|
6
7
|
gem.license = 'AGPL-3.0'
|
|
7
8
|
gem.name = 'signore'
|
|
8
9
|
gem.summary = 'signore: an email signature manager/randomiser'
|
|
9
|
-
gem.version = '0.2.
|
|
10
|
+
gem.version = '0.2.3'
|
|
10
11
|
|
|
11
12
|
gem.files = `git ls-files -z`.split "\0"
|
|
12
|
-
gem.executables = gem.files.grep(
|
|
13
|
-
gem.test_files = gem.files.grep
|
|
13
|
+
gem.executables = gem.files.grep(/^bin\//).map { |path| File.basename(path) }
|
|
14
|
+
gem.test_files = gem.files.grep(/^spec\/.*\.rb$/)
|
|
14
15
|
|
|
15
|
-
gem.add_dependency 'lovely_rufus', '~> 0.
|
|
16
|
+
gem.add_dependency 'lovely_rufus', '~> 0.2.0'
|
|
16
17
|
|
|
17
|
-
gem.add_development_dependency '
|
|
18
|
-
gem.add_development_dependency '
|
|
19
|
-
gem.add_development_dependency '
|
|
20
|
-
gem.add_development_dependency '
|
|
21
|
-
gem.add_development_dependency '
|
|
18
|
+
gem.add_development_dependency 'bogus', '~> 0.1.3'
|
|
19
|
+
gem.add_development_dependency 'minitest', '~> 5.0'
|
|
20
|
+
gem.add_development_dependency 'minitest-focus', '~> 1.1'
|
|
21
|
+
gem.add_development_dependency 'rake', '~> 10.1'
|
|
22
|
+
gem.add_development_dependency 'reek', '~> 1.3'
|
|
23
|
+
gem.add_development_dependency 'rerun', '~> 0.10.0'
|
|
24
|
+
gem.add_development_dependency 'rubocop', '~> 0.26.0'
|
|
22
25
|
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require 'stringio'
|
|
3
|
+
require 'tempfile'
|
|
4
|
+
require 'tmpdir'
|
|
5
|
+
require_relative '../spec_helper'
|
|
6
|
+
require_relative '../../lib/signore/cli'
|
|
7
|
+
|
|
8
|
+
module Signore
|
|
9
|
+
describe CLI do
|
|
10
|
+
describe '#run' do
|
|
11
|
+
it 'prints usage if no command is given' do
|
|
12
|
+
out = capture_io { -> { CLI.new([]).run }.must_raise SystemExit }.last
|
|
13
|
+
out.must_include 'usage: signore prego|pronto [tag, …]'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'prints usage if a bogus command is given' do
|
|
17
|
+
out = capture_io do
|
|
18
|
+
-> { CLI.new(['bogus']).run }.must_raise SystemExit
|
|
19
|
+
end.last
|
|
20
|
+
out.must_include 'usage: signore prego|pronto [tag, …]'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe 'prego' do
|
|
24
|
+
let(:db) { Database.new(path: path) }
|
|
25
|
+
let(:path) { Pathname.new('spec/fixtures/signatures.yml') }
|
|
26
|
+
|
|
27
|
+
it 'prints a signature tagged with the provided tags' do
|
|
28
|
+
args = %w(prego tech programming)
|
|
29
|
+
out = capture_io { CLI.new(args, db: db).run }.first
|
|
30
|
+
sig = "// sometimes I believe compiler ignores all my comments\n"
|
|
31
|
+
out.must_equal sig
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'prints a signature based on allowed and forbidden tags' do
|
|
35
|
+
args = %w(prego ~programming tech ~security)
|
|
36
|
+
out = capture_io { CLI.new(args, db: db).run }.first
|
|
37
|
+
out.must_equal <<-end.dedent
|
|
38
|
+
You do have to be mad to work here, but it doesn’t help.
|
|
39
|
+
[Gary Barnes, asr]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe 'pronto' do
|
|
45
|
+
let(:db) { Database.new(path: Pathname.new(Tempfile.new('').path)) }
|
|
46
|
+
|
|
47
|
+
it 'asks about signature parts and saves resulting signature' do
|
|
48
|
+
input = StringIO.new <<-end.dedent
|
|
49
|
+
The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.
|
|
50
|
+
|
|
51
|
+
Mark Pilgrim\n\n\n
|
|
52
|
+
end
|
|
53
|
+
args = %w(pronto Wikipedia ADHD)
|
|
54
|
+
out = capture_io { CLI.new(args, db: db).run input: input }.first
|
|
55
|
+
out.must_equal <<-end.dedent
|
|
56
|
+
text?
|
|
57
|
+
author?
|
|
58
|
+
subject?
|
|
59
|
+
source?
|
|
60
|
+
The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.
|
|
61
|
+
[Mark Pilgrim]
|
|
62
|
+
end
|
|
63
|
+
args = %w(prego Wikipedia ADHD)
|
|
64
|
+
out = capture_io { CLI.new(args, db: db).run }.first
|
|
65
|
+
out.must_equal <<-end.dedent
|
|
66
|
+
The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.
|
|
67
|
+
[Mark Pilgrim]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'handles multi-line signatures' do
|
|
72
|
+
input = StringIO.new <<-end.dedent
|
|
73
|
+
‘You’ve got an interesting accent. Subtle. I can’t place it.’
|
|
74
|
+
‘It’s text-to-speech… I was raised by smartphones.’
|
|
75
|
+
|
|
76
|
+
Patrick Ewing\n\n\n
|
|
77
|
+
end
|
|
78
|
+
io = capture_io { CLI.new(['pronto'], db: db).run input: input }
|
|
79
|
+
io.first.must_equal <<-end.dedent
|
|
80
|
+
text?
|
|
81
|
+
author?
|
|
82
|
+
subject?
|
|
83
|
+
source?
|
|
84
|
+
‘You’ve got an interesting accent. Subtle. I can’t place it.’
|
|
85
|
+
‘It’s text-to-speech… I was raised by smartphones.’
|
|
86
|
+
[Patrick Ewing]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|