signore 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -2,11 +2,13 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  signore (0.0.0)
5
+ lovely-rufus
5
6
  trollop
6
7
 
7
8
  GEM
8
9
  remote: http://rubygems.org/
9
10
  specs:
11
+ lovely-rufus (0.0.0)
10
12
  minitest (2.6.1)
11
13
  rake (0.9.2)
12
14
  trollop (1.16.2)
@@ -2,31 +2,26 @@
2
2
 
3
3
  module Signore class Database
4
4
 
5
- def self.db
6
- @db
5
+ def initialize path
6
+ @store = YAML::Store.new path
7
7
  end
8
8
 
9
- def self.find opts = {}
10
- opts = {tags: [], no_tags: []}.merge opts
11
- @db
12
- .select { |sig| opts[:tags].all? { |tag| sig.tagged_with? tag } }
13
- .reject { |sig| opts[:no_tags].any? { |tag| sig.tagged_with? tag } }
14
- .shuffle.first
9
+ def << sig
10
+ @store.transaction do
11
+ @store['signatures'] ||= []
12
+ @store['signatures'] << sig
13
+ end
15
14
  end
16
15
 
17
- def self.load path
18
- @path = path
19
- @db = File.exists?(@path) ? YAML.load_file(@path) : []
20
- end
21
-
22
- def self.min_yaml
23
- @db.to_yaml.gsub /^ (author|source|subject|tags): !!null \n/, ''
24
- end
16
+ def find opts = {}
17
+ opts = { tags: [], no_tags: [] }.merge opts
25
18
 
26
- def self.save sig
27
- @db << sig
28
- FileUtils.mkpath File.dirname @path
29
- File.open(@path, 'w') { |file| file << self.min_yaml }
19
+ @store.transaction true do
20
+ @store['signatures']
21
+ .select { |sig| opts[:tags].all? { |tag| sig.tagged_with? tag } }
22
+ .reject { |sig| opts[:no_tags].any? { |tag| sig.tagged_with? tag } }
23
+ .shuffle.first
24
+ end
30
25
  end
31
26
 
32
27
  end end
@@ -2,32 +2,46 @@
2
2
 
3
3
  module Signore class Executable
4
4
 
5
- def initialize args = ARGV, db = Database
5
+ def initialize args = ARGV, db_class = Database
6
6
  opts = Trollop.options args do
7
- opt :database, 'Location of the signature database', default: (ENV['XDG_DATA_HOME'] or File.expand_path '~/.local/share') + '/signore/signatures.yml'
7
+ opt :database, 'Location of the signature database', default: ENV.fetch('XDG_DATA_HOME') { File.expand_path '~/.local/share' } + '/signore/signatures.yml'
8
8
  end
9
9
  Trollop.die 'usage: signore prego|pronto [label, …]' unless ['prego', 'pronto'].include? args.first
10
- db.load opts[:database]
10
+
11
+ @db = db_class.new opts[:database]
12
+
11
13
  @action = args.shift
12
- @no_tags, @tags = args.partition { |tag| tag[0] == '~' }
14
+
15
+ @no_tags, @tags = args.partition { |tag| tag.start_with? '~' }
13
16
  @no_tags.map! { |tag| tag[1..-1] }
14
17
  end
15
18
 
16
- def run output = STDOUT, input = STDIN
19
+ def run input = $stdin
17
20
  case @action
18
21
  when 'prego'
19
- output.puts Database.find(tags: @tags, no_tags: @no_tags).display
22
+ sig = @db.find tags: @tags, no_tags: @no_tags
20
23
  when 'pronto'
21
- params = Hash[[:text, :author, :subject, :source].map do |elem|
22
- output.puts "#{elem}?"
23
- value = ''
24
- value << input.gets until value.lines.to_a.last == "\n"
25
- [elem, value.rstrip]
26
- end].delete_if { |elem, value| value.empty? }
24
+ params = get_params input
27
25
  sig = Signature.new params[:text], params[:author], params[:source], params[:subject], @tags
