From 502393ba0d16acb21d4831fd78f418540480e3c8 Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 09:33:07 +1100 Subject: [PATCH 1/6] Added in the guard gem to make the testing cycle faster --- .gitignore | 4 +++- Gemfile | 3 +++ Gemfile.lock | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2288186..ff0a7d2 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ doc # jeweler generated pkg +Guardfile + # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore: # # * Create a file at ~/.gitignore @@ -39,4 +41,4 @@ pkg #.\#* # # For vim: -#*.swp +*.swp diff --git a/Gemfile b/Gemfile index a153aaa..126eea7 100644 --- a/Gemfile +++ b/Gemfile @@ -7,4 +7,7 @@ group :development, :test do gem 'bundler', '~> 1.0.0' gem 'jeweler', '~> 1.5.2' gem 'rspec', '2.6.0' + gem 'guard', '1.0.1' + gem 'guard-cucumber', '0.7.5' + gem 'guard-rspec', '0.6.0' end diff --git a/Gemfile.lock b/Gemfile.lock index 84c10db..6fc3c4c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,9 +10,18 @@ GEM json (>= 1.4.6) term-ansicolor (>= 1.0.6) diff-lcs (1.1.3) + ffi (1.0.11) gherkin (2.5.1) json (>= 1.4.6) git (1.2.5) + guard (1.0.1) + ffi (>= 0.5.0) + thor (~> 0.14.6) + guard-cucumber (0.7.5) + cucumber (>= 0.10) + guard (>= 0.8.3) + guard-rspec (0.6.0) + guard (>= 0.10.0) jeweler (1.5.2) bundler (~> 1.0.0) git (>= 1.2.5) @@ -28,6 +37,7 @@ GEM diff-lcs (~> 1.1.2) rspec-mocks (2.6.0) term-ansicolor (1.0.6) + thor (0.14.6) PLATFORMS ruby @@ -36,5 +46,8 @@ DEPENDENCIES bundler (~> 1.0.0) colored (>= 1.2) cucumber (>= 0.10.0) + guard (= 1.0.1) + guard-cucumber (= 0.7.5) + guard-rspec (= 0.6.0) jeweler (~> 1.5.2) rspec (= 2.6.0) From c305a2c21cda5556c0ad839dc513faf85532e2f5 Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 09:41:52 +1100 Subject: [PATCH 2/6] Marking pending steps as pending so I don't think the test suite is passing when really it isn't --- features/step_definitions/enhanced_logging_steps.rb | 5 ++++- features/step_definitions/scenario_outline_steps.rb | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/features/step_definitions/enhanced_logging_steps.rb b/features/step_definitions/enhanced_logging_steps.rb index d084ffa..503d8a7 100644 --- a/features/step_definitions/enhanced_logging_steps.rb +++ b/features/step_definitions/enhanced_logging_steps.rb @@ -36,12 +36,15 @@ def self.logger Given /^a cucumber feature is executing against my rails application$/ do #Rails.logger.reset + pending end When /^I examine the rails log$/ do + pending end When /^I do some crazy Inception like test on myself$/ do + pending end Then /^I see the following log entries:$/ do |ast| @@ -53,4 +56,4 @@ def self.logger log.first.chomp.strip == message && log[1] == colour end end -end \ No newline at end of file +end diff --git a/features/step_definitions/scenario_outline_steps.rb b/features/step_definitions/scenario_outline_steps.rb index 5cd5ec8..98ece44 100644 --- a/features/step_definitions/scenario_outline_steps.rb +++ b/features/step_definitions/scenario_outline_steps.rb @@ -1,5 +1,7 @@ When /^the features references different countries being "([^"]*)"$/ do |country| + pending end When /^the feature includes a reference to the price of eggs being "([^"]*)"$/ do |price| -end \ No newline at end of file + pending +end From aad3fd3af2e8baaa1b2f17bd70d4411e473daa6a Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 09:46:24 +1100 Subject: [PATCH 3/6] Adding in my own set of unimplemented features just to be consistent :/ --- features/enhanced_logger.feature | 2 +- features/examples_support.feature | 4 ++-- features/rspec_examples_support.feature | 18 ++++++++++++++++++ .../step_definitions/enhanced_logging_steps.rb | 5 ++++- 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 features/rspec_examples_support.feature diff --git a/features/enhanced_logger.feature b/features/enhanced_logger.feature index 1217405..d4c8974 100644 --- a/features/enhanced_logger.feature +++ b/features/enhanced_logger.feature @@ -12,4 +12,4 @@ Scenario: Step information is written to the rails log | STEP INFORMATION IS WRITTEN TO THE RAILS LOG | black_on_green | | Given a cucumber feature is executing against my rails application | black_on_yellow | | When I examine the rails log | black_on_yellow | - | And I do some crazy Inception like test on myself | black_on_yellow | \ No newline at end of file + | And I do some crazy Inception like test on myself | black_on_yellow | diff --git a/features/examples_support.feature b/features/examples_support.feature index 9b03abe..12c0d14 100644 --- a/features/examples_support.feature +++ b/features/examples_support.feature @@ -1,4 +1,4 @@ -Feature: A developer can happily run cucumber scenarios/examples an everything works fine +Feature: A developer can happily run cucumber scenarios/examples and everything works fine As a developer In order to derive joy and happiness when checking my cucumber logs I want to see rainbows and unicorns when my log files run @@ -19,4 +19,4 @@ Feature: A developer can happily run cucumber scenarios/examples an everything w Examples: | country | price | | Australia | 2.99 | - | Japan | 2.69 | \ No newline at end of file + | Japan | 2.69 | diff --git a/features/rspec_examples_support.feature b/features/rspec_examples_support.feature new file mode 100644 index 0000000..6f58be9 --- /dev/null +++ b/features/rspec_examples_support.feature @@ -0,0 +1,18 @@ +Feature: A developer can happily run rspec examples and everything works fine + As a developer + In order to save time looking through log files + I want my rspec test names to be highlighted + + Scenario: rSpec Example Support + Given an rSpec test file is being executed + When I examine the rails log + And I do some crazy Inception like test on myself + And the features references different countries being "" + And the feature includes a reference to the price of eggs being "" + Then I see the following log entries: + | Message | Colour | + | STEP INFORMATION IS WRITTEN TO THE RAILS LOG | black_on_green | + | Given a cucumber feature is executing against my rails application | black_on_yellow | + | When I examine the rails log | black_on_yellow | + | And I do some crazy Inception like test on myself | black_on_yellow | + diff --git a/features/step_definitions/enhanced_logging_steps.rb b/features/step_definitions/enhanced_logging_steps.rb index 503d8a7..0e99066 100644 --- a/features/step_definitions/enhanced_logging_steps.rb +++ b/features/step_definitions/enhanced_logging_steps.rb @@ -34,8 +34,11 @@ def self.logger end end +Given /^an rSpec test file is being executed$/ do + pending +end + Given /^a cucumber feature is executing against my rails application$/ do - #Rails.logger.reset pending end From 03d1a329eb6f7129546d57e90a5d4410d0ca205a Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 11:04:05 +1100 Subject: [PATCH 4/6] Updating gitignore for mac users --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ff0a7d2..68f8d77 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,7 @@ Guardfile # # For MacOS: # -#.DS_Store +.DS_Store # # For TextMate #*.tmproj From a8a72872f38bd80bc75fe04b65ffb31c37f733c7 Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 11:19:22 +1100 Subject: [PATCH 5/6] Created new RSpec frog for logging RSpec example names when running specs --- frogger.gemspec | 36 +++++++++------- lib/frogger.rb | 15 ++++++- lib/frogger/cucumber/frog.rb | 67 ++++++++++++++++++++++++++++++ lib/frogger/cucumber/init.rb | 9 ++++ lib/frogger/rspec/frog.rb | 22 ++++++++++ lib/frogger/rspec/init.rb | 8 ++++ spec/frogger/cucumber/frog_spec.rb | 56 +++++++++++++++++++++++++ spec/frogger/rspec/frog_spec.rb | 28 +++++++++++++ 8 files changed, 225 insertions(+), 16 deletions(-) create mode 100644 lib/frogger/cucumber/frog.rb create mode 100644 lib/frogger/cucumber/init.rb create mode 100644 lib/frogger/rspec/frog.rb create mode 100644 lib/frogger/rspec/init.rb create mode 100644 spec/frogger/cucumber/frog_spec.rb create mode 100644 spec/frogger/rspec/frog_spec.rb diff --git a/frogger.gemspec b/frogger.gemspec index 8172eb9..4b02cc3 100644 --- a/frogger.gemspec +++ b/frogger.gemspec @@ -4,14 +4,14 @@ # -*- encoding: utf-8 -*- Gem::Specification.new do |s| - s.name = %q{frogger} + s.name = "frogger" s.version = "0.3.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = [%q{Richie Khoo}] - s.date = %q{2011-09-29} - s.description = %q{Navigating noise in your log files can be like trying to cross a busy road and avoid the cars. Frogger makes your log files more fun by adding some good ol' 8 bit color and a bit of formatting.} - s.email = %q{evolve2k@gmail.com} + s.authors = ["Richie Khoo"] + s.date = "2012-03-17" + s.description = "Navigating noise in your log files can be like trying to cross a busy road and avoid the cars. Frogger makes your log files more fun by adding some good ol' 8 bit color and a bit of formatting." + s.email = "evolve2k@gmail.com" s.extra_rdoc_files = [ "LICENSE.txt", "README.textile" @@ -27,23 +27,22 @@ Gem::Specification.new do |s| "VERSION", "features/enhanced_logger.feature", "features/examples_support.feature", + "features/rspec_examples_support.feature", "features/step_definitions/enhanced_logging_steps.rb", "features/step_definitions/scenario_outline_steps.rb", "features/support/env.rb", "frogger.gemspec", "lib/frogger.rb", - "lib/frogger/cucumber.rb", - "lib/frogger/frog.rb", - "spec/frogger/frog_spec.rb", "spec/spec_helper.rb" ] - s.homepage = %q{http://github.com/evolve2k/frogger} - s.licenses = [%q{MIT}] - s.require_paths = [%q{lib}] - s.rubygems_version = %q{1.8.7} - s.summary = %q{Frogger makes logs easier to navigate.} + s.homepage = "http://github.com/evolve2k/frogger" + s.licenses = ["MIT"] + s.require_paths = ["lib"] + s.rubygems_version = "1.8.10" + s.summary = "Frogger makes logs easier to navigate." s.test_files = [ - "spec/frogger/frog_spec.rb", + "spec/frogger/cucumber/frog_spec.rb", + "spec/frogger/rspec/frog_spec.rb", "spec/spec_helper.rb" ] @@ -56,12 +55,18 @@ Gem::Specification.new do |s| s.add_development_dependency(%q, ["~> 1.0.0"]) s.add_development_dependency(%q, ["~> 1.5.2"]) s.add_development_dependency(%q, ["= 2.6.0"]) + s.add_development_dependency(%q, ["= 1.0.1"]) + s.add_development_dependency(%q, ["= 0.7.5"]) + s.add_development_dependency(%q, ["= 0.6.0"]) else s.add_dependency(%q, [">= 1.2"]) s.add_dependency(%q, [">= 0.10.0"]) s.add_dependency(%q, ["~> 1.0.0"]) s.add_dependency(%q, ["~> 1.5.2"]) s.add_dependency(%q, ["= 2.6.0"]) + s.add_dependency(%q, ["= 1.0.1"]) + s.add_dependency(%q, ["= 0.7.5"]) + s.add_dependency(%q, ["= 0.6.0"]) end else s.add_dependency(%q, [">= 1.2"]) @@ -69,6 +74,9 @@ Gem::Specification.new do |s| s.add_dependency(%q, ["~> 1.0.0"]) s.add_dependency(%q, ["~> 1.5.2"]) s.add_dependency(%q, ["= 2.6.0"]) + s.add_dependency(%q, ["= 1.0.1"]) + s.add_dependency(%q, ["= 0.7.5"]) + s.add_dependency(%q, ["= 0.6.0"]) end end diff --git a/lib/frogger.rb b/lib/frogger.rb index 8042565..041d442 100644 --- a/lib/frogger.rb +++ b/lib/frogger.rb @@ -3,5 +3,16 @@ module Frogger end -require 'frogger/frog' -require 'frogger/cucumber' if defined?(Cucumber) +if defined?(Cucumber) + module Frogger::Cucumber + end + require 'frogger/cucumber/frog' + require 'frogger/cucumber/init' +end + +if defined?(RSpec) + module Frogger::RSpec + end + require 'frogger/rspec/frog' + require 'frogger/rspec/init' +end diff --git a/lib/frogger/cucumber/frog.rb b/lib/frogger/cucumber/frog.rb new file mode 100644 index 0000000..611c1e3 --- /dev/null +++ b/lib/frogger/cucumber/frog.rb @@ -0,0 +1,67 @@ +class Frogger::Cucumber::Frog + attr_reader :scenario, :logger + attr_accessor :step_index + + def initialize(scenario, logger = default_logger) + @scenario = scenario + @logger = logger + @step_index = 0 + end + + def log_scenario + padding = max_length - 2 - scenario.name.length + logger.debug( + "\n\n #{scenario.name.upcase}#{ ' ' * padding } ".black_on_green + ) + end + + def log_step + return if step.nil? + + step_to_s = "#{step.keyword}#{step.name}" + padding = [max_length - 4 - step_to_s.length, 0].max + + logger.debug "\n #{ step_to_s }#{ ' ' * padding } ".black_on_yellow + + self.step_index += 1 + end + + def scenario_outline? + scenario.class == Cucumber::Ast::OutlineTable::ExampleRow + end + + private + + def default_logger + Rails.logger + end + + def steps + @steps ||= background_steps + + (scenario_outline? ? scenario.scenario_outline.raw_steps : scenario.raw_steps) + end + + def step + steps[step_index] + end + + def background + @background ||= begin + if scenario_outline? + scenario.scenario_outline.feature.instance_variable_get(:@background) + else + scenario.feature.instance_variable_get(:@background) + end + end + end + + def background_steps + background.nil? ? [] : background.instance_variable_get(:@raw_steps) + end + + def max_length + @max_length ||= steps.inject(scenario.name.length) { |max, step| + [max, "#{step.keyword} #{step.name}".length].max + } + 6 + end +end diff --git a/lib/frogger/cucumber/init.rb b/lib/frogger/cucumber/init.rb new file mode 100644 index 0000000..ed67300 --- /dev/null +++ b/lib/frogger/cucumber/init.rb @@ -0,0 +1,9 @@ +Before do |scenario| + @frog = Frogger::Cucumber::Frog.new scenario + @frog.log_scenario + @frog.log_step +end if respond_to?(:Before) + +AfterStep do + @frog.log_step +end if respond_to?(:AfterStep) diff --git a/lib/frogger/rspec/frog.rb b/lib/frogger/rspec/frog.rb new file mode 100644 index 0000000..8f270b8 --- /dev/null +++ b/lib/frogger/rspec/frog.rb @@ -0,0 +1,22 @@ +class Frogger::RSpec::Frog + attr_reader :example, :logger + + def initialize(example, logger = default_logger) + @example = example + @logger = logger + end + + def log_example + group_descriptions = example.example_group.ancestors.map(&:description) + spec_name = [*group_descriptions.reverse, example.description].join(" ") + if logger.respond_to?(:debug) + logger.debug "\n #{ spec_name }".black_on_yellow + end + end + + private + + def default_logger + Rails.logger + end +end diff --git a/lib/frogger/rspec/init.rb b/lib/frogger/rspec/init.rb new file mode 100644 index 0000000..eb44a4b --- /dev/null +++ b/lib/frogger/rspec/init.rb @@ -0,0 +1,8 @@ +if RSpec.respond_to?(:configure) + RSpec.configure do |config| + config.before(:each) do + @frog = Frogger::RSpec::Frog.new self.example + @frog.log_example + end + end +end diff --git a/spec/frogger/cucumber/frog_spec.rb b/spec/frogger/cucumber/frog_spec.rb new file mode 100644 index 0000000..b67572d --- /dev/null +++ b/spec/frogger/cucumber/frog_spec.rb @@ -0,0 +1,56 @@ +require 'spec_helper' + +module Rails + def self.logger + :rails_logger + end +end + +describe Frogger::Cucumber::Frog do + let(:frog) { Frogger::Cucumber::Frog.new(scenario, custom_logger) } + let(:scenario) { double('Scenario', :raw_steps => [step], :name => 'Foo') } + let(:custom_logger) { double('Custom Logger', :debug => true) } + let(:step) { double('Step', :keyword => 'When', :name => ' something happens') } + + before :each do + scenario.stub_chain(:feature, :instance_variable_get).and_return(nil) + end + + describe '#logger' do + it "is the logger passed in when initialised" do + frog = Frogger::Cucumber::Frog.new(scenario, custom_logger) + frog.logger.should == custom_logger + end + + it "defaults to the Rails logger" do + frog = Frogger::Cucumber::Frog.new(scenario) + frog.logger.should == Rails.logger + end + end + + describe '#log_scenario' do + it "prints the scenario name in black on green" do + custom_logger.should_receive(:debug).with("\n\n FOO ".black_on_green) + frog.log_scenario + end + end + + describe '#log_step' do + it "prints the step name in black on yellow" do + custom_logger.should_receive(:debug).with("\n When something happens ".black_on_yellow) + frog.log_step + end + + it "increments the step index" do + step_index = frog.step_index + frog.log_step + frog.step_index.should == step_index + 1 + end + end + + describe '#step_index' do + it "defaults to 0" do + frog.step_index.should == 0 + end + end +end diff --git a/spec/frogger/rspec/frog_spec.rb b/spec/frogger/rspec/frog_spec.rb new file mode 100644 index 0000000..be6d64a --- /dev/null +++ b/spec/frogger/rspec/frog_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +module Rails + def self.logger + :rails_logger + end +end + +describe Frogger::RSpec::Frog do + let(:frog) { Frogger::RSpec::Frog.new(example, custom_logger) } + let(:custom_logger) { double('Custom Logger', :debug => true) } + let(:example) do + double('Rspec example', + :description => 'example name', + :example_group => example_group) + end + let(:example_group) { double('Example group', :ancestors => ancestors) } + let(:ancestors) do + [stub(:description => 'ancestor 1'), stub(:description => 'ancestor 2')] + end + + describe '#log_example' do + it 'prints the example name in black and green' do + custom_logger.should_receive(:debug).with("\n ancestor 2 ancestor 1 example name".black_on_yellow) + frog.log_example + end + end +end From 87019a168faf5a49f57f791b0add22e2ade4cccf Mon Sep 17 00:00:00 2001 From: Scott Harvey Date: Sat, 17 Mar 2012 11:19:58 +1100 Subject: [PATCH 6/6] Removing old files --- lib/frogger/cucumber.rb | 9 ------ lib/frogger/frog.rb | 67 --------------------------------------- spec/frogger/frog_spec.rb | 56 -------------------------------- 3 files changed, 132 deletions(-) delete mode 100644 lib/frogger/cucumber.rb delete mode 100644 lib/frogger/frog.rb delete mode 100644 spec/frogger/frog_spec.rb diff --git a/lib/frogger/cucumber.rb b/lib/frogger/cucumber.rb deleted file mode 100644 index 5dce33b..0000000 --- a/lib/frogger/cucumber.rb +++ /dev/null @@ -1,9 +0,0 @@ -Before do |scenario| - @frog = Frogger::Frog.new scenario - @frog.log_scenario - @frog.log_step -end if respond_to?(:Before) - -AfterStep do - @frog.log_step -end if respond_to?(:AfterStep) diff --git a/lib/frogger/frog.rb b/lib/frogger/frog.rb deleted file mode 100644 index d0be7f1..0000000 --- a/lib/frogger/frog.rb +++ /dev/null @@ -1,67 +0,0 @@ -class Frogger::Frog - attr_reader :scenario, :logger - attr_accessor :step_index - - def initialize(scenario, logger = default_logger) - @scenario = scenario - @logger = logger - @step_index = 0 - end - - def log_scenario - padding = max_length - 2 - scenario.name.length - logger.debug( - "\n\n #{scenario.name.upcase}#{ ' ' * padding } ".black_on_green - ) - end - - def log_step - return if step.nil? - - step_to_s = "#{step.keyword}#{step.name}" - padding = [max_length - 4 - step_to_s.length, 0].max - - logger.debug "\n #{ step_to_s }#{ ' ' * padding } ".black_on_yellow - - self.step_index += 1 - end - - def scenario_outline? - scenario.class == Cucumber::Ast::OutlineTable::ExampleRow - end - - private - - def default_logger - Rails.logger - end - - def steps - @steps ||= background_steps + - (scenario_outline? ? scenario.scenario_outline.raw_steps : scenario.raw_steps) - end - - def step - steps[step_index] - end - - def background - @background ||= begin - if scenario_outline? - scenario.scenario_outline.feature.instance_variable_get(:@background) - else - scenario.feature.instance_variable_get(:@background) - end - end - end - - def background_steps - background.nil? ? [] : background.instance_variable_get(:@raw_steps) - end - - def max_length - @max_length ||= steps.inject(scenario.name.length) { |max, step| - [max, "#{step.keyword} #{step.name}".length].max - } + 6 - end -end diff --git a/spec/frogger/frog_spec.rb b/spec/frogger/frog_spec.rb deleted file mode 100644 index 6202150..0000000 --- a/spec/frogger/frog_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' - -module Rails - def self.logger - :rails_logger - end -end - -describe Frogger::Frog do - let(:frog) { Frogger::Frog.new(scenario, custom_logger) } - let(:scenario) { double('Scenario', :raw_steps => [step], :name => 'Foo') } - let(:custom_logger) { double('Custom Logger', :debug => true) } - let(:step) { double('Step', :keyword => 'When', :name => ' something happens') } - - before :each do - scenario.stub_chain(:feature, :instance_variable_get).and_return(nil) - end - - describe '#logger' do - it "is the logger passed in when initialised" do - frog = Frogger::Frog.new(scenario, custom_logger) - frog.logger.should == custom_logger - end - - it "defaults to the Rails logger" do - frog = Frogger::Frog.new(scenario) - frog.logger.should == Rails.logger - end - end - - describe '#log_scenario' do - it "prints the scenario name in black on green" do - custom_logger.should_receive(:debug).with("\n\n FOO ".black_on_green) - frog.log_scenario - end - end - - describe '#log_step' do - it "prints the step name in black on yellow" do - custom_logger.should_receive(:debug).with("\n When something happens ".black_on_yellow) - frog.log_step - end - - it "increments the step index" do - step_index = frog.step_index - frog.log_step - frog.step_index.should == step_index + 1 - end - end - - describe '#step_index' do - it "defaults to 0" do - frog.step_index.should == 0 - end - end -end