aslakhellesoy-bcat 0.6.0.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/CONTRIBUTING +13 -0
- data/COPYING +19 -0
- data/INSTALLING +10 -0
- data/README +48 -0
- data/RELEASING +10 -0
- data/Rakefile +83 -0
- data/bcat.gemspec +60 -0
- data/bin/a2h +15 -0
- data/bin/bcat +79 -0
- data/bin/btee +2 -0
- data/contrib/bman +26 -0
- data/lib/bcat.rb +118 -0
- data/lib/bcat/ansi.rb +170 -0
- data/lib/bcat/browser.rb +68 -0
- data/lib/bcat/html.rb +106 -0
- data/lib/bcat/reader.rb +102 -0
- data/lib/bcat/server.rb +113 -0
- data/man/a2h.1 +55 -0
- data/man/a2h.1.ronn +39 -0
- data/man/bcat.1 +226 -0
- data/man/bcat.1.ronn +159 -0
- data/man/btee.1 +226 -0
- data/man/btee.1.ronn +159 -0
- data/man/index.html +195 -0
- data/test/contest.rb +68 -0
- data/test/test_bcat_a2h.rb +19 -0
- data/test/test_bcat_ansi.rb +121 -0
- data/test/test_bcat_browser.rb +12 -0
- data/test/test_bcat_head_parser.rb +56 -0
- metadata +97 -0
data/test/contest.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
# Test::Unit loads a default test if the suite is empty, whose purpose is to
|
4
|
+
# fail. Since having empty contexts is a common practice, we decided to
|
5
|
+
# overwrite TestSuite#empty? in order to allow them. Having a failure when no
|
6
|
+
# tests have been defined seems counter-intuitive.
|
7
|
+
class Test::Unit::TestSuite
|
8
|
+
def empty?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Contest adds +teardown+, +test+ and +context+ as class methods, and the
|
14
|
+
# instance methods +setup+ and +teardown+ now iterate on the corresponding
|
15
|
+
# blocks. Note that all setup and teardown blocks must be defined with the
|
16
|
+
# block syntax. Adding setup or teardown instance methods defeats the purpose
|
17
|
+
# of this library.
|
18
|
+
class Test::Unit::TestCase
|
19
|
+
def self.setup(&block)
|
20
|
+
define_method :setup do
|
21
|
+
super(&block)
|
22
|
+
instance_eval(&block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.teardown(&block)
|
27
|
+
define_method :teardown do
|
28
|
+
instance_eval(&block)
|
29
|
+
super(&block)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.context(name, &block)
|
34
|
+
subclass = Class.new(self)
|
35
|
+
remove_tests(subclass)
|
36
|
+
subclass.class_eval(&block) if block_given?
|
37
|
+
const_set(context_name(name), subclass)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.test(name, &block)
|
41
|
+
define_method(test_name(name), &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
class << self
|
45
|
+
alias_method :should, :test
|
46
|
+
alias_method :describe, :context
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def self.context_name(name)
|
52
|
+
"Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.test_name(name)
|
56
|
+
"test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.sanitize_name(name)
|
60
|
+
name.gsub(/\W+/, ' ').strip
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.remove_tests(subclass)
|
64
|
+
subclass.public_instance_methods.grep(/^test_/).each do |meth|
|
65
|
+
subclass.send(:undef_method, meth.to_sym)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'contest'
|
2
|
+
|
3
|
+
ENV['PATH'] = [File.expand_path('../../bin'), ENV['PATH']].join(':')
|
4
|
+
|
5
|
+
class ANSI2HTMLCommandTest < Test::Unit::TestCase
|
6
|
+
test "piping stuff through a2h" do
|
7
|
+
IO.popen("a2h", 'w+') do |io|
|
8
|
+
io.sync = true
|
9
|
+
io.puts "hello there"
|
10
|
+
io.flush
|
11
|
+
assert_equal "hello there\n", io.read("hello there\n".size)
|
12
|
+
io.puts "and \x1b[1mhere's some bold"
|
13
|
+
assert_equal "and <b>here's some bold\n", io.read(24)
|
14
|
+
io.close_write
|
15
|
+
assert_equal "</b>", io.read(4)
|
16
|
+
io.close
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'bcat/ansi'
|
3
|
+
|
4
|
+
class ANSITest < Test::Unit::TestCase
|
5
|
+
test 'should not modify input string' do
|
6
|
+
text = "some text"
|
7
|
+
Bcat::ANSI.new(text).to_html
|
8
|
+
assert_equal "some text", text
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'passing through text with no escapes' do
|
12
|
+
text = "hello\nthis is bcat\n"
|
13
|
+
ansi = Bcat::ANSI.new(text)
|
14
|
+
assert_equal text, ansi.to_html
|
15
|
+
end
|
16
|
+
|
17
|
+
test "removing backspace characters" do
|
18
|
+
text = "like this"
|
19
|
+
ansi = Bcat::ANSI.new(text)
|
20
|
+
assert_equal "like this", ansi.to_html
|
21
|
+
end
|
22
|
+
|
23
|
+
test "foreground colors" do
|
24
|
+
text = "colors: \x1b[30mblack\x1b[37mwhite"
|
25
|
+
expect = "colors: " +
|
26
|
+
"<span style='color:#000'>black" +
|
27
|
+
"<span style='color:#AAA'>white" +
|
28
|
+
"</span></span>"
|
29
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
30
|
+
end
|
31
|
+
|
32
|
+
test "light foreground colors" do
|
33
|
+
text = "colors: \x1b[90mblack\x1b[97mwhite"
|
34
|
+
expect = "colors: " +
|
35
|
+
"<span style='color:#555'>black" +
|
36
|
+
"<span style='color:#FFF'>white" +
|
37
|
+
"</span></span>"
|
38
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
39
|
+
end
|
40
|
+
|
41
|
+
test "background colors" do
|
42
|
+
text = "colors: \x1b[40mblack\x1b[47mwhite"
|
43
|
+
expect = "colors: " +
|
44
|
+
"<span style='background-color:#000'>black" +
|
45
|
+
"<span style='background-color:#AAA'>white" +
|
46
|
+
"</span></span>"
|
47
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
48
|
+
end
|
49
|
+
|
50
|
+
test "light background colors" do
|
51
|
+
text = "colors: \x1b[100mblack\x1b[107mwhite"
|
52
|
+
expect = "colors: " +
|
53
|
+
"<span style='background-color:#555'>black" +
|
54
|
+
"<span style='background-color:#FFF'>white" +
|
55
|
+
"</span></span>"
|
56
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
57
|
+
end
|
58
|
+
|
59
|
+
test "strikethrough" do
|
60
|
+
text = "strike: \x1b[9mthat"
|
61
|
+
expect = "strike: <strike>that</strike>"
|
62
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
63
|
+
end
|
64
|
+
|
65
|
+
test "blink!" do
|
66
|
+
text = "blink: \x1b[5mwhat"
|
67
|
+
expect = "blink: <blink>what</blink>"
|
68
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
69
|
+
end
|
70
|
+
|
71
|
+
test "underline" do
|
72
|
+
text = "underline: \x1b[3mstuff"
|
73
|
+
expect = "underline: <u>stuff</u>"
|
74
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
75
|
+
end
|
76
|
+
|
77
|
+
test "bold" do
|
78
|
+
text = "bold: \x1b[1mstuff"
|
79
|
+
expect = "bold: <b>stuff</b>"
|
80
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
81
|
+
end
|
82
|
+
|
83
|
+
test "resetting a single sequence" do
|
84
|
+
text = "\x1b[1mthis is bold\x1b[0m, but this isn't"
|
85
|
+
expect = "<b>this is bold</b>, but this isn't"
|
86
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
87
|
+
end
|
88
|
+
|
89
|
+
test "resetting many sequences" do
|
90
|
+
text = "normal, \x1b[1mbold, \x1b[3munderline, \x1b[31mred\x1b[0m, normal"
|
91
|
+
expect = "normal, <b>bold, <u>underline, " +
|
92
|
+
"<span style='color:#A00'>red</span></u></b>, normal"
|
93
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
94
|
+
end
|
95
|
+
|
96
|
+
test "resetting without an implicit 0 argument" do
|
97
|
+
text = "\x1b[1mthis is bold\x1b[m, but this isn't"
|
98
|
+
expect = "<b>this is bold</b>, but this isn't"
|
99
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
100
|
+
end
|
101
|
+
|
102
|
+
test "multi-attribute sequences" do
|
103
|
+
text = "normal, \x1b[1;3;31mbold, underline, and red\x1b[0m, normal"
|
104
|
+
expect = "normal, <b><u><span style='color:#A00'>" +
|
105
|
+
"bold, underline, and red</span></u></b>, normal"
|
106
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
107
|
+
end
|
108
|
+
|
109
|
+
test "multi-attribute sequences with a trailing semi-colon" do
|
110
|
+
text = "normal, \x1b[1;3;31;mbold, underline, and red\x1b[0m, normal"
|
111
|
+
expect = "normal, <b><u><span style='color:#A00'>" +
|
112
|
+
"bold, underline, and red</span></u></b>, normal"
|
113
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
114
|
+
end
|
115
|
+
|
116
|
+
test "eating malformed sequences" do
|
117
|
+
text = "\x1b[25oops forgot the 'm'"
|
118
|
+
expect = "oops forgot the 'm'"
|
119
|
+
assert_equal expect, Bcat::ANSI.new(text).to_html
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'bcat/browser'
|
3
|
+
|
4
|
+
class BrowserTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
setup { @browser = Bcat::Browser.new('default', nil) }
|
7
|
+
|
8
|
+
test 'shell quotes double-quotes, backticks, and parameter expansion' do
|
9
|
+
assert_equal "\"http://example.com/\\\"/\\$(echo oops)/\\`echo howdy\\`\"",
|
10
|
+
@browser.shell_quote("http://example.com/\"/$(echo oops)/`echo howdy`")
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'contest'
|
2
|
+
require 'bcat/html'
|
3
|
+
|
4
|
+
class HeadParserTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
setup { @parser = Bcat::HeadParser.new }
|
7
|
+
|
8
|
+
test 'starts in an unknown state' do
|
9
|
+
assert @parser.html?.nil?
|
10
|
+
assert @parser.buf.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
test 'detects non-HTML input' do
|
14
|
+
@parser.feed("HOWDY <h1>")
|
15
|
+
assert_equal false, @parser.html?
|
16
|
+
assert_equal '', @parser.head
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'separates head elements from body' do
|
20
|
+
@parser.feed("<style>h1{ font-size:500% }</style>")
|
21
|
+
@parser.feed("<h1>HOLLA</h1>")
|
22
|
+
assert_equal "<style>h1{ font-size:500% }</style>", @parser.head.strip
|
23
|
+
assert_equal "<body>\n<h1>HOLLA</h1>", @parser.body
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'handles multiple head elements' do
|
27
|
+
stuff = [
|
28
|
+
"<style>h1{ font-size:500% }</style>",
|
29
|
+
"<link rel=alternate>",
|
30
|
+
"<script type='text/javascript'>{};</script>"
|
31
|
+
]
|
32
|
+
stuff.each { |html| @parser.feed(html) }
|
33
|
+
@parser.feed("\n \n\n\n<h1>HOLLA</h1>")
|
34
|
+
|
35
|
+
assert_equal stuff.join, @parser.head.strip
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'handles full documents' do
|
39
|
+
@parser.feed("<!DOCTYPE html>\n")
|
40
|
+
@parser.feed("<html><head><title>YO</title></head>")
|
41
|
+
@parser.feed("<body id=oyy><h1>OY</h1></body></html>")
|
42
|
+
assert_equal "<title>YO</title>", @parser.head.strip
|
43
|
+
assert_equal "<body id=oyy>\n<h1>OY</h1></body></html>", @parser.body
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'knows when the head is fully parsed' do
|
47
|
+
@parser.feed("<!DOCTYPE html>\n")
|
48
|
+
assert !@parser.complete?
|
49
|
+
|
50
|
+
@parser.feed("<html><head><title>YO</title></head>")
|
51
|
+
assert !@parser.complete?
|
52
|
+
|
53
|
+
@parser.feed("<body id=oyy><h1>OY</h1></body></html>")
|
54
|
+
assert @parser.complete?
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aslakhellesoy-bcat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.6.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ryan Tomayko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-22 00:00:00 +01:00
|
14
|
+
default_executable: bcat
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rack
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.2.2
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
description: pipe to browser utility
|
28
|
+
email: rtomayko@gmail.com
|
29
|
+
executables:
|
30
|
+
- a2h
|
31
|
+
- bcat
|
32
|
+
- btee
|
33
|
+
extensions: []
|
34
|
+
|
35
|
+
extra_rdoc_files:
|
36
|
+
- COPYING
|
37
|
+
files:
|
38
|
+
- CONTRIBUTING
|
39
|
+
- COPYING
|
40
|
+
- INSTALLING
|
41
|
+
- README
|
42
|
+
- RELEASING
|
43
|
+
- Rakefile
|
44
|
+
- bcat.gemspec
|
45
|
+
- bin/a2h
|
46
|
+
- bin/bcat
|
47
|
+
- bin/btee
|
48
|
+
- contrib/bman
|
49
|
+
- lib/bcat.rb
|
50
|
+
- lib/bcat/ansi.rb
|
51
|
+
- lib/bcat/browser.rb
|
52
|
+
- lib/bcat/html.rb
|
53
|
+
- lib/bcat/reader.rb
|
54
|
+
- lib/bcat/server.rb
|
55
|
+
- man/a2h.1
|
56
|
+
- man/a2h.1.ronn
|
57
|
+
- man/bcat.1
|
58
|
+
- man/bcat.1.ronn
|
59
|
+
- man/btee.1
|
60
|
+
- man/btee.1.ronn
|
61
|
+
- man/index.html
|
62
|
+
- test/contest.rb
|
63
|
+
- test/test_bcat_a2h.rb
|
64
|
+
- test/test_bcat_ansi.rb
|
65
|
+
- test/test_bcat_browser.rb
|
66
|
+
- test/test_bcat_head_parser.rb
|
67
|
+
has_rdoc: true
|
68
|
+
homepage: http://rtomayko.github.com/bcat/
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- --line-numbers
|
74
|
+
- --inline-source
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.6.2
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Concatenate input from standard input, or one or more files, and write progressive output to a browser.
|
96
|
+
test_files: []
|
97
|
+
|