28
- Database.save sig
29
- output.puts sig.display
26
+ @db << sig
30
27
  end
28
+
29
+ puts sig.to_s
30
+ end
31
+
32
+ private
33
+
34
+ def get_param param, input
35
+ puts "#{param}?"
36
+ value = ''
37
+ value << input.gets until value.lines.to_a.last == "\n"
38
+ value.strip
39
+ end
40
+
41
+ def get_params input
42
+ Hash[[:text, :author, :subject, :source].map do |param|
43
+ [param, get_param(param, input)]
44
+ end].reject { |_, value| value.empty? }
31
45
  end
32
46
 
33
47
  end end
@@ -1,13 +1,21 @@
1
1
  module Signore class Signature < Struct.new :text, :author, :source, :subject, :tags
2
2
 
3
- def display
4
- Wrapper.new(text, meta).display
5
- end
6
-
7
3
  def tagged_with? tag
8
4
  tags and tags.include? tag
9
5
  end
10
6
 
7
+ def to_s
8
+ lines = text.split("\n").map { |line| LovelyRufus::Wrapper.new(line).wrapped 80 }
9
+
10
+ if meta
11
+ lines << "[#{meta}]"
12
+ max = lines.map { |line| line.split "\n" }.flatten.map(&:size).max
13
+ lines.last.insert 0, ' ' * (max - meta.size - 2)
14
+ end
15
+
16
+ lines.join "\n"
17
+ end
18
+
11
19
  private
12
20
 
13
21
  def meta
data/lib/signore.rb CHANGED
@@ -1,10 +1,9 @@
1
1
  require 'fileutils'
2
+ require 'lovely-rufus'
2
3
  require 'trollop'
3
- require 'yaml'
4
-
5
- YAML::ENGINE.yamler = 'psych' if defined? Psych
4
+ require 'psych'
5
+ require 'yaml/store'
6
6
 
7
7
  require_relative 'signore/database'
8
8
  require_relative 'signore/executable'
9
9
  require_relative 'signore/signature'
10
- require_relative 'signore/wrapper'
data/signore.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'signore'
3
- gem.version = '0.0.0'
3
+ gem.version = '0.1.0'
4
4
  gem.summary = 'signore: an email signature manager/randomiser'
5
5
  gem.homepage = 'http://github.com/chastell/signore'
6
6
  gem.author = 'Piotr Szotkowski'
@@ -10,6 +10,7 @@ Gem::Specification.new do |gem|
10
10
  gem.executables = Dir['bin/*'].map { |d| d.split '/' }.map &:last
11
11
  gem.test_files = Dir['spec/**/*.rb']
12
12
 
13
+ gem.add_dependency 'lovely-rufus'
13
14
  gem.add_dependency 'trollop'
14
15
  gem.add_development_dependency 'minitest', '>= 2.3'
15
16
  gem.add_development_dependency 'rake'
@@ -1,3 +1,4 @@
1
+ signatures:
1
2
  - !ruby/struct:Signore::Signature
2
3
  text: She was good at playing abstract confusion in the same way a midget is good at being short.
3
4
  author: Clive James
@@ -4,88 +4,55 @@ require_relative '../spec_helper'
4
4
 
5
5
  module Signore describe Database do
6
6
 
7
- before do
8
- @path = "#{Dir.tmpdir}/#{rand}/signatures.yml"
9
- end
10
-
11
- after do
12
- FileUtils.rmtree File.dirname @path
13
- end
14
-
15
- describe '.db' do
16
-
17
- it 'returns the signature database loaded by .load' do
18
- Database.load @path
19
- Database.db.must_equal []
20
- end
21
-
22
- end
23
-
24
- describe '.find' do
7
+ describe '#find' do
25
8
 
26
9
  before do
27
10
  srand
