diff --git a/.travis.yml b/.travis.yml index ac98ab8..32b25aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,6 @@ rvm: - 2.4.0 - 2.3.3 - 2.2 - - 2.1 - - 2.0 matrix: allow_failures: diff --git a/CHANGELOG.md b/CHANGELOG.md index ddade81..e3b5343 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ Please visit [cucumber/CONTRIBUTING.md](https://github.com/cucumber/cucumber/blo ---- -## [Unreleased] - In Git +## [In Git (targeting 1.0.0)](https://github.com/cucumber/cucumber-ruby-wire/compare/v0.0.1...master) ### Removed @@ -20,11 +20,15 @@ Please visit [cucumber/CONTRIBUTING.md](https://github.com/cucumber/cucumber/blo ### Changed +* Changes to work with a modern Cucumber-Ruby ([#14](https://github.com/cucumber/cucumber-ruby-wire/pull/14) [brasmusson](https://github.com/brasmusson)) +* Adapt to the move of Location to Cucumber::Core::Test ([#14](https://github.com/cucumber/cucumber-ruby-wire/pull/14) [brasmusson](https://github.com/brasmusson)) + ### Fixed +[brasmusson]: https://github.com/brasmusson [jaysonesmith]: https://github.com/jaysonesmith [junaruga]: https://github.com/junaruga [mattwynne]: https://github.com/mattwynne diff --git a/cucumber-wire.gemspec b/cucumber-wire.gemspec index 4e9b982..721a8bc 100644 --- a/cucumber-wire.gemspec +++ b/cucumber-wire.gemspec @@ -11,9 +11,12 @@ Gem::Specification.new do |s| s.homepage = "http://cucumber.io" s.platform = Gem::Platform::RUBY s.license = "MIT" - s.required_ruby_version = ">= 1.9.3" + s.required_ruby_version = ">= 2.2" - s.add_development_dependency 'cucumber', '~> 2.1.0' + s.add_dependency 'cucumber-core', '~> 3.2' + s.add_dependency 'cucumber-expressions', '~> 6.0' + + s.add_development_dependency 'cucumber', '~> 3.1' s.add_development_dependency 'bundler', '>= 1.3.5' s.add_development_dependency 'rake', '>= 0.9.2' diff --git a/features/invoke_message.feature b/features/invoke_message.feature index ad9c26d..bb63ae7 100644 --- a/features/invoke_message.feature +++ b/features/invoke_message.feature @@ -47,8 +47,6 @@ Feature: Invoke message Scenario: Wired Given we're all wired - I'll do it later (Cucumber::Pending) - features/wired.feature:3:in `Given we're all wired' 1 scenario (1 pending) 1 step (1 pending) @@ -102,7 +100,7 @@ Feature: Invoke message (::) failed steps (::) The wires are down (Some.Foreign.ExceptionType from localhost:54321) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 # Scenario: Wired diff --git a/features/step_matches_message.feature b/features/step_matches_message.feature index b0051f8..afa70be 100644 --- a/features/step_matches_message.feature +++ b/features/step_matches_message.feature @@ -70,7 +70,7 @@ Feature: Step matches message """ - - we.* # MyApp.MyClass:123 + "we.*" # MyApp.MyClass:123 1 scenario (1 skipped) 1 step (1 skipped) diff --git a/features/table_diffing.feature b/features/table_diffing.feature index 63d7b21..87278a5 100644 --- a/features/table_diffing.feature +++ b/features/table_diffing.feature @@ -39,7 +39,7 @@ Feature: Wire protocol table diffing Not same (DifferentException from localhost:54321) a.cs:12 b.cs:34 - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 @@ -84,7 +84,7 @@ Feature: Wire protocol table diffing (::) failed steps (::) I wanted things to be different for us (Cucumber::Wire::Exception) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 @@ -113,7 +113,7 @@ Feature: Wire protocol table diffing | (-) a | (+) b | (Cucumber::MultilineArgument::DataTable::Different) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 diff --git a/features/timeouts.feature b/features/timeouts.feature index f05fcd5..42ffbff 100644 --- a/features/timeouts.feature +++ b/features/timeouts.feature @@ -52,7 +52,7 @@ Feature: Wire protocol timeouts Scenario: Wired Given we're all wired Timed out calling wire server with message 'invoke' (Timeout::Error) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 diff --git a/lib/cucumber/wire/add_hooks_filter.rb b/lib/cucumber/wire/add_hooks_filter.rb index 0573ec1..b1c2538 100644 --- a/lib/cucumber/wire/add_hooks_filter.rb +++ b/lib/cucumber/wire/add_hooks_filter.rb @@ -1,3 +1,4 @@ +# coding: utf-8 module Cucumber module Wire class AddHooksFilter < Core::Filter.new(:connections) @@ -10,13 +11,13 @@ def test_case(test_case) def before_hook(test_case) # TODO: is this dependency on Cucumber::Hooks OK? Feels a bit internal.. # TODO: how do we express the location of the hook? Should we create one hook per connection so we can use the host:port of the connection? - Cucumber::Hooks.before_hook(test_case.source, Core::Ast::Location.new('TODO:wire')) do + Cucumber::Hooks.before_hook(Core::Test::Location.new('TODO:wire')) do connections.begin_scenario(test_case) end end def after_hook(test_case) - Cucumber::Hooks.after_hook(test_case.source, Core::Ast::Location.new('TODO:wire')) do + Cucumber::Hooks.after_hook(Core::Test::Location.new('TODO:wire')) do connections.end_scenario(test_case) end end diff --git a/lib/cucumber/wire/connections.rb b/lib/cucumber/wire/connections.rb index 7856fea..4e57a22 100644 --- a/lib/cucumber/wire/connections.rb +++ b/lib/cucumber/wire/connections.rb @@ -16,10 +16,11 @@ class Connections attr_reader :connections private :connections - def initialize(connections, configuration) + def initialize(connections, configuration, registry) raise ArgumentError unless connections @connections = connections @configuration = configuration + @registry = registry end def find_match(test_step) @@ -30,7 +31,7 @@ def find_match(test_step) end def step_matches(step_name) - connections.map{ |c| c.step_matches(step_name)}.flatten + connections.map{ |c| c.step_matches(step_name, @registry)}.flatten end def begin_scenario(test_case) diff --git a/lib/cucumber/wire/plugin.rb b/lib/cucumber/wire/plugin.rb index d1d6277..79843cd 100644 --- a/lib/cucumber/wire/plugin.rb +++ b/lib/cucumber/wire/plugin.rb @@ -5,15 +5,16 @@ module Cucumber module Wire class Plugin - attr_reader :config - private :config + attr_reader :config, :registry + private :config, :registry - def initialize(config) + def initialize(config, registry) @config = config + @registry = registry end def install - connections = Connections.new(wire_files.map { |f| create_connection(f) }, @config) + connections = Connections.new(wire_files.map { |f| create_connection(f) }, config, registry) config.filters << Filters::ActivateSteps.new(StepMatchSearch.new(connections.method(:step_matches), @config), @config) config.filters << AddHooksFilter.new(connections) unless @config.dry_run? config.register_snippet_generator Snippet::Generator.new(connections) diff --git a/lib/cucumber/wire/protocol.rb b/lib/cucumber/wire/protocol.rb index 328c728..738577e 100644 --- a/lib/cucumber/wire/protocol.rb +++ b/lib/cucumber/wire/protocol.rb @@ -3,8 +3,8 @@ module Cucumber module Wire module Protocol - def step_matches(name_to_match) - handler = Requests::StepMatches.new(self) + def step_matches(name_to_match, registry) + handler = Requests::StepMatches.new(self, registry) handler.execute(name_to_match) end diff --git a/lib/cucumber/wire/protocol/requests.rb b/lib/cucumber/wire/protocol/requests.rb index 0e38494..5e32d11 100644 --- a/lib/cucumber/wire/protocol/requests.rb +++ b/lib/cucumber/wire/protocol/requests.rb @@ -1,5 +1,6 @@ +# coding: utf-8 require 'cucumber/wire/request_handler' -require 'cucumber/step_argument' +require 'cucumber/wire/step_argument' module Cucumber module Wire @@ -25,7 +26,7 @@ def handle_success(params) private def create_step_match(raw_step_match) - step_definition = StepDefinition.new(@connection, raw_step_match) + step_definition = StepDefinition.new(@connection, raw_step_match, @registry) step_args = raw_step_match['args'].map do |raw_arg| StepArgument.new(raw_arg['pos'], raw_arg['val']) end @@ -69,7 +70,7 @@ def handle_pending(message) def handle_diff!(tables) # TODO: figure out if / how we could get a location for a table from the wire (or make a null location) - location = Core::Ast::Location.new(__FILE__, __LINE__) + location = Core::Test::Location.new(__FILE__, __LINE__) table1 = table(tables[0], location) table2 = table(tables[1], location) table1.diff!(table2) @@ -89,7 +90,7 @@ def handle_diff(tables) private def table(data, location) - Cucumber::MultilineArgument.from_core(Core::Ast::DataTable.new(data, location)) + Cucumber::MultilineArgument.from_core(Core::Test::DataTable.new(data, location)) end end diff --git a/lib/cucumber/wire/request_handler.rb b/lib/cucumber/wire/request_handler.rb index ee8f2f1..118f9cd 100644 --- a/lib/cucumber/wire/request_handler.rb +++ b/lib/cucumber/wire/request_handler.rb @@ -1,9 +1,10 @@ module Cucumber module Wire class RequestHandler - def initialize(connection) + def initialize(connection, registry = nil) @connection = connection @message = underscore(self.class.name.split('::').last) + @registry = registry end def execute(request_params = nil) diff --git a/lib/cucumber/wire/step_argument.rb b/lib/cucumber/wire/step_argument.rb new file mode 100644 index 0000000..116ee3a --- /dev/null +++ b/lib/cucumber/wire/step_argument.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +require 'cucumber/cucumber_expressions/group' + +module Cucumber + module Wire + # Defines the location and value of a captured argument from the step + # text + class StepArgument + attr_reader :offset + + def initialize(offset, val) + @offset, @value = offset, val + end + + def value(_current_world) + @value + end + + def group + CucumberExpressions::Group.new(@value, @offset, @offset + @value.length, []) + end + end + end +end diff --git a/lib/cucumber/wire/step_definition.rb b/lib/cucumber/wire/step_definition.rb index 6f3b41a..b453cdc 100644 --- a/lib/cucumber/wire/step_definition.rb +++ b/lib/cucumber/wire/step_definition.rb @@ -1,15 +1,17 @@ -require 'cucumber/core/ast/location' +require 'cucumber/core/test/location' module Cucumber module Wire class StepDefinition - attr_reader :regexp_source, :location + attr_reader :regexp_source, :location, :registry, :expression - def initialize(connection, data) + def initialize(connection, data, registry) @connection = connection + @registry = registry @id = data['id'] @regexp_source = data['regexp'] || "Unknown" - @location = Core::Ast::Location.from_file_colon_line(data['source'] || "unknown:0") + @expression = registry.create_expression(@regexp_source) + @location = Core::Test::Location.from_file_colon_line(data['source'] || "unknown:0") end def invoke(args) diff --git a/spec/cucumber/wire/connections_spec.rb b/spec/cucumber/wire/connections_spec.rb index 449e19f..62c9f1a 100644 --- a/spec/cucumber/wire/connections_spec.rb +++ b/spec/cucumber/wire/connections_spec.rb @@ -9,12 +9,12 @@ module Wire connection1 = double(step_matches: [:a, :b]) connection2 = double(step_matches: [:c]) - connections = Connections.new([connection1, connection2], double) + connections = Connections.new([connection1, connection2], double, double) expect(connections.step_matches('')).to eq [:a, :b, :c] end it "copes with no connections" do - connections = Connections.new([], double) + connections = Connections.new([], double, double) expect(connections.step_matches('')).to eq [] end end