polytrix 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop-todo.yml +14 -5
  3. data/Gemfile +2 -1
  4. data/README.md +139 -177
  5. data/Rakefile +5 -12
  6. data/bin/polytrix +0 -1
  7. data/features/bootstrapping.feature +0 -3
  8. data/features/cloning.feature +0 -3
  9. data/features/show.feature +38 -0
  10. data/features/states.feature +12 -13
  11. data/features/step_definitions/sdk_steps.rb +0 -4
  12. data/lib/polytrix/challenge.rb +135 -53
  13. data/lib/polytrix/challenge_result.rb +0 -2
  14. data/lib/polytrix/challenge_runner.rb +28 -18
  15. data/lib/polytrix/cli.rb +53 -69
  16. data/lib/polytrix/color.rb +2 -2
  17. data/lib/polytrix/command/action.rb +4 -3
  18. data/lib/polytrix/command/list.rb +39 -28
  19. data/lib/polytrix/command/report.rb +9 -86
  20. data/lib/polytrix/command/reports/code2doc.rb +72 -0
  21. data/lib/polytrix/command/reports/dashboard.rb +125 -0
  22. data/lib/polytrix/command/show.rb +148 -0
  23. data/lib/polytrix/command.rb +37 -104
  24. data/lib/polytrix/configuration.rb +14 -18
  25. data/lib/polytrix/{core/hashie.rb → dash.rb} +4 -3
  26. data/lib/polytrix/documentation/code_segmenter.rb +8 -8
  27. data/lib/polytrix/documentation/comment_styles.rb +1 -1
  28. data/lib/polytrix/documentation/helpers/code_helper.rb +9 -0
  29. data/lib/polytrix/documentation_generator.rb +11 -14
  30. data/lib/polytrix/error.rb +104 -97
  31. data/lib/polytrix/executor.rb +33 -0
  32. data/lib/polytrix/{runners → executors}/buff_shellout_executor.rb +1 -1
  33. data/lib/polytrix/executors/linux_challenge_executor.rb +29 -0
  34. data/lib/polytrix/executors/mixlib_shellout_executor.rb +55 -0
  35. data/lib/polytrix/{runners/windows_challenge_runner.rb → executors/windows_challenge_executor.rb} +4 -11
  36. data/lib/polytrix/{core/implementor.rb → implementor.rb} +10 -6
  37. data/lib/polytrix/manifest.rb +2 -31
  38. data/lib/polytrix/{reports → reporters}/hash_reporter.rb +6 -2
  39. data/lib/polytrix/{reports → reporters}/json_reporter.rb +2 -2
  40. data/lib/polytrix/{reports → reporters}/markdown_reporter.rb +7 -2
  41. data/lib/polytrix/{reports → reporters}/yaml_reporter.rb +2 -2
  42. data/lib/polytrix/reporters.rb +27 -0
  43. data/lib/polytrix/result.rb +6 -5
  44. data/lib/polytrix/spies/file_system_spy.rb +15 -0
  45. data/lib/polytrix/spies.rb +61 -0
  46. data/lib/polytrix/state_file.rb +1 -20
  47. data/lib/polytrix/util.rb +157 -62
  48. data/lib/polytrix/validation.rb +41 -2
  49. data/lib/polytrix/validator.rb +9 -4
  50. data/lib/polytrix/version.rb +1 -1
  51. data/lib/polytrix.rb +110 -105
  52. data/polytrix.gemspec +7 -2
  53. data/polytrix.yml +16 -13
  54. data/resources/assets/pygments/autumn.css +58 -0
  55. data/resources/assets/pygments/borland.css +46 -0
  56. data/resources/assets/pygments/bw.css +34 -0
  57. data/resources/assets/pygments/colorful.css +61 -0
  58. data/resources/assets/pygments/default.css +62 -0
  59. data/resources/assets/pygments/emacs.css +61 -0
  60. data/resources/assets/pygments/friendly.css +61 -0
  61. data/resources/assets/pygments/fruity.css +69 -0
  62. data/resources/assets/pygments/github.css +61 -0
  63. data/resources/assets/pygments/manni.css +61 -0
  64. data/resources/assets/pygments/monokai.css +64 -0
  65. data/resources/assets/pygments/murphy.css +61 -0
  66. data/resources/assets/pygments/native.css +69 -0
  67. data/resources/assets/pygments/pastie.css +60 -0
  68. data/resources/assets/pygments/perldoc.css +58 -0
  69. data/resources/assets/pygments/tango.css +69 -0
  70. data/resources/assets/pygments/trac.css +59 -0
  71. data/resources/assets/pygments/vim.css +69 -0
  72. data/resources/assets/pygments/vs.css +33 -0
  73. data/resources/assets/pygments/zenburn.css +1 -0
  74. data/resources/assets/style.css +41 -0
  75. data/resources/templates/dashboard/files/dashboard.html.tt +82 -0
  76. data/resources/templates/dashboard/templates/_test_report.html.tt +87 -0
  77. data/samples/bootstrap.sh +2 -0
  78. data/samples/clone.sh +2 -0
  79. data/samples/code2doc.sh +4 -0
  80. data/samples/docs/samples/code2doc/java/katas-hello_world-java.md +17 -0
  81. data/samples/docs/samples/code2doc/java/katas-quine-java.md +35 -0
  82. data/samples/docs/samples/code2doc/python/katas-hello_world-python.md +5 -0
  83. data/samples/docs/samples/code2doc/python/katas-quine-python.md +6 -0
  84. data/samples/docs/samples/code2doc/ruby/katas-hello_world-ruby.md +11 -0
  85. data/samples/exec.sh +2 -0
  86. data/samples/polytrix.rb +2 -2
  87. data/samples/polytrix.yml +5 -2
  88. data/samples/show.sh +4 -0
  89. data/samples/test.sh +2 -0
  90. data/samples/tests/polytrix/validators.rb +2 -2
  91. data/samples/verify.sh +3 -0
  92. data/scripts/wrapper +4 -7
  93. data/spec/fabricators/challenge_fabricator.rb +2 -9
  94. data/spec/fabricators/implementor_fabricator.rb +0 -8
  95. data/spec/fabricators/manifest_fabricator.rb +2 -9
  96. data/spec/fabricators/validator_fabricator.rb +2 -4
  97. data/spec/polytrix/challenge_runner_spec.rb +20 -0
  98. data/spec/polytrix/documentation/helpers/code_helper_spec.rb +7 -7
  99. data/spec/polytrix/file_finder_spec.rb +5 -5
  100. data/spec/polytrix/manifest_spec.rb +0 -21
  101. data/spec/polytrix/result_spec.rb +14 -14
  102. data/spec/polytrix/validator_registry_spec.rb +4 -4
  103. data/spec/polytrix/validator_spec.rb +9 -9
  104. data/spec/polytrix_spec.rb +1 -25
  105. data/spec/spec_helper.rb +8 -1
  106. metadata +130 -38
  107. data/features/execution.feature +0 -53
  108. data/features/fixtures/spec/polytrix_spec.rb +0 -7
  109. data/lib/polytrix/cli/report.rb +0 -84
  110. data/lib/polytrix/command/rundoc.rb +0 -27
  111. data/lib/polytrix/core/file_system_helper.rb +0 -75
  112. data/lib/polytrix/core/manifest_section.rb +0 -4
  113. data/lib/polytrix/core/string_helpers.rb +0 -15
  114. data/lib/polytrix/documentation/view_helper.rb +0 -21
  115. data/lib/polytrix/rspec/documentation_formatter.rb +0 -66
  116. data/lib/polytrix/rspec/yaml_report.rb +0 -51
  117. data/lib/polytrix/rspec.rb +0 -56
  118. data/lib/polytrix/runners/executor.rb +0 -34
  119. data/lib/polytrix/runners/linux_challenge_runner.rb +0 -23
  120. data/lib/polytrix/runners/middleware/change_directory.rb +0 -20
  121. data/lib/polytrix/runners/middleware/feature_executor.rb +0 -24
  122. data/lib/polytrix/runners/middleware/setup_env_vars.rb +0 -42
  123. data/lib/polytrix/runners/mixlib_shellout_executor.rb +0 -83
  124. data/lib/polytrix/validations.rb +0 -23
  125. data/samples/scripts/wrapper +0 -7
  126. data/spec/polytrix/middleware/feature_executor_spec.rb +0 -48
  127. data/spec/polytrix/validations_spec.rb +0 -16
