discoball 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.md +12 -4
  2. data/bin/discoball +31 -2
  3. data/discoball.gemspec +2 -1
  4. data/lib/discoball.rb +45 -11
  5. metadata +14 -15
data/README.md CHANGED
@@ -5,16 +5,24 @@ discoball
5
5
  except that it can highlight multiple patterns (in different colors). Patterns are arbitrary ruby regexes that
6
6
  are matched against the entire line.
7
7
 
8
- Usage:
8
+ Usage
9
+ -----
9
10
 
10
11
  $ discoball [options] <pattern1 pattern2 ...>
11
12
 
12
- Examples:
13
+ Examples
14
+ --------
13
15
 
14
16
  * Highlight instances of "foo" and "bar" in the text of `myfile.txt`:
15
17
 
16
- $ cat myfile.txt | discoball foo bar
18
+ $ cat myfile.txt | discoball foo bar
17
19
 
18
20
  * Highlight paths of processes running out of `/usr/sbin/`:
19
21
 
20
- $ ps -ef | discoball '/usr/sbin/.*$'
22
+ $ ps -ef | discoball '/usr/sbin/.*$'
23
+
24
+ Installation
25
+ ------------
26
+
27
+ The easiest way to get `discoball` is by using RubyGems: `$ gem install discoball`. You can also clone the git
28
+ repository at `git://github.com/cespare/discoball.git` if you want the latest code.
data/bin/discoball CHANGED
@@ -1,6 +1,35 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "discoball"
4
+ require "trollop"
4
5
 
5
- highlighter = Discoball::Highlighter.new(ARGV.map { |pattern| Regexp.new(pattern) })
6
- STDIN.each { |line| puts highlighter.filter(line) }
6
+ options = Trollop::options do
7
+ banner <<-EOS
8
+ discoball is a tool for highlighting patterns in a text stream.
9
+
10
+ Usage:
11
+ $ discoball [options] <pattern1 pattern2 ...>
12
+ where options are:
13
+ EOS
14
+ opt :group_colors, "Color all matches of the same pattern with the same color", :default => false
15
+ opt :one_color, "Highlight all matches with a single color", :default => false
16
+ opt :match, "Only print lines with matches", :default => false
17
+ end
18
+
19
+ color_mode_array = [:group_colors, :one_color].select { |option| options[option] }
20
+ if color_mode_array.size > 1
21
+ Trollop::die "Only one of --group-colors or --one-color may be set"
22
+ end
23
+
24
+ if color_mode_array.empty?
25
+ color_mode = :individual
26
+ else
27
+ color_mode = color_mode_array[0]
28
+ end
29
+
30
+ patterns = ARGV.map { |pattern| Regexp.new(pattern) }
31
+ highlighter = Discoball::Highlighter.new(patterns, color_mode, options[:match])
32
+ STDIN.each do |line|
33
+ filtered = highlighter.filter(line)
34
+ puts filtered unless filtered.nil?
35
+ end
data/discoball.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "discoball"
3
- s.version = "0.0.1"
3
+ s.version = "0.0.2"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">=0") if s.respond_to? :required_rubygems_version=
6
6
  s.specification_version = 2 if s.respond_to? :specification_version=
@@ -21,4 +21,5 @@ Gem::Specification.new do |s|
21
21
  bin/discoball
22
22
  )
23
23
  s.add_dependency("colorize", ">=0.5.8")
24
+ s.add_dependency("trollop", ">=1.16.2")
24
25
  end
data/lib/discoball.rb CHANGED
@@ -4,29 +4,63 @@ require "colorize"
4
4
 
5
5
  module Discoball
6
6
  UNUSABLE_COLORS = [/black$/, /^default$/, /white$/, /^light/]
7
+ SINGLE_COLOR = :blue
7
8
 
8
9
  class Highlighter
