colorant 0.1.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.
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use ruby-1.9.2@colorist > /dev/null
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source :rubygems
2
+
3
+ # Specify your gem's dependencies in colorist.gemspec
4
+ gemspec
5
+ # gem "color_namer", :git => 'git://github.com/retro/color-namer.git'
6
+ # gem "bundler"
7
+ # gem "rspec", :git => 'git://github.com/rspec/rspec.git'
8
+ # gem "rspec-expectations", :git => 'git://github.com/rspec/rspec-expectations.git'
9
+ # gem "rspec-mocks", :git => 'git://github.com/rspec/rspec-mocks.git'
10
+ # gem "rspec-core", :git => 'git://github.com/rspec/rspec-core.git'
11
+ #
12
+ # gem "aruba", :git => 'git://github.com/aslakhellesoy/aruba.git'
13
+ # gem "cucumber", :git => 'git://github.com/aslakhellesoy/cucumber.git'
14
+ # gem "watchr"
15
+ # gem "trollop"
@@ -0,0 +1,89 @@
1
+ GIT
2
+ remote: git://github.com/aslakhellesoy/aruba.git
3
+ revision: 1cca0f2433b418e7e3a4a3d5671c2531bf5a7101
4
+ specs:
5
+ aruba (0.2.4)
6
+ background_process
7
+ cucumber (~> 0.9.3)
8
+
9
+ GIT
10
+ remote: git://github.com/aslakhellesoy/cucumber.git
11
+ revision: 19a87c14098afb7ed418b234b22a9e5b91eda5f4
12
+ specs:
13
+ cucumber (0.9.4)
14
+ builder (~> 2.1.2)
15
+ diff-lcs (~> 1.1.2)
16
+ gherkin (~> 2.2.9)
17
+ json (~> 1.4.6)
18
+ term-ansicolor (~> 1.0.5)
19
+
20
+ GIT
21
+ remote: git://github.com/retro/color-namer.git
22
+ revision: e5ba1bd142ecc4c22ece12784decd5e9ce1ba43e
23
+ specs:
24
+ color_namer (0.1.0)
25
+ color (>= 1.4.1)
26
+
27
+ GIT
28
+ remote: git://github.com/rspec/rspec-core.git
29
+ revision: 62402739a3e2f0e29ca025e60c600c1100f21424
30
+ specs:
31
+ rspec-core (2.2.pre)
32
+
33
+ GIT
34
+ remote: git://github.com/rspec/rspec-expectations.git
35
+ revision: 8729e9adbb2e1b50b8db2877afefd2e61ba18ad5
36
+ specs:
37
+ rspec-expectations (2.2.pre)
38
+ diff-lcs (~> 1.1.2)
39
+
40
+ GIT
41
+ remote: git://github.com/rspec/rspec-mocks.git
42
+ revision: ed672c6a2b943eac5b537d1f2c5beef71bb3aee9
43
+ specs:
44
+ rspec-mocks (2.2.pre)
45
+
46
+ GIT
47
+ remote: git://github.com/rspec/rspec.git
48
+ revision: 79447df6d32ec9e9eb3194bd1897293d824ca298
49
+ specs:
50
+ rspec (2.2.pre)
51
+ rspec-core (~> 2.2)
52
+ rspec-expectations (~> 2.2)
53
+ rspec-mocks (~> 2.2)
54
+
55
+ PATH
56
+ remote: .
57
+ specs:
58
+ colorist (0.0.1)
59
+
60
+ GEM
61
+ remote: http://rubygems.org/
62
+ specs:
63
+ background_process (1.2)
64
+ builder (2.1.2)
65
+ color (1.4.1)
66
+ diff-lcs (1.1.2)
67
+ gherkin (2.2.9)
68
+ json (~> 1.4.6)
69
+ term-ansicolor (~> 1.0.5)
70
+ json (1.4.6)
71
+ term-ansicolor (1.0.5)
72
+ trollop (1.16.2)
73
+ watchr (0.7)
74
+
75
+ PLATFORMS
76
+ ruby
77
+
78
+ DEPENDENCIES
79
+ aruba!
80
+ bundler
81
+ color_namer!
82
+ colorist!
83
+ cucumber!
84
+ rspec!
85
+ rspec-core!
86
+ rspec-expectations!
87
+ rspec-mocks!
88
+ trollop
89
+ watchr
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec) do |spec|
7
+ spec.pattern = FileList['spec/**/*_spec.rb']
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,57 @@
1
+ # colorant
2
+
3
+ Colorant is a small utility to determine which colors are present in a
4
+ particular image, and how much they appear. It wraps ImageMagick's `convert`
5
+ command, so it has to be installed on the system.
6
+
7
+ ## Usage
8
+
9
+ Just put it in your Gemfile:
10
+
11
+ gem "colorant"
12
+
13
+ And wherever you want, you only need a filename, and you get an array of color
14
+ percentual frequencies of your image.
15
+
16
+ colorant.process "path/to/my/leaves.jpg"
17
+ # => [["Brown", 78.95], ["Green", 3.85], ...]
18
+
19
+ These are other options you can specify:
20
+
21
+ colorant.process "file", :colors => 5, # Default is 8
22
+ :depth => 24, # Default is 16
23
+ :extended => true # Use more accurate color names
24
+
25
+ # => [["Vanilla Brown", 78.95], ["Lime Green", 3.85], ...] (up to 5 colors)
26
+
27
+ ## Command Line Usage
28
+
29
+ You can also use colorant from the command line. It is simple:
30
+
31
+ gem install colorant
32
+ colorant path/to/my/photo.jpg --colors 9 --extended
33
+
34
+ And the output:
35
+
36
+ Cocoa Brown -- 40.54 %
37
+ Moccaccino Red -- 17.88 %
38
+ Rock Brown -- 12.76 %
39
+ ...
40
+
41
+ The options you can use are the same as the above explained, just with the
42
+ CLI-like format.
43
+
44
+ ## Note on Patches/Pull Requests
45
+
46
+ * Fork the project.
47
+ * Make your feature addition or bug fix.
48
+ * Add specs for it. This is important so I don't break it in a
49
+ future version unintentionally.
50
+ * Commit, do not mess with rakefile, version, or history.
51
+ If you want to have your own version, that is fine but bump version
52
+ in a commit by itself I can ignore when I pull.
53
+ * Send me a pull request. Bonus points for topic branches.
54
+
55
+ ## Copyright
56
+
57
+ Copyright (c) 2010 Codegram. See LICENSE for details.
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ require 'trollop'
5
+ require 'colorant'
6
+
7
+ opts = Trollop::options do
8
+ version "colorant 0.1.0 (c) 2010 Codegram"
9
+ banner <<-EOS
10
+ Colorant is a simple utility to extract the colors present in an image.
11
+
12
+ Usage:
13
+ colorant <filename> [options]
14
+ where [options] are:
15
+ EOS
16
+ opt :colors, "Number of colors to process", :default => "8"
17
+ opt :depth, "Image depth in bits", :default => "16"
18
+ opt :extended, "Extended report (more accurate color names)"
19
+ end
20
+ Trollop::die :colors, "must be at least 1" if opts[:colors].to_i < 1
21
+ Trollop::die :depth, "must be at least 1" if opts[:depth].to_i < 1
22
+
23
+ opts.update(:reporter => :stdout) # Default for CLI
24
+
25
+ file = ARGV.shift
26
+ Colorant.process(file, opts)
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/colorant/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "colorant"
6
+ s.version = Colorant::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Josep M. Bach', 'Josep Jaume Rey', 'Oriol Gual']
9
+ s.email = ['info@codegram.com']
10
+ s.homepage = "http://github.com/codegram/colorant"
11
+ s.summary = "Easily extract the colors of any image file!"
12
+ s.description = "Easily extract the colors of any image file!"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "colorant"
16
+
17
+ s.add_development_dependency "bundler", ">= 1.0.3"
18
+ s.add_development_dependency 'rspec'
19
+ s.add_development_dependency 'cucumber'
20
+ s.add_development_dependency 'aruba'
21
+
22
+ s.add_runtime_dependency 'trollop'
23
+ s.add_runtime_dependency "color_namer"
24
+
25
+ s.files = `git ls-files`.split("\n")
26
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
27
+ s.require_path = 'lib'
28
+ end
@@ -0,0 +1,30 @@
1
+ Feature: Command line interpreter
2
+
3
+ You can use Colorist from the command line as well.
4
+
5
+ Scenario: get the most relevant colors out of the Arnolfini Portrait
6
+ When I run "colorist arnolfini.jpg --colors 8 --depth 24"
7
+
8
+ Then the exit status should be 0
9
+ And the output should contain "Brown -- 40.54 %"
10
+ And the output should contain "Red -- 17.88 %"
11
+ And the output should contain "Brown -- 12.76 %"
12
+ And the output should contain "Red -- 9.95 %"
13
+ And the output should contain "Brown -- 8.03 %"
14
+ And the output should contain "Brown -- 4.25 %"
15
+ And the output should contain "Red -- 3.55 %"
16
+ And the output should contain "Brown -- 3.03 %"
17
+
18
+ Scenario: get an extended report over the Arnolfini Portrait
19
+ When I run "colorist arnolfini.jpg --extended"
20
+
21
+ Then the exit status should be 0
22
+ And the output should contain "Cocoa Brown -- 40.54 %"
23
+ And the output should contain "Moccaccino Red -- 17.88 %"
24
+ And the output should contain "Rock Brown -- 12.76 %"
25
+ And the output should contain "Mojo Red -- 9.95 %"
26
+ And the output should contain "Brown Derby -- 8.03 %"
27
+ And the output should contain "Dark Tan Brown -- 4.25 %"
28
+ And the output should contain "Brandy Rose Red -- 3.55 %"
29
+ And the output should contain "Vanilla Brown -- 3.03 %"
30
+
@@ -0,0 +1,10 @@
1
+ require 'aruba'
2
+ require 'fileutils'
3
+
4
+ Before do
5
+ FileUtils.mkdir_p('tmp/aruba')
6
+ FileUtils.cp_r('spec/support/arnolfini.jpg', 'tmp/aruba/')
7
+ end
8
+ After do
9
+ FileUtils.rm_rf('tmp/aruba')
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'colorant/parser'
2
+ require 'colorant/reporter'
3
+ require 'colorant/processer'
4
+
5
+ module Colorant
6
+ def self.process(*args)
7
+ raise "You must have `convert` (ImageMagick) installed." unless `which convert` =~ /convert/
8
+ Processer.process(*args)
9
+ end
10
+ end
@@ -0,0 +1,39 @@
1
+ module Colorant
2
+ class Parser
3
+
4
+ class << self
5
+ def parse(*args)
6
+ new.parse(*args)
7
+ end
8
+ end
9
+
10
+ def parse(raw_data)
11
+ collection = []
12
+ raw_data.split("\n").map(&:strip).each do |line|
13
+ line.match /^(\d+):.*rgb\((.*)%,(.*)%,(.*)%\)$/
14
+ freq = $1.to_i
15
+ red, green, blue = [$2,$3,$4].map do |color|
16
+ color.to_f / 100.to_f
17
+ end
18
+ collection << { :freq => freq,
19
+ :red => percent_to_number(red),
20
+ :green => percent_to_number(green),
21
+ :blue => percent_to_number(blue) }
22
+ end
23
+ total = collection.map{|element| element[:freq]}.inject(:+)
24
+ collection.each{|element| element[:freq] = number_to_percent(element[:freq], total)}
25
+ collection
26
+ end
27
+
28
+ private
29
+
30
+ def percent_to_number(percent)
31
+ ("%.2f" % (255 * percent)).to_f
32
+ end
33
+
34
+ def number_to_percent(number, total)
35
+ ("%.2f" % ((number * 100.to_f) / total)).to_f
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ module Colorant
2
+ class Processer
3
+ attr_reader :colors, :depth, :file, :data
4
+
5
+ def initialize(file, options = {})
6
+ begin
7
+ File.open(file)
8
+ rescue=>e
9
+ raise ArgumentError.new "#{file} does not exist or is not a valid image file"
10
+ end
11
+ @file = file
12
+ @colors = options[:colors] ? options[:colors].to_i : 8
13
+ @depth = options[:depth] ? options[:depth].to_i : 16
14
+ @reporter_options = {:reporter => options[:reporter],
15
+ :extended => options[:extended]}
16
+ @data = []
17
+ end
18
+
19
+ def process!
20
+ raw_data = `convert #{file} -format %c -colors #{colors} -depth #{depth} histogram:info:- | sort -r -k 1`
21
+ @data = Parser.parse(raw_data)
22
+ Reporter.report(@data, @reporter_options)
23
+ end
24
+
25
+ class << self
26
+ def process(*args)
27
+ instance = new(*args)
28
+ instance.process!
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def parse(raw_data)
35
+ collection = []
36
+ raw_data.split("\n").map(&:strip).each do |line|
37
+ line.match /^(\d+):.*rgb\((.*)%,(.*)%,(.*)%\)$/
38
+ freq = $1.to_i
39
+ red, green, blue = [$2,$3,$4].map do |color|
40
+ color.to_f / 100.to_f
41
+ end
42
+ collection << { :freq => freq,
43
+ :red => percent_to_number(red),
44
+ :green => percent_to_number(green),
45
+ :blue => percent_to_number(blue) }
46
+ end
47
+ total = collection.map{|element| element[:freq]}.inject(:+)
48
+ collection.each{|element| element[:freq] = number_to_percent(element[:freq], total)}
49
+ collection
50
+ end
51
+
52
+ def percent_to_number(percent)
53
+ ("%.2f" % (255 * percent)).to_f
54
+ end
55
+
56
+ def number_to_percent(number, total)
57
+ ("%.2f" % ((number * 100.to_f) / total)).to_f
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,43 @@
1
+ require 'color_namer'
2
+
3
+ module Colorant
4
+ class Reporter
5
+
6
+ class << self
7
+ def report(*args)
8
+ new.report(*args)
9
+ end
10
+ end
11
+
12
+ def report(data, options = {})
13
+ data.map! do |row|
14
+ color = ColorNamer.name_from_rgb(row[:red], row[:green], row[:blue])
15
+ if options[:extended]
16
+ name = color[1].match(color.last) ? color[1] : "#{color[1]} #{color.last}"
17
+ [name, row[:freq]]
18
+ else
19
+ [color.last, row[:freq]]
20
+ end
21
+ end
22
+ send(:"#{options[:reporter] || :ruby}_report", data)
23
+ end
24
+
25
+ private
26
+
27
+ def ruby_report(array)
28
+ array
29
+ end
30
+
31
+ def stdout_report(array)
32
+ array.each do |line|
33
+ stdout << "\t#{line.first}\t\t-- #{line.last} %\n"
34
+ end
35
+ stdout << "\n"
36
+ end
37
+
38
+ def stdout
39
+ $stdout
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,3 @@
1
+ module Colorant
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Colorant
4
+ describe Parser do
5
+
6
+ subject { Parser.new }
7
+
8
+ describe "instance methods" do
9
+
10
+ let(:raw_data) { " 3970743: (16087,11029, 8895) #3ED72B1522BF rgb(24.5472%,16.8292%,13.5729%)\n 1649905: (42205,28716,22999) #A4DD702C59D7 rgb(64.4007%,43.8178%,35.0942%)\n\n" }
11
+
12
+ let(:arnolfini_data) do
13
+ [
14
+ {:freq => 70.65, :red => 62.60, :green => 42.91, :blue => 34.61},
15
+ {:freq => 29.35, :red => 164.22, :green => 111.74, :blue => 89.49}
16
+ ]
17
+ end
18
+
19
+ describe "#parse" do
20
+ it 'gets the colors from the image' do
21
+ subject.parse(raw_data).should == arnolfini_data
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ describe "class methods" do
28
+
29
+ describe "#parse" do
30
+ it 'initializes a new instance and calls parse' do
31
+ instance = double('parser')
32
+ data = double('data')
33
+
34
+ Parser.should_receive(:new).and_return instance
35
+ instance.should_receive(:parse).with(data)
36
+
37
+ Parser.parse(data)
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module Colorant
4
+ describe Processer do
5
+
6
+ subject { Processer.new('spec/support/arnolfini.jpg') }
7
+
8
+ it "sets the default colors to 8" do
9
+ subject.colors.should == 8
10
+ end
11
+
12
+ it "sets the default depth to 16" do
13
+ subject.depth.should == 16
14
+ end
15
+
16
+ it "raises an argument error if provided an invalid file" do
17
+ expect {
18
+ Processer.new('invalid_file.txt')
19
+ }.to raise_error(ArgumentError, "invalid_file.txt does not exist or is not a valid image file")
20
+ end
21
+
22
+ describe "instance methods" do
23
+
24
+ subject { Processer.new('spec/support/arnolfini.jpg', :colors => 2) }
25
+
26
+ let(:arnolfini_data) do
27
+ [
28
+ {:freq => 70.65, :red => 62.60, :green => 42.91, :blue => 34.61},
29
+ {:freq => 29.35, :red => 164.22, :green => 111.74, :blue => 89.49}
30
+ ]
31
+ end
32
+
33
+ describe "#process!" do
34
+ it 'calls first the Parser and then the Reporter' do
35
+ Parser.should_receive(:parse).and_return arnolfini_data
36
+ Reporter.should_receive(:report).with(arnolfini_data, :reporter => nil, :extended => nil).ordered
37
+ subject.process!
38
+ end
39
+ end
40
+
41
+
42
+ end
43
+
44
+ describe "class methods" do
45
+
46
+ describe "#process" do
47
+ it 'initializes a new instance and calls process' do
48
+ instance = double('processer')
49
+ Processer.should_receive(:new).with('file', :colors => 2).and_return instance
50
+ instance.should_receive(:process!)
51
+
52
+ Processer.process('file', :colors => 2)
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ module Colorant
4
+ describe Reporter do
5
+
6
+ describe "class methods" do
7
+
8
+ describe "#report" do
9
+ it 'initializes a new instance and calls report' do
10
+ instance = double('reporter')
11
+ Reporter.should_receive(:new).and_return instance
12
+ instance.should_receive(:report).with('data')
13
+
14
+ Reporter.report('data')
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ describe "instance methods" do
21
+
22
+ let(:arnolfini_data) do
23
+ [
24
+ {:freq => 70.65, :red => 62.60, :green => 42.91, :blue => 34.61},
25
+ {:freq => 29.35, :red => 164.22, :green => 111.74, :blue => 89.49}
26
+ ]
27
+ end
28
+
29
+ subject { Reporter.new }
30
+
31
+ describe "#report" do
32
+
33
+ it 'outputs a simple ordered array with the image color composition' do
34
+ subject.report(arnolfini_data).should == [["Brown", 70.65],
35
+ ["Brown", 29.35]]
36
+ end
37
+
38
+ context "when called with :extended => true" do
39
+
40
+ it 'outputs more accurate info about the color' do
41
+ subject.report(arnolfini_data, :extended => true).should == [["Bistre Brown", 70.65],
42
+ ["Au Chico Brown", 29.35]]
43
+ end
44
+
45
+ it 'removes duplication to keep the color name nice' do
46
+ ColorNamer.should_receive(:name_from_rgb).and_return(["594537", "Brown Derby", "Brown"],
47
+ ["FFFF00", "Yellow", "Yellow"])
48
+
49
+ subject.report(arnolfini_data, :extended => true).should == [["Brown Derby", 70.65],
50
+ ["Yellow", 29.35]]
51
+ end
52
+ end
53
+
54
+ context "with :stdout reporter (default from CLI)" do
55
+
56
+ before do
57
+ @out = StringIO.new
58
+ subject.stub(:stdout).and_return @out
59
+ end
60
+
61
+ it 'outputs a simple ordered array with the image color composition' do
62
+ subject.report(arnolfini_data, :reporter => :stdout)
63
+ @out.string.should include "\tBrown\t\t-- 70.65 %\n"
64
+ @out.string.should include "\tBrown\t\t-- 29.35 %\n"
65
+ end
66
+
67
+ context "when called with :extended => true" do
68
+
69
+ it 'outputs more accurate info about the color' do
70
+ subject.report(arnolfini_data, :extended => true, :reporter => :stdout)
71
+ @out.string.should include "\tBistre Brown\t\t-- 70.65 %\n"
72
+ @out.string.should include "\tAu Chico Brown\t\t-- 29.35 %\n"
73
+ end
74
+
75
+ it 'removes duplication to keep the color name nice' do
76
+ ColorNamer.should_receive(:name_from_rgb).and_return(["594537", "Brown Derby", "Brown"],
77
+ ["FFFF00", "Yellow", "Yellow"])
78
+
79
+ subject.report(arnolfini_data, :extended => true, :reporter => :stdout)
80
+ @out.string.should include "\tBrown Derby\t\t-- 70.65 %\n"
81
+ @out.string.should include "\tYellow\t\t-- 29.35 %\n"
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ # require 'simplecov'
3
+ # SimpleCov.start do
4
+ # add_group "Lib", "lib"
5
+ # end
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+
16
+ require 'colorant'
17
+ require 'rspec'
18
+
19
+ # Requires supporting files with custom matchers and macros, etc,
20
+ # in ./support/ and its subdirectories.
21
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
@@ -0,0 +1,75 @@
1
+ # adapted from http://github.com/rspec/rspec-rails/blob/master/specs.watchr
2
+
3
+ # Run me with:
4
+ #
5
+ # $ watchr specs.watchr
6
+
7
+ # --------------------------------------------------
8
+ # Convenience Methods
9
+ # --------------------------------------------------
10
+ def all_spec_files
11
+ Dir['spec/**/*_spec.rb']
12
+ end
13
+
14
+ def run_spec_matching(thing_to_match)
15
+ matches = all_spec_files.grep(/#{thing_to_match}/i)
16
+ if matches.empty?
17
+ puts "Sorry, thanks for playing, but there were no matches for #{thing_to_match}"
18
+ else
19
+ run matches.join(' ')
20
+ end
21
+ end
22
+
23
+ def run(files_to_run)
24
+ puts("Running: #{files_to_run}")
25
+ system("bundle exec rspec -c #{files_to_run}")
26
+ no_int_for_you
27
+ end
28
+
29
+ def run_feature(feature)
30
+ system("cucumber #{feature}")
31
+ end
32
+
33
+ def run_all_specs
34
+ run(all_spec_files.join(' '))
35
+ end
36
+
37
+ def run_all_features
38
+ system('clear')
39
+ system('cucumber')
40
+ end
41
+
42
+
43
+ # --------------------------------------------------
44
+ # Watchr Rules
45
+ # --------------------------------------------------
46
+ watch('^spec/(.*)_spec\.rb') { |m| run_spec_matching(m[1]) }
47
+ watch('^app/(.*)\.rb') { |m| run_spec_matching(m[1]) }
48
+ watch('^app/(.*)\.haml') { |m| run_spec_matching(m[1]) }
49
+ watch('^lib/(.*)\.rb') { |m| run_spec_matching(m[1]) }
50
+ watch('^spec/spec_helper\.rb') { run_all_specs }
51
+ watch('^spec/support/.*\.rb') { run_all_specs }
52
+ watch('^features/(.*)\.feature') { |m| run_feature(m) }
53
+ watch('^features/(.*)\.rb') { |m| run_feature('features') }
54
+
55
+ # --------------------------------------------------
56
+ # Signal Handling
57
+ # --------------------------------------------------
58
+
59
+ def no_int_for_you
60
+ @sent_an_int = nil
61
+ end
62
+
63
+ Signal.trap 'INT' do
64
+ if @sent_an_int then
65
+ puts " A second INT? Ok, I get the message. Shutting down now."
66
+ exit
67
+ else
68
+ puts " Did you just send me an INT? Ugh. I'll quit for real if you do it again."
69
+ @sent_an_int = true
70
+ Kernel.sleep 1.5
71
+ run_all_specs
72
+ run_all_features
73
+ end
74
+ end
75
+
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: colorant
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
+ platform: ruby
11
+ authors:
12
+ - Josep M. Bach
13
+ - Josep Jaume Rey
14
+ - Oriol Gual
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-11-10 00:00:00 +01:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: bundler
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 3
34
+ version: 1.0.3
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: cucumber
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: aruba
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :development
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: trollop
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ type: :runtime
88
+ version_requirements: *id005
89
+ - !ruby/object:Gem::Dependency
90
+ name: color_namer
91
+ prerelease: false
92
+ requirement: &id006 !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ type: :runtime
101
+ version_requirements: *id006
102
+ description: Easily extract the colors of any image file!
103
+ email:
104
+ - info@codegram.com
105
+ executables:
106
+ - colorant
107
+ extensions: []
108
+
109
+ extra_rdoc_files: []
110
+
111
+ files:
112
+ - .gitignore
113
+ - .rspec
114
+ - .rvmrc
115
+ - Gemfile
116
+ - Gemfile.lock
117
+ - Rakefile
118
+ - Readme.md
119
+ - bin/colorant
120
+ - colorant.gemspec
121
+ - features/cli.feature
122
+ - features/support/env.rb
123
+ - lib/colorant.rb
124
+ - lib/colorant/parser.rb
125
+ - lib/colorant/processer.rb
126
+ - lib/colorant/reporter.rb
127
+ - lib/colorant/version.rb
128
+ - spec/parser_spec.rb
129
+ - spec/processer_spec.rb
130
+ - spec/reporter_spec.rb
131
+ - spec/spec_helper.rb
132
+ - spec/support/arnolfini.jpg
133
+ - specs.watchr
134
+ has_rdoc: true
135
+ homepage: http://github.com/codegram/colorant
136
+ licenses: []
137
+
138
+ post_install_message:
139
+ rdoc_options: []
140
+
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ segments:
149
+ - 0
150
+ version: "0"
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ segments:
157
+ - 1
158
+ - 3
159
+ - 6
160
+ version: 1.3.6
161
+ requirements: []
162
+
163
+ rubyforge_project: colorant
164
+ rubygems_version: 1.3.7
165
+ signing_key:
166
+ specification_version: 3
167
+ summary: Easily extract the colors of any image file!
168
+ test_files: []
169
+