28
- Database.load 'spec/fixtures/signatures.yml'
11
+ @db = Database.new 'spec/fixtures/signatures.yml'
29
12
  end
30
13
 
31
14
  it 'returns a random signature by default' do
32
15
  srand 1981
33
- Database.find.text.must_equal 'Amateur fighter pilot ignores orders, listens to the voices in his head and slaughters thousands.'
16
+ @db.find.text.must_equal 'Amateur fighter pilot ignores orders, listens to the voices in his head and slaughters thousands.'
34
17
  srand 1979
35
- Database.find.text.must_equal 'stay-at-home executives vs. wallstreet dads'
18
+ @db.find.text.must_equal 'stay-at-home executives vs. wallstreet dads'
36
19
  end
37
20
 
38
21
  it 'returns a random signature if the tags are empty' do
39
22
  srand 2009
40
- Database.find(tags: []).text.must_equal '// sometimes I believe compiler ignores all my comments'
23
+ @db.find(tags: []).text.must_equal '// sometimes I believe compiler ignores all my comments'
41
24
  end
42
25
 
43
26
  it 'returns a random signature based on provided tags' do
44
- Database.find(tags: ['programming']).text.must_equal '// sometimes I believe compiler ignores all my comments'
45
- Database.find(tags: ['work']).text.must_equal 'You do have to be mad to work here, but it doesn’t help.'
27
+ @db.find(tags: ['programming']).text.must_equal '// sometimes I believe compiler ignores all my comments'
28
+ @db.find(tags: ['work']).text.must_equal 'You do have to be mad to work here, but it doesn’t help.'
46
29
  end
47
30
 
48
31
  it 'returns a random signature based on required and forbidden tags' do
49
- Database.find(tags: ['tech'], no_tags: ['programming', 'security']).text.must_equal 'You do have to be mad to work here, but it doesn’t help.'
32
+ @db.find(tags: ['tech'], no_tags: ['programming', 'security']).text.must_equal 'You do have to be mad to work here, but it doesn’t help.'
50
33
  end
51
34
 
52
35
  end
53
36
 
54
- describe '.load' do
55
-
56
- it 'creates an empty signature database if it does not exist, but does not save it' do
57
- refute Pathname(@path).exist?
58
- Database.load @path
59
- Database.db.must_equal []
60
- refute Pathname(@path).exist?
61
- end
62
-
63
- end
64
-
65
- describe '.save' do
37
+ describe '#save' do
66
38
 
67
39
  it 'saves the provided signature to disk' do
68
- Database.load @path
69
- sig = Signature.new 'Normaliser Unix c’est comme pasteuriser le camembert.'
70
- Database.save sig
71
- File.read(@path).must_equal "---\n- !ruby/struct:Signore::Signature\n text: Normaliser Unix c’est comme pasteuriser le camembert.\n"
72
- end
73
-
74
- end
75
-
76
- describe '.min_yaml' do
77
-
78
- it 'returns the minimal YAML representation of the signature database' do
79
- Database.load 'spec/fixtures/min_yaml.yml'
80
- Database.min_yaml.must_equal File.read('spec/fixtures/min_yaml.yml')
81
- end
82
-
83
- it 'escapes initial spaces in multi-line signatures' do
84
- tng = " ← space\nthe final\nfrontier"
85
- Database.load @path
86
- Database.save Signature.new tng
87
- Database.load @path
88
- Database.find.display.must_equal tng
40
+ file = Tempfile.new ''
41
+ db = Database.new file.path
42
+ sig = Signature.new 'Normaliser Unix c’est comme pasteuriser le camembert.'
43
+
44
+ db << sig
45
+
46
+ file.read.must_equal <<-END.dedent
47
+ ---
48
+ signatures:
49
+ - !ruby/struct:Signore::Signature
50
+ text: Normaliser Unix c’est comme pasteuriser le camembert.
51
+ author: !!null
52
+ source: !!null
53
+ subject: !!null
54
+ tags: !!null
55
+ END
89
56
  end