@@ -1,21 +0,0 @@
1
- module Polytrix
2
- module Documentation
3
- module ViewHelper
4
- def polytrix_toc
5
- buffer = StringIO.new
6
- buffer.puts '<ul>'
7
- Polytrix.manifest.suites.each do |suite_name, suite|
8
- buffer.puts "<li>#{suite_name}</li>"
9
- buffer.puts '<ul>'
10
- suite.samples.each do |challenge_name|
11
- buffer.puts "<li>#{challenge_name}</li>"
12
- end
13
- buffer.puts '</ul>'
14
- end
15
- buffer.puts '</ul>'
16
-
17
- buffer.string
18
- end
19
- end
20
- end
21
- end
@@ -1,66 +0,0 @@
1
- require 'polytrix/rspec'
2
- require 'hashie/mash'
3
- require 'yaml'
4
- require 'fileutils'
5
-
6
- module Polytrix
7
- module RSpec
8
- class DocumentationFormatter < ::RSpec::Core::Formatters::BaseFormatter
9
- include Polytrix::Core::FileSystemHelper
10
-
11
- def initialize(output)
12
- @templates_dir = 'doc-src'
13
- @output_dir = 'docs'
14
- @results = Hashie::Mash.new
15
- @summary_files = %w(index)
16
- super
17
- end
18
-
19
- def example_group_finished(example_group)
20
- polytrix_challenges = example_group.examples.map { |e| e.metadata[:polytrix_challenge] }
21
- target_file = target_file_for example_group
22
- template_file = template_for example_group
23
- produce_doc template_file, target_file, example_group.description, polytrix_challenges if template_file
24
- end
25
-
26
- def dump_summary(duration, example_count, failure_count, pending_count)
27
- all_challenges = examples.map { |e| e.metadata[:polytrix_challenge] }
28
- grouped_challenges = all_challenges.compact.group_by(&:name)
29
- @summary_files.each do |summary_file|
30
- template_file = template_for summary_file, use_default: false
31
- next if template_file.nil?
32
- target_file = target_file_for_summary(template_file)
33
- produce_doc template_file, target_file, 'Summary', grouped_challenges
34
- end
35
- end
36
-
37
- private
38
-
39
- def template_for(name, opts = { use_default: true })
40
- name = name.description if name.respond_to? :description
41
- begin
42
- find_file @templates_dir, name, ''
43
- rescue Polytrix::Core::FileSystemHelper::FileNotFound
44
- Polytrix.configuration.default_doc_template if opts[:use_default] == true
45
- end
46
- end
47
-
48
- def target_file_for(example_group)
49
- names = [@output_dir].concat(example_group.parent_groups.reverse.map(&:description))
50
- # Markdown format by default, but will be overridden to match the template
51
- slugify(names.join File::SEPARATOR) + '.md'
52
- end
53
-
54
- def target_file_for_summary(template_file)
55
- name = File.basename(template_file)
56
- slugify("docs/#{name}")
57
- end
58
-
59
- def produce_doc(template_file, target_file, scenario, data)
60
- doc_gen = Polytrix::DocumentationGenerator.new template_file, scenario
61
- doc_gen.process data
62
- doc_gen.save target_file
63
- end
64
- end
65
- end
66
- end
@@ -1,51 +0,0 @@
1
- require 'polytrix/rspec'
2
- require 'hashie/mash'
3
- require 'yaml'
4
- require 'fileutils'
5
-
6
- module Polytrix
7
- module RSpec
8
- class YAMLReport < ::RSpec::Core::Formatters::BaseFormatter
9
- def example_passed(example)
10
- add_implementation_result example, :passed
11
- end
12
-
13
- def example_failed(example)
14
- add_implementation_result example, :failed
15
- end
16
-
17
- def example_pending(example)
18
- add_implementation_result example, :pending
19
- end
20
-
21
- def dump_summary(duration, example_count, failure_count, pending_count)
22
- results = Hashie::Mash.new(Polytrix.manifest.dup.to_hash)
23
- all_challenges = examples.map { |e| e.metadata[:polytrix_challenge] }
24
- grouped_challenges = all_challenges.compact.group_by(&:name)
25
- results.suites.each do |suite_name, suite|
26
- suite.samples = suite.samples.each_with_object({}) do |sample_name, sample_results|
27
- sample_results[sample_name] ||= {}
28
- if grouped_challenges[sample_name]
29
- challenge_results = grouped_challenges[sample_name]
30
- challenge_results.each do |challenge|
31
- sample_results[sample_name][challenge.implementor.name] = challenge.result
32
- end
33
- end
34
- end
35
- end
36
- @output.puts YAML.dump(results.to_hash)
37
- end
38
-
39
- private
40
-
41
- def add_implementation_result(example, state)
42
- validation = Validation.new(
43
- validated_by: 'polytrix',
44
- result: state.to_s
45
- )
46
- challenge = example.metadata[:polytrix_challenge]
47
- challenge.result.validations << validation unless challenge.nil? || challenge.result.nil?
48
- end
49
- end
50
- end
51
- end
@@ -1,56 +0,0 @@
1
- require 'polytrix'
2
- begin
3
- require 'rspec/core'
4
- require 'rspec/expectations'
5
- require 'rspec/core/formatters/base_text_formatter'
6
- rescue LoadError
7
- raise 'polytrix/rspec requires rspec 2 or later'
8
- end
9
-
10
- module Polytrix
11
- module RSpec
12
- class << self
13
- def shared_examples(caller) # rubocop:disable MethodLength
14
- # FIXME: Long method because it's hard to eval in the right context
15
- caller.instance_eval do
16
- Polytrix.manifest.suites.each do |suite_name, suite_config|
17
- describe suite_name do
18
- samples = suite_config.samples || []
19
- samples.each do |scenario|
20
- describe scenario.name do
21
- Polytrix.implementors.each do |sdk|
22
- it sdk.name, sdk.name.to_sym => true do | example |
23
- begin
24
- skip "#{sdk.name} is not setup" unless File.directory? sdk.basedir
25
- slug = Polytrix::Challenge.slugify(suite_name, scenario.name, sdk.name)
26
- challenge = Polytrix.manifest.challenges[slug]
27
- # sdk.build_challenge suite: suite_name, name: scenario, vars: suite_config.env
28
- example.metadata[:polytrix_challenge] = challenge
29
- challenge.exec
30
- validators = Polytrix::ValidatorRegistry.validators_for challenge
31
- validators.each do |validator|
32
- instance_exec challenge, &validator.callback
33
- end
34
- rescue Polytrix::FeatureNotImplementedError => e
35
- skip e.message
36
- rescue ThreadError => e
37
- # Extra debug info for ThreadError
38
- $stderr.puts "ThreadError detected: #{e.message}"
39
- $stderr.puts "ThreadError backtrace: #{e.backtrace}"
40
- fail e
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
50
-
51
- def run_manifest(manifest)
52
- shared_examples(self)
53
- end
54
- end
55
- end
56
- end
@@ -1,34 +0,0 @@
1
- require 'hashie/dash'
2
- require 'thor'
3
- require 'polytrix/core/manifest_section'
4
-
5
- module Polytrix
6
- module Runners
7
- autoload :BuffShellOutExecutor, 'polytrix/runners/buff_shellout_executor'
8
- autoload :MixlibShellOutExecutor, 'polytrix/runners/mixlib_shellout_executor'
9
-
10
- class ExecutionResult < Polytrix::ManifestSection
11
- property :exitstatus, require: true
12
- property :stdout, required: true
13
- property :stderr, required: true
14
- end
15
-
16
- module Executor
17
- attr_writer :executor
18
- attr_accessor :env
19
-
20
- def executor
21
- @executor ||= if RUBY_PLATFORM == 'java'
22
- Polytrix::Runners::BuffShellOutExecutor.new
23
- else
24
- Polytrix::Runners::MixlibShellOutExecutor.new
25
- end
26
- end
27
-
28
- def execute(command, opts = {})
29
- opts[:env] = env unless env.nil?
30
- executor.execute(command, opts)
31
- end
32
- end
33
- end
34
- end
@@ -1,23 +0,0 @@
1
- module Polytrix
2
- module Runners
3
- class LinuxChallengeRunner < ChallengeRunner
4
- def script_extension
5
- 'sh'
6
- end
7
-
8
- def challenge_command(env_file, challenge_script)
9
- challenge_script = "./#{challenge_script}" unless challenge_script.to_s.start_with? '/'
10
- if File.exist? 'scripts/wrapper'
11
- # ". #{env_file} && scripts/wrapper #{challenge_script}"
12
- "scripts/wrapper #{challenge_script}"
13
- else
14
- "#{challenge_script}"
15
- end
16
- end
17
-
18
- def save_environment_variable(key, value)
19
- "export #{key}=\"#{value}\""
20
- end
21
- end
22
- end
23
- end
@@ -1,20 +0,0 @@
1
- module Polytrix
2
- module Runners
3
- module Middleware
4
- class ChangeDirectory
5
- def initialize(app)
6
- @app = app
7
- end
8
-
9
- def call(env)
10
- sdk_dir = env[:basedir]
11
- Bundler.with_clean_env do
12
- Dir.chdir sdk_dir do
13
- @app.call env
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,24 +0,0 @@
1
- module Polytrix
2
- module Runners
3
- module Middleware
4
- class FeatureExecutor
5
- include Polytrix::Core::FileSystemHelper
6
- def initialize(app)
7
- @app = app
8
- end
9
-
10
- def call(env)
11
- challenge_runner = env[:challenge_runner]
12
- env_file = env[:env_file]
13
- source_file = env[:source_file]
14
- relative_source_file = relativize(source_file, env[:basedir])
15
- command = challenge_runner.challenge_command(env_file, relative_source_file)
16
- execution_result = challenge_runner.run_command command
17
- env[:result] = Result.new(execution_result: execution_result, source_file: env[:source_file].to_s)
18
- @app.call env
19
- env[:result]
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,42 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Polytrix
4
- module Runners
5
- module Middleware
6
- class SetupEnvVars
7
- include Polytrix::Core::FileSystemHelper
8
-
9
- def initialize(app)
10
- @app = app
11
- end
12
-
13
- def call(env)
14
- vars = begin
15
- Polytrix.manifest[:global_env].dup
16
- rescue
17
- {}
18
- end
19
- vars = vars.merge env[:vars].dup
20
-
21
- setup_env_vars(env[:name], vars, env[:challenge_runner])
22
- # env[:env_file] = setup_env_vars(env[:name], vars, env[:challenge_runner])
23
- @app.call env
24
- end
25
-
26
- private
27
-
28
- def setup_env_vars(challenge_name, vars, challenge_runner)
29
- challenge_runner.env = vars.to_hash
30
- # FileUtils.mkdir_p 'tmp'
31
- # extension = challenge_runner.script_extension
32
- # file = File.open(slugify("tmp/#{challenge_name}_vars.#{extension}"), 'w')
33
- # vars.each do |key, value|
34
- # file.puts challenge_runner.save_environment_variable(key, value)
35
- # end
36
- # file.close
37
- # file.path
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,83 +0,0 @@
1
- require 'mixlib/shellout'
2
-
3
- module Polytrix
4
- module Runners
5
- class IOToLog < IO
6
- def initialize(logger)
7
- @logger = logger
8
- @buffer = ''
9
- end
10
-
11
- def write(string)
12
- (@buffer + string).lines.each do |line|
13
- if line.end_with? "\n"
14
- @buffer = ''
15
- @logger.info(line.rstrip)
16
- else
17
- @buffer = line
18
- end
19
- end
20
- end
21
- end
22
-
23
- class MixlibShellOutExecutor
24
- include Polytrix::DefaultLogger
25
-
26
- def log_decorator(io, prefix)
27
- # OutputDecorator.new(io, prefix) unless Polytrix.configuration.suppress_output
28
- # logger = Logging.logger['polytrix::exec']
29
- IOToLog.new(logger)
30
- end
31
-
32
- def execute(command, opts)
33
- prefix = opts.delete :prefix
34
- shell = Mixlib::ShellOut.new(command, opts)
35
- shell.live_stream = log_decorator $stdout, prefix
36
- shell.run_command
37
- execution_result = ExecutionResult.new exitstatus: shell.exitstatus, stdout: shell.stdout, stderr: shell.stderr
38
- begin
39
- shell.error!
40
- rescue Mixlib::ShellOut::ShellCommandFailed => e
41
- execution_error = ExecutionError.new(e)
42
- execution_error.execution_result = execution_result
43
- raise execution_error
44
- end
45
-
46
- execution_result
47
- end
48
-
49
- class OutputDecorator
50
- # Reserve :red, :black, :white
51
- COLORS = [:green, :yellow, :blue, :magenta, :cyan]
52
-
53
- def self.next_color
54
- @next_color ||= 0
55
- @next_color += 1
56
- COLORS[@next_color % COLORS.size]
57
- end
58
-
59
- def initialize(real_io, prefix = nil)
60
- @real_io = real_io
61
- # @prefix = set_color(prefix, :cyan)
62
- @prefix = "#{prefix}: " if prefix
63
- @color = self.class.next_color
64
- @thor_shell = Thor::Shell::Color.new
65
- end
66
-
67
- def puts(line)
68
- line = line.gsub(/^/, @prefix) if @prefix
69
- @real_io.puts @thor_shell.set_color(line, @color)
70
- end
71
-
72
- def <<(line)
73
- line = line.gsub(/^/, @prefix) if @prefix
74
- @real_io << @thor_shell.set_color(line, @color)
75
- end
76
-
77
- def method_missing(meth, *args, &block)
78
- @real_io.send meth, *args, &block
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,23 +0,0 @@
1
- require 'hashie/dash'
2
-
3
- module Polytrix
4
- class Validations < Set
5
- def to_hash
6
- map do |v|
7
- v.to_hash
8
- end
9
- end
10
-
11
- def to_yaml
12
- to_hash.to_yaml
13
- end
14
-
15
- # Hashie Coercion - automatically treat all values as Validation
16
- def self.coerce(obj)
17
- data = obj.map do |value|
18
- Validation.new(value)
19
- end
20
- new data
21
- end
22
- end
23
- end
@@ -1,7 +0,0 @@
1
- #!/bin/bash
2
- if [[ "$1" == *.rb ]]
3
- then
4
- bundle exec ruby "$@"
5
- else
6
- bundle exec "$@"
7
- fi
@@ -1,48 +0,0 @@
1
- module Polytrix
2
- module Runners
3
- module Middleware
4
- describe FeatureExecutor do
5
- let(:app) { double('Middleware Chain') }
6
- let(:challenge_runner) { double('ChallengeRunner') }
7
- subject(:middleware) { described_class.new app }
8
-
9
- describe '#call' do
10
- let(:env) do
11
- {
12
- basedir: Pathname.new('spec/fixtures'),
13
- env_file: 'tmp/vars.sh',
14
- source_file: Pathname.new('spec/fixtures/test.js'),
15
- command: 'some command to execute',
16
- challenge_runner: challenge_runner
17
- }
18
- end
19
-
20
- before do
21
- allow(challenge_runner).to receive(:challenge_command).with(env[:env_file], Pathname.new('test.js')).and_return('some command to execute')
22
- allow(challenge_runner).to receive(:run_command).with('some command to execute').and_return Polytrix::Result.new(execution_result: 'a', source_file: 'b')
23
- allow(app).to receive(:call).with(env)
24
- end
25
-
26
- # Most of this belongs in the ChallengeRunner...
27
- xit 'finds the challenge' do
28
- end
29
-
30
- xit 'setups the env vars' do
31
- end
32
-
33
- xit 'gets the command' do
34
- end
35
-
36
- it 'returns a result' do
37
- expect(middleware.call(env)).to be_an_instance_of Polytrix::Result
38
- end
39
-
40
- it 'continues the middleware chain' do
41
- expect(app).to receive(:call).with env
42
- middleware.call(env)
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Polytrix
4
- describe Validations do
5
- describe '#coerce' do
6
- it 'accepts an array when built via Result' do
7
- Polytrix::Result.new(
8
- validations: [
9
- { validated_by: 'max', result: 'passed' },
10
- { validated_by: 'polytrix', result: 'skipped' }
11
- ]
12
- )
13
- end
14
- end
15
- end
16
- end