jamescook-pow 0.1.0

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.
Files changed (6) hide show
  1. data/.gitignore +3 -0
  2. data/README +17 -0
  3. data/lib/pow.rb +155 -0
  4. data/pow.rb +1 -0
  5. data/test/pow_test.rb +41 -0
  6. metadata +59 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ *.swp
2
+ pkg
3
+ pkg/*
data/README ADDED
@@ -0,0 +1,17 @@
1
+ P O W ! ( Not like prisoner of war, but from the movie Step Brothers where that guy from the Daily Show is saying "POW" repeatedly. )
2
+
3
+ Override your 'puts' for fun shell coloring.
4
+
5
+ Usage:
6
+ require "pow"
7
+
8
+ Examples:
9
+ puts.yellow "Hello world in yellow"
10
+ puts.red "Hello world in red"
11
+ puts.red! "Hello world in red, but with boldness"
12
+ puts.red_ "Hello world in red, but with strikethrough"
13
+ puts.rainbow "Hellow world, but more silly."
14
+
15
+
16
+ TODO:
17
+ - Figure out if you can bold a 'dark' color
data/lib/pow.rb ADDED
@@ -0,0 +1,155 @@
1
+ module Pow
2
+ # Override puts on include to allow coloring (but also retain existing function)
3
+ def self.included(base)
4
+ base.send(:define_method, :puts){ |*args| Puts.new(*args) }
5
+ end
6
+ CODES = {
7
+ :clear => 0,
8
+ :reset => 0, #clear
9
+ :bold => 1,
10
+ :dark => 2,
11
+ :italic => 3,
12
+ :underline => 4,
13
+ :underscore => 4,
14
+ :blink => 5,
15
+ :rapid_blink => 6,
16
+ :negative => 7,
17
+ :concealed => 8,
18
+ :strikethrough => 9,
19
+ :black => 30,
20
+ :red => 31,
21
+ :green => 32,
22
+ :yellow => 33,
23
+ :blue => 34,
24
+ :magenta => 35,
25
+ :purple => 35,
26
+ :cyan => 36,
27
+ :white => 37,
28
+ :on_black => 40,
29
+ :on_red => 41,
30
+ :on_green => 42,
31
+ :on_yellow => 43,
32
+ :on_blue => 44,
33
+ :on_magenta => 45,
34
+ :on_purple => 45,
35
+ :on_cyan => 46,
36
+ :on_white => 47,
37
+ :brown => [:yellow, :dark],
38
+ :navy => [:blue, :dark],
39
+ :dark_red => [:red, :dark],
40
+ :dark_blue => [:blue, :dark],
41
+ :dark_cyan => [:cyan, :dark],
42
+ :dark_green => [:green, :dark],
43
+ :dark_magenta => [:magenta, :dark],
44
+ :dark_purple => [:purple, :dark],
45
+ :gray => [:white, :dark],
46
+ :grey => [:white, :dark]
47
+ }.freeze
48
+
49
+ class Puts
50
+ attr_accessor :writer
51
+ def initialize(*args)
52
+ options = args[0].is_a?(String) ? {:text => args[0] } : (args[0] || {})
53
+ CODES.keys.each do |key|
54
+ # Color
55
+ self.class.send(:define_method, key.to_sym) { |*args| Puts.new({:color => key.to_sym, :text => args[0], :misc => args[1]}).out! }
56
+ # Bold
57
+ self.class.send(:define_method, "#{key}!".to_sym) { |*args| Puts.new({:color => key.to_sym, :text => args[0], :bold => true, :misc => args[1]}).out! }
58
+ # Strikethrough
59
+ self.class.send(:define_method, "#{key}_".to_sym) { |*args| Puts.new({:color => key.to_sym, :text => args[0], :strikethrough => true, :misc => args[1]}).out! }
60
+ end
61
+ # FIXME make this part a method or less fug
62
+ if options[:misc] && options[:misc].is_a?(Hash)
63
+ options[:bold] ||= options[:misc][:bold]
64
+ options[:underline] ||= options[:misc][:underline]
65
+ options[:background] ||= (options[:misc][:background] || options[:misc][:on])
66
+ options[:strikethrough] ||= options[:misc][:strikethrough]
67
+ end
68
+ @writer = options[:writer] || STDOUT
69
+ @formatted_text = format_string(options)
70
+ out!(@formatted_text)
71
+ end
72
+
73
+ # Write the coloured text to IO
74
+ def out!(string=nil)
75
+ if string && string != ""
76
+ printf(writer, string)
77
+ end
78
+ end
79
+
80
+ def rainbow(*args)
81
+ text = args[0]
82
+ out!(text.to_s.split("").inject(""){|m, word| m+= format_string(:text => word, :bold => true, :newline => "", :color => rainbow_keys.sort_by{|k| rand}[0]) + " " } + "\n")
83
+ end
84
+
85
+ # Feel the painbow
86
+ def painbow(*args)
87
+ text = args[0]
88
+ out!(text.to_s.split("").inject(""){|m, word| m+= format_string(:text => word, :bold => true, :newline => "", :color => painbow_keys.sort_by{|k| rand}[0]) + " " } + "\n")
89
+ end
90
+
91
+ def inspect
92
+ nil
93
+ end
94
+
95
+ protected
96
+ def painbow_keys
97
+ [:red, :gray, :white].freeze
98
+ end
99
+
100
+ def rainbow_keys
101
+ [:red, :blue, :yellow, :green, :magenta, :cyan, :dark_purple].freeze
102
+ end
103
+
104
+ def format_string(options={})
105
+ newline = options.fetch(:newline){ "\n" }
106
+ color = options.fetch(:color){ :white }
107
+ text = options.fetch(:text){ '' }
108
+ bold = options.fetch(:bold){ false }
109
+ underline = options.fetch(:underline){ false }
110
+ background = options.fetch(:background){ false }
111
+ concealed = options.fetch(:concealed){ false }
112
+ strikethrough = options.fetch(:strikethrough){ false }
113
+
114
+ if text != ""
115
+ result = [escape_sequence(color), text, escape_sequence(:reset), newline].join
116
+ end
117
+
118
+ if bold
119
+ result.insert(0, escape_sequence(:bold))
120
+ end
121
+
122
+ if underline
123
+ result.insert(0, escape_sequence(:underline))
124
+ end
125
+
126
+ if background
127
+ result.insert(0, escape_sequence("on_#{background}".to_sym))
128
+ end
129
+
130
+ if concealed
131
+ result.insert(0, escape_sequence(:concealed))
132
+ end
133
+
134
+ if strikethrough
135
+ result.insert(0, escape_sequence(:strikethrough))
136
+ end
137
+
138
+ return result
139
+ end
140
+
141
+ def escape_sequence(code)
142
+ if CODES[code].is_a?(Array)
143
+ sequence = ""
144
+ CODES[code].each do |key|
145
+ sequence << escape_sequence(key)
146
+ end
147
+ return sequence
148
+ else
149
+ return "\e[#{CODES[code]}m"
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ include Pow
data/pow.rb ADDED
@@ -0,0 +1 @@
1
+ require "lib/pow"
data/test/pow_test.rb ADDED
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+ require "stringio"
3
+ require File.join( File.dirname(__FILE__), "..", "pow")
4
+
5
+ class PowTest < Test::Unit::TestCase
6
+ include Pow
7
+ def setup
8
+ @puts = Pow::Puts
9
+ @writer = StringIO.new
10
+ end
11
+
12
+ def test_puts
13
+ @puts.new(:text => "TEST", :writer => @writer).out!
14
+ @writer.rewind
15
+ assert_equal "\e[37mTEST\e[0m\n", @writer.gets # White text
16
+ end
17
+
18
+ def test_puts_with_red
19
+ @puts.new(:text => "TEST", :color => :red, :writer => @writer).out!
20
+ @writer.rewind
21
+ assert_equal "\e[31mTEST\e[0m\n", @writer.gets
22
+ end
23
+
24
+ def test_puts_with_dark_color #brown = yellow + dark
25
+ @puts.new(:text => "TEST", :color => :brown, :writer => @writer).out!
26
+ @writer.rewind
27
+ assert_equal "\e[33m\e[2mTEST\e[0m\n", @writer.gets
28
+ end
29
+
30
+ def test_puts_with_bold
31
+ @puts.new(:text => "TEST", :color => :bold, :writer => @writer).out!
32
+ @writer.rewind
33
+ assert_equal "\e[1mTEST\e[0m\n", @writer.gets
34
+ end
35
+
36
+ def test_puts_with_strikethrough
37
+ @puts.new(:text => "TEST", :strikethrough => :true, :writer => @writer).out!
38
+ @writer.rewind
39
+ assert_equal "\e[9m\e[37mTEST\e[0m\n", @writer.gets
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jamescook-pow
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Cook
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-19 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: "'puts' with shell colors."
17
+ email: jamecook@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - .gitignore
26
+ - README
27
+ - lib/pow.rb
28
+ - pow.rb
29
+ - test/pow_test.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/jamescook/pow
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options:
36
+ - --charset=UTF-8
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: puts with colors
58
+ test_files:
59
+ - test/pow_test.rb