mutter 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +18 -23
- data/Rakefile +3 -46
- data/VERSION +1 -1
- data/lib/ext.rb +1 -2
- data/lib/mutter.rb +13 -0
- data/lib/mutter/mutterer.rb +30 -21
- data/mutter.gemspec +6 -5
- data/spec/mutter_spec.rb +38 -25
- metadata +3 -3
data/README.md
CHANGED
@@ -7,9 +7,14 @@ mutter
|
|
7
7
|
|
8
8
|
> mutter takes the concepts of **separation of style & content** to the command-line!
|
9
9
|
|
10
|
+
setup
|
11
|
+
-----
|
12
|
+
|
13
|
+
$ sudo gem install mutter -s http://gemcutter.org
|
14
|
+
|
10
15
|
synopsis
|
11
16
|
--------
|
12
|
-
|
17
|
+
|
13
18
|
require 'mutter'
|
14
19
|
|
15
20
|
mut = Mutter.new # creates a new 'Mutterer', who talks in command-line language
|
@@ -17,26 +22,26 @@ synopsis
|
|
17
22
|
mut.say "hello world", :bold # bolds the whole string
|
18
23
|
mut.say "hello [world]", :cyan # inverts 'world', and colors the string cyan
|
19
24
|
mut.print "bonjour!" # alias of `say`
|
20
|
-
mut["_hola_"] # return the stylized string without printing
|
25
|
+
mut["_hola_"] # return the stylized string without printing, alias of #process
|
21
26
|
|
22
27
|
### Tables
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
column :width => 15, :style => :green
|
30
|
-
column :style => :yellow
|
28
|
+
|
29
|
+
Define your table structure, arguments are optional.
|
30
|
+
|
31
|
+
table = Mutter::Table.new(:delimiter => '|') do # Strings which don't fit the column width will be truncated
|
32
|
+
column :width => 15, :style => :green # with '..' by default, you can change that with the :truncater
|
33
|
+
column :style => :yellow # option.
|
31
34
|
column :width => 15, :align => :right
|
32
35
|
end
|
33
|
-
|
34
|
-
|
36
|
+
|
37
|
+
Add some rows
|
38
|
+
|
35
39
|
table << ["gaspar", "morello", 1976]
|
36
40
|
table << ["eddie", "vedder", 1964]
|
37
41
|
table << ["david", "bowie", 1947]
|
38
42
|
|
39
|
-
|
43
|
+
Print.
|
44
|
+
|
40
45
|
print table.to_s
|
41
46
|
|
42
47
|
If you want something barebones, you can also do
|
@@ -109,18 +114,8 @@ and then loaded like this:
|
|
109
114
|
mut >> :blink # remove :blink
|
110
115
|
mut << :bold << :underline # add :bold and :underline
|
111
116
|
mut.say "hello mutter." # bold and underlined
|
112
|
-
|
113
|
-
installation
|
114
|
-
------------
|
115
|
-
|
116
|
-
$ sudo gem install cloudhead-mutter
|
117
117
|
|
118
118
|
That's it!
|
119
119
|
----------
|
120
120
|
|
121
121
|
_have fun_
|
122
|
-
|
123
|
-
Footnote
|
124
|
-
--------
|
125
|
-
|
126
|
-
This code is _highly experimental_, don't try this at home!
|
data/Rakefile
CHANGED
@@ -6,56 +6,18 @@ begin
|
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "mutter"
|
8
8
|
gem.summary = %Q{the tiny CLI library}
|
9
|
-
gem.description = %Q{the tiny
|
9
|
+
gem.description = %Q{the tiny command-line interface library with lots of style}
|
10
10
|
gem.email = "self@cloudhead.net"
|
11
11
|
gem.homepage = "http://github.com/cloudhead/mutter"
|
12
12
|
gem.rubyforge_project = 'mutter'
|
13
13
|
gem.authors = ["cloudhead"]
|
14
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
14
|
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
16
|
Jeweler::RubyforgeTasks.new
|
17
17
|
rescue LoadError
|
18
18
|
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
19
|
end
|
20
20
|
|
21
|
-
require 'rake/testtask'
|
22
|
-
Rake::TestTask.new(:test) do |test|
|
23
|
-
test.libs << 'lib' << 'test'
|
24
|
-
test.pattern = 'test/**/*_test.rb'
|
25
|
-
test.verbose = true
|
26
|
-
end
|
27
|
-
|
28
|
-
begin
|
29
|
-
require 'rcov/rcovtask'
|
30
|
-
Rcov::RcovTask.new do |test|
|
31
|
-
test.libs << 'test'
|
32
|
-
test.pattern = 'test/**/*_test.rb'
|
33
|
-
test.verbose = true
|
34
|
-
end
|
35
|
-
rescue LoadError
|
36
|
-
task :rcov do
|
37
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
task :default => :test
|
43
|
-
|
44
|
-
require 'rake/rdoctask'
|
45
|
-
Rake::RDocTask.new do |rdoc|
|
46
|
-
if File.exist?('VERSION.yml')
|
47
|
-
config = YAML.load(File.read('VERSION.yml'))
|
48
|
-
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
49
|
-
else
|
50
|
-
version = ""
|
51
|
-
end
|
52
|
-
|
53
|
-
rdoc.rdoc_dir = 'rdoc'
|
54
|
-
rdoc.title = "mutter #{version}"
|
55
|
-
rdoc.rdoc_files.include('README*')
|
56
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
57
|
-
end
|
58
|
-
|
59
21
|
require 'spec/rake/spectask'
|
60
22
|
|
61
23
|
Spec::Rake::SpecTask.new("spec") do |t|
|
@@ -67,9 +29,4 @@ task :test do
|
|
67
29
|
Rake::Task['spec'].invoke
|
68
30
|
end
|
69
31
|
|
70
|
-
|
71
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
72
|
-
t.spec_opts = ['--color']
|
73
|
-
t.rcov = true
|
74
|
-
t.rcov_opts = ['--exclude', '^spec,/gems/']
|
75
|
-
end
|
32
|
+
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/lib/ext.rb
CHANGED
data/lib/mutter.rb
CHANGED
data/lib/mutter/mutterer.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Mutter
|
2
2
|
class Mutterer
|
3
|
-
@stream = STDOUT
|
3
|
+
@stream = STDOUT # output stream
|
4
|
+
@color = false # force color
|
4
5
|
|
5
6
|
# Initialize the styles, and load the defaults from +styles.yml+
|
6
7
|
#
|
@@ -37,7 +38,7 @@ module Mutter
|
|
37
38
|
end if style.is_a? Symbol
|
38
39
|
end
|
39
40
|
end
|
40
|
-
|
41
|
+
|
41
42
|
def styles
|
42
43
|
@defaults.merge @styles
|
43
44
|
end
|
@@ -48,7 +49,7 @@ module Mutter
|
|
48
49
|
when :styles then @styles, @defaults = {}, {}
|
49
50
|
when :active then @active = []
|
50
51
|
when :all then @active, @styles, @defaults = [], {}, {}
|
51
|
-
when :default,
|
52
|
+
when :default,
|
52
53
|
:defaults then @defaults = {}
|
53
54
|
else raise ArgumentError, "[:user, :default, :active, :all] only"
|
54
55
|
end
|
@@ -69,16 +70,29 @@ module Mutter
|
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
73
|
+
def color?
|
74
|
+
(ENV['TERM'].include?('color') && self.class.stream.tty?) || self.class.color
|
75
|
+
end
|
76
|
+
|
72
77
|
#
|
73
78
|
# Output to @stream
|
74
79
|
#
|
75
80
|
def say msg, *styles
|
76
|
-
self.write((
|
77
|
-
return nil
|
81
|
+
self.write((color?? process(msg, *styles) : unstyle(msg)) + "\n") ; nil
|
78
82
|
end
|
79
|
-
|
80
83
|
alias :print say
|
81
|
-
|
84
|
+
|
85
|
+
#
|
86
|
+
# Remove all tags from string
|
87
|
+
#
|
88
|
+
def unstyle msg
|
89
|
+
styles.map do |_,v|
|
90
|
+
v[:match]
|
91
|
+
end.flatten.inject(msg) do |m, tag|
|
92
|
+
m.gsub(tag, '')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
82
96
|
#
|
83
97
|
# Parse the message, but also apply a style on the whole thing
|
84
98
|
#
|
@@ -94,22 +108,9 @@ module Mutter
|
|
94
108
|
self.class.stream.tap do |stream|
|
95
109
|
stream.write str
|
96
110
|
stream.flush
|
97
|
-
end; nil
|
111
|
+
end ; nil
|
98
112
|
end
|
99
113
|
|
100
|
-
#
|
101
|
-
# Utility function, to make a block interruptible
|
102
|
-
#
|
103
|
-
def watch
|
104
|
-
begin
|
105
|
-
yield
|
106
|
-
rescue Interrupt
|
107
|
-
puts
|
108
|
-
exit 0
|
109
|
-
end
|
110
|
-
end
|
111
|
-
alias :oo watch
|
112
|
-
|
113
114
|
#
|
114
115
|
# Create a table
|
115
116
|
#
|
@@ -197,5 +198,13 @@ module Mutter
|
|
197
198
|
def self.stream= io
|
198
199
|
@stream = io
|
199
200
|
end
|
201
|
+
|
202
|
+
def self.color
|
203
|
+
@color
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.color= bool
|
207
|
+
@color = bool
|
208
|
+
end
|
200
209
|
end
|
201
210
|
end
|
data/mutter.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mutter}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["cloudhead"]
|
12
|
-
s.date = %q{2009-
|
13
|
-
s.description = %q{the tiny
|
12
|
+
s.date = %q{2009-11-08}
|
13
|
+
s.description = %q{the tiny command-line interface library with lots of style}
|
14
14
|
s.email = %q{self@cloudhead.net}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
@@ -58,3 +58,4 @@ Gem::Specification.new do |s|
|
|
58
58
|
else
|
59
59
|
end
|
60
60
|
end
|
61
|
+
|
data/spec/mutter_spec.rb
CHANGED
@@ -4,11 +4,12 @@ describe Mutter do
|
|
4
4
|
def out
|
5
5
|
File.read("spec/out.txt")
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
before(:each) do
|
9
9
|
Mutter::Mutterer.stream = File.new("spec/out.txt", 'w')
|
10
|
+
Mutter::Mutterer.color = true
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
after(:all) do
|
13
14
|
File.delete("spec/out.txt")
|
14
15
|
end
|
@@ -17,107 +18,107 @@ describe Mutter do
|
|
17
18
|
Mutter.say "hello mutter!"
|
18
19
|
out.should == "hello mutter!\n"
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
it "should underline" do
|
22
23
|
Mutter.say "_hello mutter!_"
|
23
24
|
out.should == "\e[4mhello mutter!\e[24m\n"
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
it "should bold" do
|
27
28
|
Mutter.say "*hello mutter!*"
|
28
29
|
out.should == "\e[1mhello mutter!\e[22m\n"
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
it "should inverse" do
|
32
33
|
Mutter.say "[hello mutter!]"
|
33
34
|
out.should == "\e[7mhello mutter!\e[27m\n"
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
it "should blink" do
|
37
38
|
Mutter.say "hello mutter!", :blink
|
38
39
|
out.should == "\e[5mhello mutter!\e[25m\n"
|
39
40
|
end
|
40
|
-
|
41
|
+
|
41
42
|
it "should escape glyphs" do
|
42
43
|
Mutter.say "**hello * world**"
|
43
44
|
out.should == "\e[1mhello * world\e[22m\n"
|
44
45
|
end
|
45
|
-
|
46
|
+
|
46
47
|
it "should set actives at the instance level" do
|
47
48
|
Mutter.new([:bold, :underline]).say "hello mutter!"
|
48
49
|
out.should == "\e[4m\e[1mhello mutter!\e[22m\e[24m\n"
|
49
50
|
end
|
50
|
-
|
51
|
+
|
51
52
|
it "should set actives at the method level" do
|
52
53
|
Mutter.say "hello mutter!", :bold, :underline
|
53
54
|
out.should == "\e[4m\e[1mhello mutter!\e[22m\e[24m\n"
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
it "should set actives at both levels" do
|
57
58
|
Mutter.new(:bold).say "hello mutter!", :underline, :yellow
|
58
59
|
out.should == "\e[33m\e[4m\e[1mhello mutter!\e[22m\e[24m\e[39m\n"
|
59
60
|
end
|
60
|
-
|
61
|
+
|
61
62
|
describe "with custom styles" do
|
62
63
|
it "should work with custom styles" do
|
63
64
|
style = {
|
64
65
|
:alert => {
|
65
|
-
:match => '!!',
|
66
|
+
:match => '!!',
|
66
67
|
:style => ['bold', 'red']
|
67
68
|
}
|
68
69
|
}
|
69
70
|
Mutter.new(style).say "alert!", :alert
|
70
71
|
out.should == "\e[31m\e[1malert!\e[22m\e[39m\n"
|
71
72
|
end
|
72
|
-
|
73
|
+
|
73
74
|
describe "in shorthand form" do
|
74
75
|
it "should work with simple shorthand styles" do
|
75
76
|
Mutter.new({:bold => '~'}).say "~hello mutter!~"
|
76
77
|
out.should == "\e[1mhello mutter!\e[22m\n"
|
77
78
|
end
|
78
|
-
|
79
|
+
|
79
80
|
it "should work with complex shorthand styles" do
|
80
81
|
Mutter.new({:cyan => ['<', '>']}).say "<hello mutter!>"
|
81
82
|
out.should == "\e[36mhello mutter!\e[39m\n"
|
82
83
|
end
|
83
|
-
|
84
|
+
|
84
85
|
it "should work with multiple shorthand styles" do
|
85
86
|
Mutter.new({[:cyan, :underline] => '~'}).say "~hello mutter!~"
|
86
87
|
out.should == "\e[4m\e[36mhello mutter!\e[39m\e[24m\n"
|
87
88
|
end
|
88
89
|
end
|
89
|
-
|
90
|
+
|
90
91
|
it "should mix styles" do
|
91
92
|
Mutter.new({:cyan => '~'}).say "_*hello* ~world~_"
|
92
93
|
out.should == "\e[4m\e[1mhello\e[22m \e[36mworld\e[39m\e[24m\n"
|
93
94
|
end
|
94
|
-
|
95
|
+
|
95
96
|
it "should color backgrounds" do
|
96
97
|
Mutter.new({:cyan => '~'}).say "~[hello mutter!]~"
|
97
98
|
out.should == "\e[36m\e[7mhello mutter!\e[27m\e[39m\n"
|
98
99
|
end
|
99
|
-
|
100
|
+
|
100
101
|
it "should load styles from a yaml" do
|
101
102
|
Mutter.new("spec/style").say "{important message!}"
|
102
103
|
out.should == "\e[33m\e[4m\e[1mimportant message!\e[22m\e[24m\e[39m\n"
|
103
104
|
end
|
104
|
-
|
105
|
+
|
105
106
|
it "should be able to call styles as methods" do
|
106
107
|
Mutter.new("spec/style").important "important message!"
|
107
108
|
out.should == "\e[33m\e[4m\e[1mimportant message!\e[22m\e[24m\e[39m\n"
|
108
109
|
end
|
109
|
-
|
110
|
+
|
110
111
|
it "should clear all styles" do
|
111
112
|
Mutter.new.clear(:all).say "[hello] *world*"
|
112
113
|
out.should == "[hello] *world*\n"
|
113
114
|
end
|
114
|
-
|
115
|
+
|
115
116
|
it "should clear active styles" do
|
116
117
|
mut = Mutter.new(:bold)
|
117
118
|
mut.clear(:active).say "hello"
|
118
119
|
out.should == "hello\n"
|
119
120
|
end
|
120
|
-
|
121
|
+
|
121
122
|
it "should add and remove active styles" do
|
122
123
|
mut = Mutter.new
|
123
124
|
mut << :bold << :underline << :inverse
|
@@ -125,7 +126,7 @@ describe Mutter do
|
|
125
126
|
mut.say "hello mutter!"
|
126
127
|
out.should == "\e[4m\e[1mhello mutter!\e[22m\e[24m\n"
|
127
128
|
end
|
128
|
-
|
129
|
+
|
129
130
|
it "should return instances of itself, +- active styles" do
|
130
131
|
mut = Mutter.new
|
131
132
|
mut << :bold << :underline
|
@@ -133,10 +134,22 @@ describe Mutter do
|
|
133
134
|
out.should == "\e[4mhello mutter!\e[24m\n"
|
134
135
|
end
|
135
136
|
end
|
136
|
-
|
137
|
+
|
137
138
|
it "should parse a complex string" do
|
138
139
|
m = Mutter.new({:cyan => ['<','>']})
|
139
140
|
m.say "hello *mutter*, would you _<please be quiet>_ for this <[test]>?"
|
140
141
|
out.should == "hello \e[1mmutter\e[22m, would you \e[4m\e[36mplease be quiet\e[39m\e[24m for this \e[36m\e[7mtest\e[27m\e[39m?\n"
|
141
142
|
end
|
142
|
-
|
143
|
+
|
144
|
+
describe "when color isn't supported" do
|
145
|
+
before(:each) do
|
146
|
+
Mutter::Mutterer.color = false
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should remove style tags" do
|
150
|
+
m = Mutter.new
|
151
|
+
m.say "hello *mutter*, how are _you_?"
|
152
|
+
out.should == "hello mutter, how are you?\n"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cloudhead
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-08 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: the tiny
|
16
|
+
description: the tiny command-line interface library with lots of style
|
17
17
|
email: self@cloudhead.net
|
18
18
|
executables: []
|
19
19
|
|