90
57
 
91
58
  end
@@ -6,52 +6,39 @@ module Signore describe Executable do
6
6
 
7
7
  describe '#initialize' do
8
8
 
9
- before do
10
- $stderr = StringIO.new
11
- end
12
-
13
- after do
14
- $stderr = STDERR
15
- end
16
-
17
- def stderr
18
- $stderr.rewind
19
- $stderr.read
20
- end
21
-
22
9
  it 'prints usage if no command is given' do
23
- lambda { Executable.new([]) }.must_raise SystemExit
24
- stderr.must_match /usage: signore prego\|pronto \[label, …\]/
10
+ stderr = capture_io { -> { Executable.new [] }.must_raise SystemExit }.last
11
+ stderr.must_include 'usage: signore prego|pronto [label, ]'
25
12
  end
26
13
 
27
14
  it 'prints usage if a bogus command is given' do
28
- lambda { Executable.new(['bogus']) }.must_raise SystemExit
29
- stderr.must_match /usage: signore prego\|pronto \[label, …\]/
15
+ stderr = capture_io { -> { Executable.new ['bogus'] }.must_raise SystemExit }.last
16
+ stderr.must_include 'usage: signore prego|pronto [label, ]'
30
17
  end
31
18
 
32
19
  it 'loads the signature database from the specified location' do
33
- db = MiniTest::Mock.new
34
- db.expect :load, nil, ['signatures.yml']
35
- Executable.new ['-d', 'signatures.yml', 'prego'], db
36
- db.verify
20
+ db_class = MiniTest::Mock.new
21
+ db_class.expect :new, nil, ['signatures.yml']
22
+ Executable.new ['-d', 'signatures.yml', 'prego'], db_class
23
+ db_class.verify
37
24
  end
38
25
 
39
26
  it 'loads the signature database from ~/.local/share/signore/signatures.yml if no location specified' do
40
27
  pending if ENV['XDG_DATA_HOME']
41
- db = MiniTest::Mock.new
42
- db.expect :load, nil, [File.expand_path('~/.local/share/signore/signatures.yml')]
43
- Executable.new ['prego'], db
44
- db.verify
28
+ db_class = MiniTest::Mock.new
29
+ db_class.expect :new, nil, [File.expand_path('~/.local/share/signore/signatures.yml')]
30
+ Executable.new ['prego'], db_class
31
+ db_class.verify
45
32
  end
46
33
 
47
34
  it 'loads the signature database from $XDG_DATA_HOME/signore/signatures.yml if $XDG_DATA_HOME is set' do
48
35
  begin
49
36
  orig_data_home = ENV.delete 'XDG_DATA_HOME'
50
37
  ENV['XDG_DATA_HOME'] = Dir.tmpdir
51
- db = MiniTest::Mock.new
52
- db.expect :load, nil, ["#{ENV['XDG_DATA_HOME']}/signore/signatures.yml"]
53
- Executable.new ['prego'], db
54
- db.verify
38
+ db_class = MiniTest::Mock.new
39
+ db_class.expect :new, nil, ["#{ENV['XDG_DATA_HOME']}/signore/signatures.yml"]
40
+ Executable.new ['prego'], db_class
41
+ db_class.verify
55
42
  ensure
56
43
  orig_data_home ? ENV['XDG_DATA_HOME'] = orig_data_home : ENV.delete('XDG_DATA_HOME')
57
44
  end
@@ -64,15 +51,18 @@ module Signore describe Executable do
64
51
  describe 'prego' do
65
52
 
66
53
  it 'prints a signature tagged with the provided tags' do
