beginrequire'v8'rescueLoadErrorgem'therubyracer','~> 0.7.1'require'v8'endrequire'cucumber/js_support/js_snippets'moduleCucumbermoduleJsSupportdefself.argument_safe_string(string)arg_string=string.to_s.gsub(/[']/,'\\\\\'')arg_string.gsub("\n",'\n')endclassJsWorlddefinitialize@world=V8::Context.newenddefexecute(js_function,args=[])js_function.call(*args)enddefmethod_missing(method_name,*args)@world.send(method_name,*args)endendclassJsStepDefinitiondefinitialize(js_language,regexp,js_function)@js_language,@regexp,@js_function=js_language,regexp.to_s,js_functionenddefinvoke(args)args=@js_language.execute_transforms(args)@js_language.current_world.execute(@js_function,args)enddefregexp_source@regexp.inspectenddefarguments_from(step_name)matches=eval_js"#{@regexp}.exec('#{step_name}')"ifmatchesmatches.to_a[1..-1].mapdo|match|JsArg.new(match)endendenddeffile_colon_line# Not possible yet to get file/line of js function with V8/therubyracer""endendclassJsHookdefinitialize(js_language,tag_expressions,js_function)@js_language,@tag_expressions,@js_function=js_language,tag_expressions,js_functionenddeftag_expressions@tag_expressionsenddefinvoke(location,scenario)@js_language.current_world.execute(@js_function)endendclassJsTransformdefinitialize(js_language,regexp,js_function)@js_language,@regexp,@js_function=js_language,regexp.to_s,js_functionenddefmatch(arg)arg=JsSupport.argument_safe_string(arg)matches=(eval_js"#{@regexp}.exec('#{arg}');").to_amatches.empty??nil:matches[1..-1]enddefinvoke(arg)@js_function.call([arg])endendclassJsArgdefinitialize(arg)@arg=argenddefval@argenddefoffsetendendclassJsLanguageincludeLanguageSupport::LanguageMethodsincludeJsSnippetsdefinitialize(runtime)@step_definitions=[]@world=JsWorld.new@runtime=runtime@world["jsLanguage"]=self@world.load(File.dirname(__FILE__)+'/js_dsl.js')enddefload_code_file(js_file)@world.load(js_file)enddefworld(js_files)js_files.eachdo|js_file|load_code_file("#{path_to_load_js_from}#{js_file}")endenddefalias_adverbs(adverbs)enddefbegin_scenario(scenario)@language=scenario.languageenddefend_scenarioenddefstep_matches(name_to_match,name_to_format)@step_definitions.mapdo|step_definition|if(arguments=step_definition.arguments_from(name_to_match))StepMatch.new(step_definition,name_to_match,name_to_format,arguments)elsenilendend.compactenddefadd_step_definition(regexp,js_function)@step_definitions<<JsStepDefinition.new(self,regexp,js_function)end#TODO: support multiline arguments when calling steps from within stepsdefexecute_step_definition(name,multiline_argument=nil)@runtime.step_match(name).invoke(multiline_argument)enddefregister_js_hook(phase,tag_expressions,js_function)add_hook(phase,JsHook.new(self,tag_expressions,js_function))enddefregister_js_transform(regexp,js_function)add_transform(JsTransform.new(self,regexp,js_function))enddefcurrent_world@worldenddefsteps(steps_text,file_colon_line)@runtime.invoke_steps(steps_text,@language,file_colon_line)endprivatedefpath_to_load_js_frompaths=@runtime.features_pathsifpaths.empty?''# Using rakeelsepath=paths[0][/(^.*\/?features)/,0]path?"#{path}/../":'../'endendendendend