lemon 0.9.0 → 0.9.1
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.
- data/.ruby +23 -14
- data/.yardopts +6 -0
- data/Config.rb +14 -0
- data/{HISTORY.rdoc → HISTORY.md} +26 -11
- data/LICENSE.txt +27 -0
- data/README.md +42 -28
- data/SPECSHEET.md +314 -0
- data/bin/{lemonade → lemons} +0 -0
- data/lib/lemon.yml +23 -14
- data/lib/lemon/cli.rb +19 -8
- data/lib/lemon/cli/base.rb +50 -20
- data/lib/lemon/cli/generate.rb +51 -16
- data/lib/lemon/cli/lemon.ascii +84 -0
- data/lib/lemon/cli/obrother.rb +35 -0
- data/lib/lemon/cli/scaffold.rb +116 -0
- data/lib/lemon/core_ext.rb +2 -2
- data/lib/lemon/core_ext/module.rb +9 -0
- data/lib/lemon/coverage/analyzer.rb +76 -5
- data/lib/lemon/coverage/cover_unit.rb +38 -14
- data/lib/lemon/coverage/formats/verbose.rb +1 -1
- data/lib/lemon/coverage/generator.rb +196 -0
- data/lib/lemon/coverage/snapshot.rb +16 -16
- data/lib/lemon/coverage/source_parser.rb +103 -37
- data/lib/lemon/ignore_callers.rb +19 -0
- data/lib/lemon/test_case.rb +135 -26
- data/lib/lemon/test_class.rb +16 -3
- data/lib/lemon/test_class_method.rb +58 -0
- data/lib/lemon/test_method.rb +57 -68
- data/lib/lemon/test_module.rb +47 -44
- data/lib/lemon/test_proc.rb +28 -2
- data/lib/lemon/test_scope.rb +14 -0
- data/lib/lemon/test_setup.rb +1 -1
- data/lib/lemon/test_world.rb +7 -0
- data/{work/deprecated/features/support → spec/applique}/ae.rb +0 -0
- data/spec/coverage/{01_complete.rdoc → 01_complete.md} +3 -3
- data/spec/coverage/{02_incomplete.rdoc → 02_incomplete.md} +2 -2
- data/spec/coverage/{03_extensions.rdoc → 03_extensions.md} +2 -2
- data/try/case_scope.rb +19 -0
- metadata +50 -102
- data/.gemspec +0 -152
- data/.gitignore +0 -8
- data/.reap/digest +0 -678
- data/.reap/test.reap +0 -7
- data/Assembly +0 -37
- data/COPYING.rdoc +0 -33
- data/MANIFEST +0 -55
- data/PROFILE +0 -30
- data/Rakefile +0 -23
- data/VERSION +0 -1
- data/lib/lemon/core_ext/omission.rb +0 -18
- data/lib/lemon/generator.rb +0 -149
- data/notes/2010-05-05-coverage.rdoc +0 -47
- data/notes/2010-05-06-files-not-classes.rdoc +0 -19
- data/notes/2010-07-11-acid-testing.rdoc +0 -52
- data/notes/2010-08-02-enforcing-the-unit.md +0 -68
- data/notes/2010-08-03-new-api.md +0 -37
- data/notes/2011-07-07-nailing-down-the-nomenclature.md +0 -6
- data/site/.rsync-filter +0 -8
- data/site/assets/images/cut-lemon.png +0 -0
- data/site/assets/images/forkme.png +0 -0
- data/site/assets/images/github-logo.png +0 -0
- data/site/assets/images/lemon.jpg +0 -0
- data/site/assets/images/lemon.svg +0 -39
- data/site/assets/images/lemons-are-good.png +0 -0
- data/site/assets/images/opensource.png +0 -0
- data/site/assets/images/ruby-logo.png +0 -0
- data/site/assets/images/skin.jpg +0 -0
- data/site/assets/images/skin1.jpg +0 -0
- data/site/assets/images/tap.png +0 -0
- data/site/assets/images/title.png +0 -0
- data/site/assets/styles/class.css +0 -6
- data/site/assets/styles/reset.css +0 -17
- data/site/assets/styles/site.css +0 -33
- data/site/index.html +0 -218
- data/work/deprecated/command/abstract.rb +0 -29
- data/work/deprecated/command/coverage.rb +0 -115
- data/work/deprecated/command/generate.rb +0 -124
- data/work/deprecated/command/test.rb +0 -112
- data/work/deprecated/cucumber.yml +0 -3
- data/work/deprecated/features/coverage.feature +0 -65
- data/work/deprecated/features/generate.feature +0 -66
- data/work/deprecated/features/step_definitions/coverage_steps.rb +0 -1
- data/work/deprecated/features/support/aruba.rb +0 -1
- data/work/deprecated/features/test.feature +0 -67
- data/work/deprecated/model/dsl/advice.rb +0 -78
- data/work/deprecated/model/dsl/subject.rb +0 -40
- data/work/deprecated/model/main.rb +0 -87
- data/work/deprecated/model/test.rb +0 -54
- data/work/deprecated/model/test_base_dsl.rb +0 -88
- data/work/deprecated/model/test_clause.rb +0 -112
- data/work/deprecated/model/test_context.rb +0 -90
- data/work/deprecated/model/test_feature.rb +0 -128
- data/work/deprecated/model/test_scenario.rb +0 -137
- data/work/deprecated/model/test_suite.rb +0 -297
- data/work/deprecated/rake.rb +0 -103
- data/work/deprecated/test/case_coverage_analyzer.rb +0 -25
- data/work/deprecated/test/case_test_case_dsl.rb +0 -46
- data/work/deprecated/test/fixtures/case_complete.rb +0 -25
- data/work/deprecated/test/fixtures/case_inclusion.rb +0 -18
- data/work/deprecated/test/fixtures/case_incomplete.rb +0 -12
- data/work/deprecated/test/fixtures/example.rb +0 -13
- data/work/deprecated/test/fixtures/helper.rb +0 -13
- data/work/deprecated/test/runner +0 -2
- data/work/old-tests/case_example.rb +0 -15
- data/work/old-tests/feature_example.rb +0 -40
- data/work/reference/dsl2.rb +0 -140
- data/work/reference/dynamic_constant_lookup.rb +0 -76
data/bin/{lemonade → lemons}
RENAMED
|
File without changes
|
data/lib/lemon.yml
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
+
source:
|
|
3
|
+
- meta
|
|
4
|
+
- VERSION
|
|
2
5
|
authors:
|
|
3
6
|
- name: Thomas Sawyer
|
|
4
7
|
email: transfire@gmail.com
|
|
5
8
|
copyrights:
|
|
6
|
-
- holder:
|
|
9
|
+
- holder: Rubyworks
|
|
7
10
|
year: '2009'
|
|
8
11
|
license: BSD-2-Clause
|
|
9
|
-
replacements: []
|
|
10
|
-
conflicts: []
|
|
11
12
|
requirements:
|
|
12
|
-
- name:
|
|
13
|
+
- name: rubytest
|
|
13
14
|
- name: ae
|
|
14
15
|
- name: ansi
|
|
15
16
|
version: 1.3+
|
|
@@ -25,25 +26,33 @@ requirements:
|
|
|
25
26
|
groups:
|
|
26
27
|
- test
|
|
27
28
|
development: true
|
|
29
|
+
- name: ripper
|
|
30
|
+
optional: true
|
|
31
|
+
engines:
|
|
32
|
+
- name: ruby
|
|
33
|
+
version: 1.8~
|
|
28
34
|
dependencies: []
|
|
35
|
+
alternatives: []
|
|
36
|
+
conflicts: []
|
|
29
37
|
repositories:
|
|
30
38
|
- uri: git://github.com/proutils/lemon.git
|
|
31
39
|
scm: git
|
|
32
|
-
name:
|
|
40
|
+
name: upstream
|
|
33
41
|
resources:
|
|
34
42
|
home: http://rubyworks.github.com/lemon
|
|
35
43
|
code: http://github.com/rubyworks/lemon
|
|
44
|
+
bugs: http://github.com/rubyworks/lemon/issues
|
|
45
|
+
extra: {}
|
|
36
46
|
load_path:
|
|
37
47
|
- lib
|
|
38
|
-
extra:
|
|
39
|
-
manifest: MANIFEST
|
|
40
|
-
alternatives: []
|
|
41
48
|
revision: 0
|
|
49
|
+
created: '2009-10-25'
|
|
50
|
+
summary: Pucker-strength Unit Testing
|
|
42
51
|
title: Lemon
|
|
43
|
-
summary: Pucker-tight Unit Testing
|
|
44
|
-
description: Lemon is a unit testing framework that tightly correlates class to test
|
|
45
|
-
case and method to test unit.
|
|
46
|
-
organization: RubyWorks
|
|
47
|
-
version: 0.9.0
|
|
48
52
|
name: lemon
|
|
49
|
-
|
|
53
|
+
description: ! 'Lemon is a unit testing framework that tightly correlates
|
|
54
|
+
|
|
55
|
+
class to test case and method to test unit.'
|
|
56
|
+
organization: rubyworks
|
|
57
|
+
version: 0.9.1
|
|
58
|
+
date: '2012-03-09'
|
data/lib/lemon/cli.rb
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
#require 'lemon/cli/
|
|
1
|
+
#require 'lemon/cli/runner'
|
|
2
2
|
require 'lemon/cli/generate'
|
|
3
|
+
require 'lemon/cli/scaffold'
|
|
3
4
|
require 'lemon/cli/coverage'
|
|
5
|
+
require 'lemon/cli/obrother'
|
|
4
6
|
|
|
5
7
|
module Lemon
|
|
6
8
|
|
|
9
|
+
# CLI Interfaces handle all lemon sub-commands.
|
|
10
|
+
#
|
|
11
|
+
module CLI
|
|
12
|
+
end
|
|
13
|
+
|
|
7
14
|
#--
|
|
8
|
-
# TODO: Use Lemon::CLI::Runner and have it delegate to
|
|
15
|
+
# TODO: Use Lemon::CLI::Runner and have it delegate to RubyTest ?
|
|
9
16
|
#++
|
|
10
17
|
|
|
11
18
|
# Command line interface takes the first argument off `argv` to determine
|
|
@@ -15,15 +22,19 @@ module Lemon
|
|
|
15
22
|
def self.cli(*argv)
|
|
16
23
|
cmd = argv.shift
|
|
17
24
|
case cmd
|
|
18
|
-
when 'test'
|
|
25
|
+
when 't', 'test', 'run'
|
|
19
26
|
require 'lemon'
|
|
20
|
-
require '
|
|
27
|
+
require 'rubytest'
|
|
21
28
|
Test::Runner.cli(*ARGV)
|
|
22
29
|
#Lemon::CLI::Test.new.run(argv)
|
|
23
|
-
when
|
|
24
|
-
Lemon::CLI::Generate.
|
|
25
|
-
when
|
|
26
|
-
Lemon::CLI::
|
|
30
|
+
when 'g', 'gen', 'generate', 'generator'
|
|
31
|
+
Lemon::CLI::Generate.run(argv)
|
|
32
|
+
when 's', 'sca', 'scaffold'
|
|
33
|
+
Lemon::CLI::Scaffold.run(argv)
|
|
34
|
+
when 'c', 'cov', 'cover', 'coverage'
|
|
35
|
+
Lemon::CLI::Coverage.run(argv)
|
|
36
|
+
when 'are'
|
|
37
|
+
Lemon::CLI::OBrother.run(argv)
|
|
27
38
|
else
|
|
28
39
|
# run tests instead?
|
|
29
40
|
puts "invalid lemon command -- #{cmd}"
|
data/lib/lemon/cli/base.rb
CHANGED
|
@@ -2,17 +2,14 @@ module Lemon
|
|
|
2
2
|
|
|
3
3
|
require 'optparse'
|
|
4
4
|
|
|
5
|
-
# TODO: What about a config file?
|
|
6
|
-
|
|
7
|
-
# CLI Interfaces handle all lemon sub-commands.
|
|
8
5
|
module CLI
|
|
9
6
|
|
|
10
7
|
# Base class for all commands.
|
|
11
8
|
class Base
|
|
12
9
|
|
|
13
10
|
#
|
|
14
|
-
def
|
|
15
|
-
|
|
11
|
+
def self.run(argv)
|
|
12
|
+
new.run(argv)
|
|
16
13
|
end
|
|
17
14
|
|
|
18
15
|
#
|
|
@@ -25,12 +22,28 @@ module Lemon
|
|
|
25
22
|
begin
|
|
26
23
|
command_parse(argv)
|
|
27
24
|
command_run(argv)
|
|
28
|
-
rescue => err
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
#rescue => err
|
|
26
|
+
# raise err if $DEBUG
|
|
27
|
+
# $stderr.puts('ERROR: ' + err.to_s)
|
|
31
28
|
end
|
|
32
29
|
end
|
|
33
30
|
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Initialize new command instance. This will be overriden in subclasses.
|
|
35
|
+
#
|
|
36
|
+
def initialize(argv=ARGV)
|
|
37
|
+
@options = {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# Parse command line argument. This is a no-op as it will be overridden
|
|
42
|
+
# in subclasses.
|
|
43
|
+
#
|
|
44
|
+
def command_parse(argv)
|
|
45
|
+
end
|
|
46
|
+
|
|
34
47
|
#
|
|
35
48
|
def option_parser
|
|
36
49
|
@option_parser ||= (
|
|
@@ -54,7 +67,7 @@ module Lemon
|
|
|
54
67
|
)
|
|
55
68
|
end
|
|
56
69
|
|
|
57
|
-
#
|
|
70
|
+
# -n --namespace
|
|
58
71
|
def option_namespaces
|
|
59
72
|
option_parser.on('-n', '--namespace NAME', 'add a namespace to output') do |name|
|
|
60
73
|
options[:namespaces] ||= []
|
|
@@ -68,54 +81,63 @@ module Lemon
|
|
|
68
81
|
# end
|
|
69
82
|
#end
|
|
70
83
|
|
|
84
|
+
# -f --format
|
|
71
85
|
def option_format
|
|
72
86
|
option_parser.on('-f', '--format NAME', 'output format') do |name|
|
|
73
87
|
options[:format] = name
|
|
74
88
|
end
|
|
75
89
|
end
|
|
76
90
|
|
|
91
|
+
# -v --verbose
|
|
77
92
|
def option_verbose
|
|
78
93
|
option_parser.on('-v', '--verbose', 'shortcut for `-f verbose`') do |name|
|
|
79
94
|
options[:format] = 'verbose'
|
|
80
95
|
end
|
|
81
96
|
end
|
|
82
97
|
|
|
83
|
-
|
|
98
|
+
# -c --covered, -u --uncovered and -a --all
|
|
99
|
+
def option_coverage
|
|
84
100
|
option_parser.on('-c', '--covered', 'include covered units') do
|
|
85
|
-
|
|
101
|
+
if options[:coverage] == :uncovered
|
|
102
|
+
options[:coverage] = :all
|
|
103
|
+
else
|
|
104
|
+
options[:coverage] = :covered
|
|
105
|
+
end
|
|
86
106
|
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def option_uncovered
|
|
90
107
|
option_parser.on('-u', '--uncovered', 'include only uncovered units') do
|
|
91
|
-
options[:
|
|
108
|
+
if options[:coverage] == :covered
|
|
109
|
+
options[:coverage] = :all
|
|
110
|
+
else
|
|
111
|
+
options[:coverage] = :uncovered
|
|
112
|
+
end
|
|
92
113
|
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def option_all
|
|
96
114
|
option_parser.on('-a', '--all', 'include all namespaces and units') do
|
|
97
|
-
options[:
|
|
115
|
+
options[:coverage] = :all
|
|
98
116
|
end
|
|
99
117
|
end
|
|
100
118
|
|
|
119
|
+
# -p --private
|
|
101
120
|
def option_private
|
|
102
121
|
option_parser.on('-p', '--private', 'include private and protected methods') do
|
|
103
122
|
options[:private] = true
|
|
104
123
|
end
|
|
105
124
|
end
|
|
106
125
|
|
|
126
|
+
# -z --zealous
|
|
107
127
|
def option_zealous
|
|
108
128
|
option_parser.on('-z', '--zealous', 'include undefined case methods') do
|
|
109
129
|
options[:zealous] = true
|
|
110
130
|
end
|
|
111
131
|
end
|
|
112
132
|
|
|
133
|
+
# -o --output
|
|
113
134
|
def option_output
|
|
114
|
-
option_parser.on('-o', '--output DIRECTORY', '
|
|
135
|
+
option_parser.on('-o', '--output DIRECTORY', 'output directory') do |dir|
|
|
115
136
|
options[:output] = dir
|
|
116
137
|
end
|
|
117
138
|
end
|
|
118
139
|
|
|
140
|
+
# -I
|
|
119
141
|
def option_loadpath
|
|
120
142
|
option_parser.on("-I PATH" , 'add directory to $LOAD_PATH') do |path|
|
|
121
143
|
paths = path.split(/[:;]/)
|
|
@@ -124,6 +146,7 @@ module Lemon
|
|
|
124
146
|
end
|
|
125
147
|
end
|
|
126
148
|
|
|
149
|
+
# -r
|
|
127
150
|
def option_requires
|
|
128
151
|
option_parser.on("-r FILE" , 'require file(s) (before doing anything else)') do |files|
|
|
129
152
|
files = files.split(/[:;]/)
|
|
@@ -132,6 +155,13 @@ module Lemon
|
|
|
132
155
|
end
|
|
133
156
|
end
|
|
134
157
|
|
|
158
|
+
# --dryrun
|
|
159
|
+
def option_dryrun
|
|
160
|
+
option_parser.on('--dryrun', 'no disk writes') do
|
|
161
|
+
options[:dryrun] = true
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
135
165
|
end
|
|
136
166
|
|
|
137
167
|
end
|
data/lib/lemon/cli/generate.rb
CHANGED
|
@@ -5,11 +5,20 @@ module Lemon
|
|
|
5
5
|
require 'lemon/cli/base'
|
|
6
6
|
|
|
7
7
|
# Generate Command
|
|
8
|
+
#
|
|
8
9
|
class Generate < Base
|
|
9
10
|
|
|
10
11
|
# Generate test templates.
|
|
11
|
-
def command_run(
|
|
12
|
-
|
|
12
|
+
def command_run(files)
|
|
13
|
+
if i = files.index('-')
|
|
14
|
+
options[:files] = files[0...i]
|
|
15
|
+
options[:tests] = files[i+1..-1]
|
|
16
|
+
else
|
|
17
|
+
options[:files] = files
|
|
18
|
+
options[:tests] = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
require 'lemon/coverage/generator'
|
|
13
22
|
|
|
14
23
|
loadpath = options[:loadpath] || []
|
|
15
24
|
requires = options[:requires] || []
|
|
@@ -17,31 +26,57 @@ module Lemon
|
|
|
17
26
|
loadpath.each{ |path| $LOAD_PATH.unshift(path) }
|
|
18
27
|
requires.each{ |path| require(path) }
|
|
19
28
|
|
|
20
|
-
|
|
21
|
-
#suite = Lemon::TestSuite.new(test_files, :cover=>cover) #, :cover_all=>true)
|
|
22
|
-
generator = Lemon::Generator.new(test_files, options)
|
|
29
|
+
generator = Lemon::Generator.new(options)
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
render_map = generator.generate
|
|
32
|
+
|
|
33
|
+
generate_output(render_map)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
def generate_output(render_map)
|
|
38
|
+
render_map.each do |group, test|
|
|
39
|
+
puts "# --- #{group} ---"
|
|
40
|
+
puts
|
|
41
|
+
puts test
|
|
42
|
+
puts
|
|
43
|
+
end
|
|
29
44
|
end
|
|
30
45
|
|
|
31
46
|
#
|
|
32
47
|
def command_parse(argv)
|
|
33
|
-
option_parser.banner = "Usage:
|
|
34
|
-
|
|
48
|
+
option_parser.banner = "Usage: lemons generate [options] [files ...]"
|
|
49
|
+
|
|
50
|
+
setup_options
|
|
51
|
+
|
|
52
|
+
option_parser.parse!(argv)
|
|
53
|
+
end
|
|
35
54
|
|
|
55
|
+
#
|
|
56
|
+
def setup_options
|
|
57
|
+
option_group
|
|
36
58
|
option_namespaces
|
|
37
|
-
option_covered
|
|
38
|
-
option_uncovered
|
|
39
|
-
option_all
|
|
40
59
|
option_private
|
|
60
|
+
option_caps
|
|
41
61
|
option_loadpath
|
|
42
62
|
option_requires
|
|
63
|
+
end
|
|
43
64
|
|
|
44
|
-
|
|
65
|
+
# -f --file
|
|
66
|
+
def option_group
|
|
67
|
+
option_parser.on('-f', '--file', 'group tests by file') do
|
|
68
|
+
options[:group] = :file
|
|
69
|
+
end
|
|
70
|
+
#option_parser.on('-c', '--case', 'group tests by case') do
|
|
71
|
+
# options[:group] = :case
|
|
72
|
+
#end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# -C --caps
|
|
76
|
+
def option_caps
|
|
77
|
+
option_parser.on('-C', '--caps', 'use capitalized test terms') do
|
|
78
|
+
options[:caps] = true
|
|
79
|
+
end
|
|
45
80
|
end
|
|
46
81
|
|
|
47
82
|
end
|
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
@@,,,,,,,,,,......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@
|
|
39
|
+
@@,,,:,,,,,,,,.....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:;@
|
|
40
|
+
@@,,,,,,,,,,,,.....................,,,,,,,,,,,,,,,,;',,,,,,,,,,,,,,,,,,:@,
|
|
41
|
+
'@@@+:,,,,,,,,,.....................,,,,,,,,,,,,,,,,@@,,,,,,,,,,,,,,,,,,'@
|
|
42
|
+
@@@@@,,,,,,,,,,,...................,,,,,,,,,,,,,,,,,++,,,,,,,,,,,,,,,,,,@@
|
|
43
|
+
@@@@#@,,,,,,,,,,,...,@+...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'@;
|
|
44
|
+
@@#@#@:,,,,,,,,,,...@@@...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@
|
|
45
|
+
@@@@#,,,,,,,,,,,,,...@'.........,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,@@.
|
|
46
|
+
@@@@,,,,,,,,,,,,,,,,..........,,,,,,,,,,,,,,,,,,,,,,,,,@@;,,,,,,,,,,,+@@
|
|
47
|
+
`@',,,,,,,,,,,,,,,,,,,......,,,,,,,,,,,,,,,,,,,,,,,,,,@@#,,,,,,,,,,,,@@
|
|
48
|
+
@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@+,,,,,,,,,,,,#@'
|
|
49
|
+
:@@;,,,,,,,,,,,,,,@+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#@@;,,,,,,,,,,,,,@@
|
|
50
|
+
+@@#,,,,,,,,,,,,,@@@+,,,,,,,,,,,,,,,,,,,,,,,,,,:@@@,,,,,,,,,,,,,,'@;
|
|
51
|
+
@@',:,,,,,,,,,,,:@@@@,,,,,,,,,,,,,,,,,,,,,,'@@@+,,,,,,,,,,,,,,:@@
|
|
52
|
+
@@,,,,,,,,,,,,,,,:@@@@@',,,,,,,,,,,,,,,'@@@@+,,,,,,,,,,,,,,,,#@,
|
|
53
|
+
'@@,,,,,,,,,,,,,,,,,+@@@@@@@@@@@@@@@@@@@@@:,,,,,,,,,,,,,,,,,,@@
|
|
54
|
+
@@,,,,,,,,,,,,,,,,,,,,,;#@@@@@@@@@@@+;,,,,,,,,,,,,,,,,,,,,,@@`
|
|
55
|
+
#@#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#@#
|
|
56
|
+
@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@
|
|
57
|
+
@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#@#
|
|
58
|
+
'@#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+@@
|
|
59
|
+
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@
|
|
60
|
+
@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;@@'
|
|
61
|
+
,@@',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@
|
|
62
|
+
@@@',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;@@@
|
|
63
|
+
;@@@@:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:+@@@@.
|
|
64
|
+
.@@@@@+:,,,,,,,,,,,,,,,,,,,,,,,,;@@@@@@'
|
|
65
|
+
`@@@@@@@@##;;;:,,,,,,;####@@@@@@:
|
|
66
|
+
`;@@@@@@@@@@@@@@@@@@@@@@@`
|
|
67
|
+
```,;@#:::`
|
|
68
|
+
@
|
|
69
|
+
@,
|
|
70
|
+
`@; `@
|
|
71
|
+
@`@ `@. #@`
|
|
72
|
+
@ @ @ @@ @@@ @+@`@.@@
|
|
73
|
+
.@ ' @ @ @ @` @+@`,' ,#@ @@ @@
|
|
74
|
+
'@@# .'@ @`@ ;@# #@; @@' +@. @@:,@@`# @ @ ,+@;`@##@@. @
|
|
75
|
+
@ @#`@ .@@@ @ @`#@ @;#:;@ @ `@@ @ @@@ @@ . . .
|
|
76
|
+
@ @@ +@ @ @ @ @ @@ '+ ,# @ @+@ .
|
|
77
|
+
@'#@#; # :@. @@ ++ @. @ @ @ .
|
|
78
|
+
'; , .+ @ @#+ @ ' @
|
|
79
|
+
@# . @
|
|
80
|
+
@
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Lemon
|
|
2
|
+
|
|
3
|
+
module CLI
|
|
4
|
+
|
|
5
|
+
require 'lemon/cli/base'
|
|
6
|
+
|
|
7
|
+
# The ol' "Sing it, Brother" Command.
|
|
8
|
+
#
|
|
9
|
+
class OBrother < Base
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
def command_run(argv)
|
|
13
|
+
if argv.any?{ |a| a.downcase == 'good' }
|
|
14
|
+
show_ascii_art
|
|
15
|
+
else
|
|
16
|
+
puts "No, they are GOOD!"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
def show_ascii_art
|
|
22
|
+
string = File.read(File.dirname(__FILE__) + '/lemon.ascii')
|
|
23
|
+
begin
|
|
24
|
+
require 'ansi'
|
|
25
|
+
puts string.ansi(:yellow)
|
|
26
|
+
rescue LoadError
|
|
27
|
+
puts string
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|