67
- Executable.new(['-d', 'spec/fixtures/signatures.yml', 'prego', 'tech', 'programming']).run output = StringIO.new
68
- output.rewind
69
- output.read.must_equal "// sometimes I believe compiler ignores all my comments\n"
54
+ stdout = capture_io { Executable.new(['-d', 'spec/fixtures/signatures.yml', 'prego', 'tech', 'programming']).run }.first
55
+ stdout.must_equal <<-END.dedent
56
+ // sometimes I believe compiler ignores all my comments
57
+ END
70
58
  end
71
59
 
72
60
  it 'prints a signature based on allowed and forbidden tags' do
73
- Executable.new(['-d', 'spec/fixtures/signatures.yml', 'prego', '~programming', 'tech', '~security']).run output = StringIO.new
74
- output.rewind
75
- output.read.must_equal "You do have to be mad to work here, but it doesn’t help.\n [Gary Barnes, asr]\n"
61
+ stdout = capture_io { Executable.new(['-d', 'spec/fixtures/signatures.yml', 'prego', '~programming', 'tech', '~security']).run }.first
62
+ stdout.must_equal <<-END.dedent
63
+ You do have to be mad to work here, but it doesn’t help.
64
+ [Gary Barnes, asr]
65
+ END
76
66
  end
77
67
 
78
68
  end
@@ -80,28 +70,49 @@ module Signore describe Executable do
80
70
  describe 'pronto' do
81
71
 
82
72
  before do
83
- @path = "#{Dir.tmpdir}/#{rand}/signatures.yml"
84
- end
85
-
86
- after do
87
- FileUtils.rmtree File.dirname @path
73
+ @file = Tempfile.new ''
88
74
  end
89
75
 
90
76
  it 'asks about signature parts and saves given signature with provided labels' do
91
- input = StringIO.new "The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.\n\nMark Pilgrim\n\n\n\n"
92
- Executable.new(['-d', @path, 'pronto', 'Wikipedia', 'ADHD']).run output = StringIO.new, input
93
- output.rewind
94
- output.read.must_equal "text?\nauthor?\nsubject?\nsource?\nThe Wikipedia page on ADHD is like 20 pages long. That’s just cruel.\n [Mark Pilgrim]\n"
95
- Executable.new(['-d', @path, 'prego', 'Wikipedia', 'ADHD']).run output = StringIO.new
96
- output.rewind
97
- output.read.must_equal "The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.\n [Mark Pilgrim]\n"
77
+ input = StringIO.new <<-END.dedent
78
+ The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.\n
79
+ Mark Pilgrim\n\n\n
80
+ END
81
+
82
+ stdout = capture_io { Executable.new(['-d', @file.path, 'pronto', 'Wikipedia', 'ADHD']).run input }.first
83
+ stdout.must_equal <<-END.dedent
84
+ text?
85
+ author?
86
+ subject?
87
+ source?
88
+ The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.
89
+ [Mark Pilgrim]
90
+ END
91
+
92
+ stdout = capture_io { Executable.new(['-d', @file.path, 'prego', 'Wikipedia', 'ADHD']).run }.first
93
+ stdout.must_equal <<-END.dedent
94
+ The Wikipedia page on ADHD is like 20 pages long. That’s just cruel.
95
+ [Mark Pilgrim]
96
+ END
98
97
  end
99
98
 
100
99
  it 'handles multi-line signatures' do
101
- input = StringIO.new "‘I’ve gone through over-stressed to physical exhaustion – what’s next?’\n‘Tuesday.’\n\nSimon Burr, Kyle Hearn\n\n\n\n"
102
- Executable.new(['-d', @path, 'pronto']).run output = StringIO.new, input
103
- output.rewind
104
- output.read.must_equal "text?\nauthor?\nsubject?\nsource?\n‘I’ve gone through over-stressed to physical exhaustion – what’s next?’\n‘Tuesday.’\n [Simon Burr, Kyle Hearn]\n"
100
+ input = StringIO.new <<-END.dedent
101
+ ‘I’ve gone through over-stressed to physical exhaustion what’s next?’
102
+ ‘Tuesday.’\n
103
+ Simon Burr, Kyle Hearn\n\n\n
104
+ END
105
+
106
+ stdout = capture_io { Executable.new(['-d', @file.path, 'pronto']).run input }.first
107
+ stdout.must_equal <<-END.dedent
108
+ text?
109
+ author?
110
+ subject?
111
+ source?
112
+ ‘I’ve gone through over-stressed to physical exhaustion – what’s next?’
113
+ ‘Tuesday.’
114
+ [Simon Burr, Kyle Hearn]
115
+ END
105
116
  end