9
- def initialize(patterns)
10
+ # Patterns is an array of patterns to match. There are three options that can be changed:
11
+ # * If color_mode is :individual, then each unique string matching one of the patterns will be a
12
+ # different color.
13
+ # * If color_mode is :group_colors, then the matches corresponding to each pattern will be the same color.
14
+ # * If color_mode is :one_color, then all matches will be a single color.
15
+ # * If match_only is set, then only matching lines will be returned.
16
+ def initialize(patterns, color_mode = :individual, match_only = false)
10
17
  @patterns = patterns
18
+ @color_mode = color_mode
19
+ @match_only = match_only
11
20
  @color_stack = String.colors.reject { |color| UNUSABLE_COLORS.any? { |unusable| color =~ unusable } }
12
21
  @color_assignments = {}
22
+ if color_mode == :group_colors
23
+ @patterns.each { |pattern| @color_assignments[pattern] = pop_rotate }
24
+ end
13
25
  end
14
26
 
15
27
  def filter(line)
16
- matches = @patterns.flat_map { |pattern| line.scan(pattern) }.uniq
17
- matches.each { |match| line.gsub!(match, highlight(match)) }
18
- line
28
+ match_found = false
29
+ case @color_mode
30
+ when :one_color
31
+ matches = @patterns.flat_map { |pattern| line.scan(pattern) }.uniq
32
+ match_found ||= !matches.empty?
33
+ matches.each { |match| highlight!(line, match, SINGLE_COLOR) }
34
+ when :group_colors
35
+ @patterns.each do |pattern|
36
+ matches = line.scan(pattern).uniq
37
+ match_found ||= !matches.empty?
38
+ matches.each { |match| highlight!(line, match, @color_assignments[pattern]) }
39
+ end
40
+ when :individual
41
+ matches = @patterns.flat_map { |pattern| line.scan(pattern) }.uniq
42
+ match_found ||= !matches.empty?
43
+ matches.each do |match|
44
+ unless @color_assignments.include? match
45
+ @color_assignments[match] = pop_rotate
46
+ end
47
+ matches.each { |match| highlight!(line, match, @color_assignments[match]) }
48
+ end
49
+ end
50
+ (@match_only && !match_found) ? nil : line
19
51
  end
20
52
 
21
53
  private
22
54
 
23
- def highlight(match)
24
- unless @color_assignments.include? match
25
- color = @color_stack.pop
26
- @color_stack.insert(0, color)
27
- @color_assignments[match] = color
28
- end
29
- match.colorize(@color_assignments[match]).underline
55
+ def highlight!(line, match, color)
56
+ line.gsub!(match, match.colorize(color).underline)
57
+ end
58
+
59
+ # Get the next color and put it at the back
60
+ def pop_rotate
61
+ color = @color_stack.pop
62
+ @color_stack.insert(0, color)
63
+ color
30
64
  end
31
65
  end
32
66
  end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: discoball
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
4
+ prerelease:
5
+ version: 0.0.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - Caleb Spare
@@ -25,13 +21,20 @@ dependencies:
25
21
  requirements:
26
22
  - - ">="
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 5
31
- - 8
32
24
  version: 0.5.8
33
25
  type: :runtime
34
26
  version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 1.16.2
36
+ type: :runtime
37
+ version_requirements: *id002
35
38
  description: A simple stream filter to highlight patterns
36
39
  email: cespare@gmail.com
37
40
  executables:
@@ -59,21 +62,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
62
  requirements:
60
63
  - - ">="
61
64
  - !ruby/object:Gem::Version
62
- segments:
63
- - 0
64
65
  version: "0"
65
66
  required_rubygems_version: !ruby/object:Gem::Requirement
66
67
  none: false
67
68
  requirements:
68
69
  - - ">="
69
70
  - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
71
  version: "0"
73
72
  requirements: []
74
73
 
75
74
  rubyforge_project: discoball
76
- rubygems_version: 1.3.7
75
+ rubygems_version: 1.6.2
77
76
  signing_key:
78
77
  specification_version: 2
79
78
  summary: A simple stream filter to highlight patterns