polytrix 0.1.2 → 0.1.3

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.
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