106
117
 
107
118
  end
@@ -5,32 +5,68 @@ require_relative '../spec_helper'
5
5
  module Signore describe Signature do
6
6
 
7
7
  before do
8
- Database.load 'spec/fixtures/signatures.yml'
8
+ @confusion, @mad, @compiler, @bruce, @dads, @starwars = YAML.load_file('spec/fixtures/signatures.yml')['signatures']
9
9
  end
10
10
 
11
- describe '#display' do
11
+ describe '#tagged_with?' do
12
12
 
13
- it 'returns a signature formatted with meta information (if available)' do
14
- Database.db[2].display.must_equal '// sometimes I believe compiler ignores all my comments'
15
- Database.db[4].display.must_equal "stay-at-home executives vs. wallstreet dads\n [kodz]"
16
- Database.db[1].display.must_equal "You do have to be mad to work here, but it doesn’t help.\n [Gary Barnes, asr]"
17
- Database.db[3].display.must_equal "Bruce Schneier knows Alice and Bob’s shared secret.\n [Bruce Schneier Facts]"
18
- Database.db[0].display.must_equal "She was good at playing abstract confusion in\nthe same way a midget is good at being short.\n [Clive James on Marilyn Monroe]"
19
- Database.db[5].display.must_equal "Amateur fighter pilot ignores orders, listens to\nthe voices in his head and slaughters thousands.\n [Star Wars ending explained]"
13
+ it 'says whether a tagged signature is tagged with a given tag' do
14
+ refute @compiler.tagged_with? 'fnord'
15
+ assert @compiler.tagged_with? 'programming'
16
+ assert @compiler.tagged_with? 'tech'
17
+ end
18
+
19
+ it 'says that an untagged signature is not tagged with any tag' do
20
+ refute @dads.tagged_with? 'fnord'
20
21
  end
21
22
 
22
23
  end
23
24
 
24
- describe '#tagged_with?' do
25
+ describe '#to_s' do
26
+
27
+ it 'returns a signature formatted with meta information (if available)' do
28
+ @compiler.to_s.must_equal <<-END.dedent.strip
29
+ // sometimes I believe compiler ignores all my comments
30
+ END
31
+
32
+ @dads.to_s.must_equal <<-END.dedent.strip
33
+ stay-at-home executives vs. wallstreet dads
34
+ [kodz]
35
+ END
36
+
37
+ @mad.to_s.must_equal <<-END.dedent.strip
38
+ You do have to be mad to work here, but it doesn’t help.
39
+ [Gary Barnes, asr]
40
+ END
41
+
42
+ @bruce.to_s.must_equal <<-END.dedent.strip
43
+ Bruce Schneier knows Alice and Bob’s shared secret.
44
+ [Bruce Schneier Facts]
45
+ END
25
46
 
26
- it 'says whether a tagged signatura is tagged with a given tag' do
27
- refute Database.db[2].tagged_with? 'fnord'
28
- assert Database.db[2].tagged_with? 'programming'
29
- assert Database.db[2].tagged_with? 'tech'
47
+ @confusion.to_s.must_equal <<-END.dedent.strip
48
+ She was good at playing abstract confusion in
49
+ the same way a midget is good at being short.
50
+ [Clive James on Marilyn Monroe]
51
+ END
52
+
53
+ @starwars.to_s.must_equal <<-END.dedent.strip
54
+ Amateur fighter pilot ignores orders, listens to
55
+ the voices in his head and slaughters thousands.
56
+ [Star Wars ending explained]
57
+ END
30
58
  end
31
59
 
32
- it 'says that an untagged signature is not tagged with any tag' do
33
- refute Database.db[4].tagged_with? 'fnord'
60
+ it 'handles edge cases properly' do
61
+ class SignatureWithMeta < Signature
62
+ attr_accessor :meta
63
+ end
64
+
65
+ YAML.load_file('spec/fixtures/wrapper.yml').each do |sample|
66
+ sig = SignatureWithMeta.new sample[:text]
67
+ sig.meta = sample[:meta]
68
+ sig.to_s.must_equal sample[:wrapped]
69
+ end
34
70
  end
35
71
 
36
72
  end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,13 @@ gem 'minitest'
2
2
  require 'minitest/autorun'
3
3
 
4
4
  require 'pathname'
5
+ require 'tempfile'
5
6
  require 'tmpdir'
6
7
 
7
8
  require_relative '../lib/signore'
9
+
10
+ class String
11
+ def dedent
12
+ gsub /^#{self[/\A\s*/]}/, ''
13
+ end
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: signore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-13 00:00:00.000000000Z
12
+ date: 2011-10-15 00:00:00.000000000Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: lovely-rufus
16
+ requirement: &15779140 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *15779140
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: trollop
16
- requirement: &9662320 !ruby/object:Gem::Requirement
27
+ requirement: &15778700 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
30
  - - ! '>='
@@ -21,10 +32,10 @@ dependencies:
21
32
  version: '0'
22
33
  type: :runtime
23
34
  prerelease: false
24
- version_requirements: *9662320
35
+ version_requirements: *15778700
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: minitest
27
- requirement: &9649680 !ruby/object:Gem::Requirement
38
+ requirement: &15778200 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: '2.3'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *9649680
46
+ version_requirements: *15778200
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: rake
38
- requirement: &9649260 !ruby/object:Gem::Requirement
49
+ requirement: &15777780 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,7 +54,7 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *9649260
57
+ version_requirements: *15777780
47
58
  description:
48
59
  email: chastell@chastell.net
49
60
  executables:
@@ -62,15 +73,12 @@ files:
62
73
  - lib/signore/database.rb
63
74
  - lib/signore/executable.rb
64
75
  - lib/signore/signature.rb
65
- - lib/signore/wrapper.rb
66
76
  - signore.gemspec
67
- - spec/fixtures/min_yaml.yml
68
77
  - spec/fixtures/signatures.yml
69
78
  - spec/fixtures/wrapper.yml
70
79
  - spec/signore/database_spec.rb
71
80
  - spec/signore/executable_spec.rb
72
81
  - spec/signore/signature_spec.rb
73
- - spec/signore/wrapper_spec.rb
74
82
  - spec/spec_helper.rb
75
83
  homepage: http://github.com/chastell/signore
76
84
  licenses: []
@@ -100,5 +108,4 @@ test_files:
100
108
  - spec/spec_helper.rb
101
109
  - spec/signore/database_spec.rb
102
110
  - spec/signore/signature_spec.rb
103
- - spec/signore/wrapper_spec.rb
104
111
  - spec/signore/executable_spec.rb
@@ -1,65 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Signore class Wrapper
4
-
5
- NBSP = ' '
6
-
7
- def initialize text, meta
8
- @lines = text.split "\n"
9
- @meta = meta
10
- end
11
-
12
- def display
13
- wrap
14
- add_meta if @meta
15
- @lines.join "\n"
16
- end
17
-
18
- private
19
-
20
- def add_meta
21
- @lines << "[#{@meta}]"
22
- @lines.last.insert 0, ' ' * (width - @meta.size - 2)
23
- end
24
-
25
- def find_hangout wrapped
26
- lines = wrapped.split "\n"
27
- lines.each_with_index do |line, nr|
28
- space = line.rindex /[ #{NBSP}]/
29
- next unless space and nr < lines.size - 1
30
- return nr if nr > 0 and space >= lines[nr - 1].size
31
- return nr if nr < lines.size - 2 and space >= lines[nr + 1].size
32
- return nr if nr < lines.size - 1 and space >= lines[nr + 1].size and lines.size == 2
33
- end
34
- nil
35
- end
36
-
37
- def width
38
- @lines.map { |line| line.split "\n" }.flatten.map(&:size).max
39
- end
40
-
41
- def wrap
42
- @lines.map! do |line|
43
- best_wrap = wrap_line_to line, 80
44
- 79.downto 1 do |size|
45
- new_wrap = wrap_line_to line, size
46
- break if new_wrap.count("\n") > best_wrap.count("\n")
47
- best_wrap = new_wrap
48
- end
49
- best_wrap.chomp
50
- end
51
- end
52
-
53
- def wrap_line_to line, size
54
- line = line.gsub(/ ([^ ]) /, " \\1#{NBSP}")
55
- line = line.gsub(/(.{1,#{size}})( |$\n?)/, "\\1\n")
56
- if hangout = find_hangout(line)
57
- lines = line.split "\n"
58
- lines[hangout] << NBSP
59
- line = lines.join(' ').gsub("#{NBSP} ", NBSP)
60
- line = wrap_line_to line, size
61
- end
62
- line.tr NBSP, ' '
63
- end
64
-
65
- end end
@@ -1,39 +0,0 @@
1
- ---
2
- - !ruby/struct:Signore::Signature
3
- text: Patches are like Free Software love letters.
4
- - !ruby/struct:Signore::Signature
5
- text: It’s 8:21 AM, do you know where your process is? Call 0-800-GREP to find out
6
- more how YOU can prevent zombification.
7
- author: opi
8
- tags:
9
- - programming
10
- - Unix
11
- - !ruby/struct:Signore::Signature
12
- text: ! '‘Humor. It is a difficult concept: It is not logical.’
13
-
14
- ‘We learn by doing.’'
15
- source: ! 'Star Trek: The Wrath of Khan'
16
- - !ruby/struct:Signore::Signature
17
- text: In 1940 he summarized his work in an influential book, ‘Punched Card Methods
18
- in Scientific Computation’.
19
- author: Paul E. Ceruzzi
20
- source: A History of Modern Computing
21
- subject: on Wallace Eckert
22
- - !ruby/struct:Signore::Signature
23
- text: ! 'Idea: A James Cameron-directed prequel entitled ''T\0: The Null Terminator''.'
24
- author: Matthew Baldwin
25
- - !ruby/struct:Signore::Signature
26
- text: ! 'The #1 lesson I learned on my one and only trip to the Caribbean is that
27
- society will not actually collapse if you walk down a public street with a beer
28
- in your hand. Who woulda thunk?'
29
- author: J.D. Baldwin
30
- - !ruby/struct:Signore::Signature
31
- text: '3:10'
32
- author: Elmore Leonard
33
- - !ruby/struct:Signore::Signature
34
- text: ! ' ← space, the final frontier'
35
- - !ruby/struct:Signore::Signature
36
- text: Just got another wonderful request from the client… you’re going to lie this
37
- one.
38
- author: Chris Ivens
39
- source: ! '#civicrm'
@@ -1,15 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- module Signore describe Wrapper do
4
-
5
- describe '#display' do
6
-
7
- it 'returns properly wrapped signature (with possible meta information)' do
8
- YAML.load_file('spec/fixtures/wrapper.yml').each do |sample|
9
- Wrapper.new(sample[:text], sample[:meta]).display.must_equal sample[:wrapped]
10
- end
11
- end
12
-
13
- end
14
-
15
- end end