polytrix 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop-todo.yml +14 -5
- data/Gemfile +2 -1
- data/README.md +139 -177
- data/Rakefile +5 -12
- data/bin/polytrix +0 -1
- data/features/bootstrapping.feature +0 -3
- data/features/cloning.feature +0 -3
- data/features/show.feature +38 -0
- data/features/states.feature +12 -13
- data/features/step_definitions/sdk_steps.rb +0 -4
- data/lib/polytrix/challenge.rb +135 -53
- data/lib/polytrix/challenge_result.rb +0 -2
- data/lib/polytrix/challenge_runner.rb +28 -18
- data/lib/polytrix/cli.rb +53 -69
- data/lib/polytrix/color.rb +2 -2
- data/lib/polytrix/command/action.rb +4 -3
- data/lib/polytrix/command/list.rb +39 -28
- data/lib/polytrix/command/report.rb +9 -86
- data/lib/polytrix/command/reports/code2doc.rb +72 -0
- data/lib/polytrix/command/reports/dashboard.rb +125 -0
- data/lib/polytrix/command/show.rb +148 -0
- data/lib/polytrix/command.rb +37 -104
- data/lib/polytrix/configuration.rb +14 -18
- data/lib/polytrix/{core/hashie.rb → dash.rb} +4 -3
- data/lib/polytrix/documentation/code_segmenter.rb +8 -8
- data/lib/polytrix/documentation/comment_styles.rb +1 -1
- data/lib/polytrix/documentation/helpers/code_helper.rb +9 -0
- data/lib/polytrix/documentation_generator.rb +11 -14
- data/lib/polytrix/error.rb +104 -97
- data/lib/polytrix/executor.rb +33 -0
- data/lib/polytrix/{runners → executors}/buff_shellout_executor.rb +1 -1
- data/lib/polytrix/executors/linux_challenge_executor.rb +29 -0
- data/lib/polytrix/executors/mixlib_shellout_executor.rb +55 -0
- data/lib/polytrix/{runners/windows_challenge_runner.rb → executors/windows_challenge_executor.rb} +4 -11
- data/lib/polytrix/{core/implementor.rb → implementor.rb} +10 -6
- data/lib/polytrix/manifest.rb +2 -31
- data/lib/polytrix/{reports → reporters}/hash_reporter.rb +6 -2
- data/lib/polytrix/{reports → reporters}/json_reporter.rb +2 -2
- data/lib/polytrix/{reports → reporters}/markdown_reporter.rb +7 -2
- data/lib/polytrix/{reports → reporters}/yaml_reporter.rb +2 -2
- data/lib/polytrix/reporters.rb +27 -0
- data/lib/polytrix/result.rb +6 -5
- data/lib/polytrix/spies/file_system_spy.rb +15 -0
- data/lib/polytrix/spies.rb +61 -0
- data/lib/polytrix/state_file.rb +1 -20
- data/lib/polytrix/util.rb +157 -62
- data/lib/polytrix/validation.rb +41 -2
- data/lib/polytrix/validator.rb +9 -4
- data/lib/polytrix/version.rb +1 -1
- data/lib/polytrix.rb +110 -105
- data/polytrix.gemspec +7 -2
- data/polytrix.yml +16 -13
- data/resources/assets/pygments/autumn.css +58 -0
- data/resources/assets/pygments/borland.css +46 -0
- data/resources/assets/pygments/bw.css +34 -0
- data/resources/assets/pygments/colorful.css +61 -0
- data/resources/assets/pygments/default.css +62 -0
- data/resources/assets/pygments/emacs.css +61 -0
- data/resources/assets/pygments/friendly.css +61 -0
- data/resources/assets/pygments/fruity.css +69 -0
- data/resources/assets/pygments/github.css +61 -0
- data/resources/assets/pygments/manni.css +61 -0
- data/resources/assets/pygments/monokai.css +64 -0
- data/resources/assets/pygments/murphy.css +61 -0
- data/resources/assets/pygments/native.css +69 -0
- data/resources/assets/pygments/pastie.css +60 -0
- data/resources/assets/pygments/perldoc.css +58 -0
- data/resources/assets/pygments/tango.css +69 -0
- data/resources/assets/pygments/trac.css +59 -0
- data/resources/assets/pygments/vim.css +69 -0
- data/resources/assets/pygments/vs.css +33 -0
- data/resources/assets/pygments/zenburn.css +1 -0
- data/resources/assets/style.css +41 -0
- data/resources/templates/dashboard/files/dashboard.html.tt +82 -0
- data/resources/templates/dashboard/templates/_test_report.html.tt +87 -0
- data/samples/bootstrap.sh +2 -0
- data/samples/clone.sh +2 -0
- data/samples/code2doc.sh +4 -0
- data/samples/docs/samples/code2doc/java/katas-hello_world-java.md +17 -0
- data/samples/docs/samples/code2doc/java/katas-quine-java.md +35 -0
- data/samples/docs/samples/code2doc/python/katas-hello_world-python.md +5 -0
- data/samples/docs/samples/code2doc/python/katas-quine-python.md +6 -0
- data/samples/docs/samples/code2doc/ruby/katas-hello_world-ruby.md +11 -0
- data/samples/exec.sh +2 -0
- data/samples/polytrix.rb +2 -2
- data/samples/polytrix.yml +5 -2
- data/samples/show.sh +4 -0
- data/samples/test.sh +2 -0
- data/samples/tests/polytrix/validators.rb +2 -2
- data/samples/verify.sh +3 -0
- data/scripts/wrapper +4 -7
- data/spec/fabricators/challenge_fabricator.rb +2 -9
- data/spec/fabricators/implementor_fabricator.rb +0 -8
- data/spec/fabricators/manifest_fabricator.rb +2 -9
- data/spec/fabricators/validator_fabricator.rb +2 -4
- data/spec/polytrix/challenge_runner_spec.rb +20 -0
- data/spec/polytrix/documentation/helpers/code_helper_spec.rb +7 -7
- data/spec/polytrix/file_finder_spec.rb +5 -5
- data/spec/polytrix/manifest_spec.rb +0 -21
- data/spec/polytrix/result_spec.rb +14 -14
- data/spec/polytrix/validator_registry_spec.rb +4 -4
- data/spec/polytrix/validator_spec.rb +9 -9
- data/spec/polytrix_spec.rb +1 -25
- data/spec/spec_helper.rb +8 -1
- metadata +130 -38
- data/features/execution.feature +0 -53
- data/features/fixtures/spec/polytrix_spec.rb +0 -7
- data/lib/polytrix/cli/report.rb +0 -84
- data/lib/polytrix/command/rundoc.rb +0 -27
- data/lib/polytrix/core/file_system_helper.rb +0 -75
- data/lib/polytrix/core/manifest_section.rb +0 -4
- data/lib/polytrix/core/string_helpers.rb +0 -15
- data/lib/polytrix/documentation/view_helper.rb +0 -21
- data/lib/polytrix/rspec/documentation_formatter.rb +0 -66
- data/lib/polytrix/rspec/yaml_report.rb +0 -51
- data/lib/polytrix/rspec.rb +0 -56
- data/lib/polytrix/runners/executor.rb +0 -34
- data/lib/polytrix/runners/linux_challenge_runner.rb +0 -23
- data/lib/polytrix/runners/middleware/change_directory.rb +0 -20
- data/lib/polytrix/runners/middleware/feature_executor.rb +0 -24
- data/lib/polytrix/runners/middleware/setup_env_vars.rb +0 -42
- data/lib/polytrix/runners/mixlib_shellout_executor.rb +0 -83
- data/lib/polytrix/validations.rb +0 -23
- data/samples/scripts/wrapper +0 -7
- data/spec/polytrix/middleware/feature_executor_spec.rb +0 -48
- data/spec/polytrix/validations_spec.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e1a7bfe5588d1217cd43593060f0ca6d2ffc5ef
|
4
|
+
data.tar.gz: fdb98734b7873355e92d8c591c18d0f073686af0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd36979202c65e3dc9bf98b417b31abf3b57c2faa5e01cacde82a0852ac58ca9034722f43fa7194e5549ceda53b361b879c016816864caf24feee7e3ef88e9b2
|
7
|
+
data.tar.gz: 81c8f8705e16e86eea973f2ef8bbc0e9dec3f0b2cb3fd50668e97452d75c7c5b73477f252dcc679e63ed9b003dc6baa9d978fbfd94f1b65ba40af6fb0e6b9c81
|
data/.rubocop-todo.yml
CHANGED
@@ -1,19 +1,28 @@
|
|
1
1
|
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
-
# on 2014-06
|
2
|
+
# on 2014-10-06 19:48:04 -0400 using RuboCop version 0.18.1.
|
3
3
|
# The point is for the user to remove these configuration records
|
4
4
|
# one by one as the offences are removed from the code base.
|
5
5
|
# Note that changes in the inspected code, or installation of new
|
6
6
|
# versions of RuboCop, may require this file to be generated again.
|
7
7
|
|
8
|
-
# Offence count:
|
8
|
+
# Offence count: 1
|
9
|
+
# Configuration parameters: CountComments.
|
10
|
+
ClassLength:
|
11
|
+
Max: 124
|
12
|
+
|
13
|
+
# Offence count: 3
|
14
|
+
CyclomaticComplexity:
|
15
|
+
Max: 13
|
16
|
+
|
17
|
+
# Offence count: 83
|
9
18
|
Documentation:
|
10
19
|
Enabled: false
|
11
20
|
|
12
|
-
# Offence count:
|
21
|
+
# Offence count: 168
|
13
22
|
LineLength:
|
14
23
|
Max: 165
|
15
24
|
|
16
|
-
# Offence count:
|
25
|
+
# Offence count: 34
|
17
26
|
# Configuration parameters: CountComments.
|
18
27
|
MethodLength:
|
19
|
-
Max:
|
28
|
+
Max: 23
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,11 +4,27 @@ Polytrix is a polyglot test runner and documentation generator. It aims to let y
|
|
4
4
|
|
5
5
|
Polytrix was influenced by a number of polyglot projects, including [Travis-CI](travis-ci.org), [Docco](https://github.com/jashkenas/docco), [Slate](https://github.com/tripit/slate), and polyglot test-suites like the [JSON Schema Test Suite](https://github.com/json-schema/JSON-Schema-Test-Suite) and the [JSON-LD Test Suite](http://json-ld.org/test-suite/).
|
6
6
|
|
7
|
-
|
7
|
+
A lot of Polytrix was influenced by and based on [test-kitchen](http://kitchen.ci/). Polytrix is attempting to do for multi-language testing of code samples what test-kitchen does for multi-platform testing of infrastructure code.
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
- Validate sample code by running it through a series of stages:
|
12
|
+
* Clone: Fetch existing code samples from other git repos
|
13
|
+
* Detect: Match code samples for specific implementors to shared test scenarios
|
14
|
+
* Bootstrap: Install runtime dependencies for each implementor
|
15
|
+
* Exec: Invoke each test sample and capture the results (with built-in or custom spies)
|
16
|
+
* Validate: Ensure execution results (and data captured by spies) matches expectations
|
17
|
+
- Generate reports or documentation:
|
18
|
+
- A feature matrix comparing several implementations
|
19
|
+
- Detailed test reports showing validation results and data captured by spies
|
20
|
+
- Custom reports from custom spies
|
21
|
+
- Convert code samples to documentation
|
22
|
+
- Inject code samples and/or captured execution data into documentation templates
|
23
|
+
- Generate to-do lists for pending features
|
8
24
|
|
9
25
|
## Installing Polytrix
|
10
26
|
|
11
|
-
Polytrix is distributed as a Ruby Gem. It
|
27
|
+
Polytrix is distributed as a Ruby Gem. It is ideally installed using Bundler by adding this line to your Gemfile:
|
12
28
|
|
13
29
|
```shell
|
14
30
|
gem 'polytrix', '~> 0.1'
|
@@ -18,214 +34,160 @@ And then running `bundle install`.
|
|
18
34
|
|
19
35
|
It can also be installed without Bundler by running `gem install polytrix`.
|
20
36
|
|
21
|
-
|
37
|
+
**Note**: If installed with bundler it's best to always run `bundle exec polytrix ...` rather than just `polytrix ...`. The bundler documentation explains:
|
22
38
|
|
23
|
-
|
39
|
+
> In some cases, running executables without `bundle exec` may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle.
|
40
|
+
>
|
41
|
+
> However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine.
|
24
42
|
|
25
|
-
|
26
|
-
|
27
|
-
If you need a quick reminder of what the `polytrix` command gives you, then use the **help** subcommand:
|
28
|
-
|
29
|
-
```
|
30
|
-
$ bundle exec polytrix help
|
31
|
-
Commands:s
|
32
|
-
polytrix bootstrap [(all|<REGEX>)] [opts] # Bootstraps the code samples for one or more tests
|
33
|
-
polytrix code2doc [(all|<REGEX>)] [opts] # Converts annotated code samples to Markdown or reStructuredText
|
34
|
-
polytrix clean [(all|<REGEX>)] [opts] # Removes test results for one or more tests
|
35
|
-
polytrix clone [(all|<REGEX>)] [opts] # Clones the code samples from git for one or more tests
|
36
|
-
polytrix exec [(all|<REGEX>)] [opts] # Executes code samples for one or more tests
|
37
|
-
polytrix help [COMMAND] # Describe available commands or one specific command
|
38
|
-
polytrix list [(all|<REGEX>)] [opts] # List all tests
|
39
|
-
polytrix test [all|<REGEX>)] [opts] # Test one or more tests
|
40
|
-
polytrix verify [(all|<REGEX>)] [opts] # Verify the execution results of one or more tests
|
41
|
-
polytrix version # Print Polytrix's version information
|
42
|
-
```
|
43
|
+
## Usage
|
43
44
|
|
44
|
-
|
45
|
+
### Setup
|
45
46
|
|
46
|
-
The Polytrix test suites
|
47
|
-
A basic file looks like this:
|
47
|
+
The Polytrix test suites are defined by `polytrix.yml`. This file defines the implementors you want to test and the test scenarios that they share. A simple Polytrix setup looks like this:
|
48
48
|
|
49
49
|
```yaml
|
50
|
-
|
50
|
+
---
|
51
51
|
implementors:
|
52
52
|
ruby_samples:
|
53
|
-
language: ruby
|
54
|
-
|
55
|
-
exec_cmd: bundle exec ruby
|
56
|
-
git:
|
57
|
-
repo: https://github.com/polytrix/ruby_samples
|
58
|
-
python_samples:
|
59
|
-
language: python
|
60
|
-
bootstrap_script: scripts/pip_install
|
61
|
-
exec_script: scripts/pip_install
|
62
|
-
git:
|
63
|
-
repo: https://github.com/polytrix/python_samples
|
53
|
+
language: 'ruby'
|
54
|
+
basedir: 'sdks/ruby'
|
64
55
|
java_samples:
|
65
|
-
language: java
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
language: 'java'
|
57
|
+
basedir: 'sdks/java'
|
58
|
+
python_samples:
|
59
|
+
language: 'python'
|
60
|
+
basedir: 'sdks/python'
|
70
61
|
|
62
|
+
global_env: # global_env defines input available for all scenarios
|
63
|
+
LOCALE: <%= ENV['LANG'] %> # templating is allowed
|
71
64
|
suites:
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
code_samples:
|
82
|
-
word_count:
|
83
|
-
- name: short text
|
84
|
-
input: |
|
85
|
-
I am a word count utility
|
86
|
-
validate:
|
87
|
-
stdout: 6 words
|
88
|
-
- name: small file
|
89
|
-
input_file: fixtures/small_file.txt
|
90
|
-
validate:
|
91
|
-
stdout: 10 words
|
92
|
-
- name: large file
|
93
|
-
input_file: fixtures/large_file.txt
|
94
|
-
validate:
|
95
|
-
stdout: 1000 words
|
65
|
+
Katas: # "Katas" is the name of the first test suite
|
66
|
+
samples: # Test scenarios within Katas
|
67
|
+
- hello world
|
68
|
+
- quine
|
69
|
+
Environment:
|
70
|
+
env: # Unlike global_env, these variables are only for the Katas suite
|
71
|
+
COLOR: red
|
72
|
+
samples:
|
73
|
+
- echo_color
|
96
74
|
```
|
97
75
|
|
98
|
-
|
99
|
-
|
100
|
-
Polytrix tests scenarios across one or more implementors. The implementors may each be in a different
|
101
|
-
language, but you can also have multiple implementors for the same langauge. The structure used to define implementors within polytrix.yml is described below.
|
102
|
-
|
103
|
-
#### Implementor Object
|
104
|
-
|
105
|
-
Field Name | Type | Description
|
106
|
-
---|:---:|---
|
107
|
-
<a name="implementor_name"/>name | `string` | The name of the implementor. (*If omitted, this attribute’s value defaults to the key name associated with this object.*)
|
108
|
-
<a name="implementor_directory"/>directory | `string` | The location of the implementor project containing code samples.
|
109
|
-
<a name="implementor_language"/>language | `string` | The primary programming language of the code samples in this implementor.
|
110
|
-
<a name="implementor_git"/>git | [Git Object](#git_object) | Defines how to clone the project via Git.
|
111
|
-
<a name="implementor_scripts"/>scripts | [Scripts Object](#scripts_object) | Defines scripts to bootstrap, compile, and execute the samples.
|
112
|
-
|
113
|
-
#### Git Object
|
114
|
-
<a name="git_object"/>Field Name | Type | Description
|
115
|
-
---|:---:|---
|
116
|
-
<a name="git_repo"/>repo | `string` | **Required.** The git repo to clone.
|
117
|
-
<a name="git_branch"/>branch | `string` | The git branch to clone.
|
118
|
-
<a name="git_to"/>to | `string` | The local directory to clone into.
|
119
|
-
|
120
|
-
#### Scripts Object
|
121
|
-
<a name="scripts_object"/>Field Name | Type | Description
|
122
|
-
---|:---:|---
|
123
|
-
<a name="directory"/>directory | `directory` | The directory that contains the script files. **Default**: `scripts/`.
|
124
|
-
<a name="bootstrap_script"/>bootstrap_script | `file` | The file to execute to bootstrap the samples. **Default**: `bootstrap`
|
125
|
-
<a name="compile_script"/>compile_script | `file` | The file to execute to compile the samples. **Default**: `compile`
|
126
|
-
<a name="exec_script"/>exec_script | `file` | The file to use as an execute wrapper script for running samples. **Default**: `exec`
|
127
|
-
<a name="bootstrap_cmd"/>bootstrap_cmd | `string` | An inline script to execute instead of executing *bootstrap_file*.
|
128
|
-
<a name="compile_cmd"/>compile_cmd | `string` | An inline script to execute instead of executing *bootstrap_file*.
|
129
|
-
<a name="exec_cmd"/>exec_cmd | `string` | An inline script to use as an execution wrapper, instead of searching for a `exec` script.
|
130
|
-
|
131
|
-
#### Example Implementor Definition
|
76
|
+
The `implementors` defines the projects you want to test, and `suites` defines the test scenarios.
|
132
77
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
78
|
+
### CLI - Testing
|
79
|
+
|
80
|
+
Polytrix provides a CLI for driving tests, quickly viewing test results, or to generate test reports.
|
81
|
+
|
82
|
+
In order to see all available commands, simply run `bundle exec polytrix`:
|
83
|
+
|
84
|
+
```bash
|
85
|
+
$ bundle exec polytrix
|
86
|
+
|
87
|
+
Commands:
|
88
|
+
polytrix bootstrap [INSTANCE|REGEXP|all] # Change scenario state to bootstraped. Running bootstrap scripts for the implementor
|
89
|
+
polytrix clone [INSTANCE|REGEXP|all] # Change scenario state to cloned. Clone the code sample from git
|
90
|
+
polytrix destroy [INSTANCE|REGEXP|all] # Change scenario state to destroyed. Delete all information for one or more scenarios
|
91
|
+
polytrix detect [INSTANCE|REGEXP|all] # Find sample code that matches a test scenario. Attempts to locate a code sample with a filename that the test scenario name.
|
92
|
+
polytrix exec [INSTANCE|REGEXP|all] # Change instance state to executed. Execute the code sample and capture the results.
|
93
|
+
polytrix help [COMMAND] # Describe available commands or one specific command
|
94
|
+
polytrix list [INSTANCE|REGEXP|all] # Lists one or more scenarios
|
95
|
+
polytrix report # Generate reports
|
96
|
+
polytrix show [INSTANCE|REGEXP|all] # Show detailed status for one or more scenarios
|
97
|
+
polytrix test [INSTANCE|REGEXP|all] # Test (clone, bootstrap, exec, and verify) one or more scenarios
|
98
|
+
polytrix verify [INSTANCE|REGEXP|all] # Change instance state to verified. Assert that the captured results match the expectations for the scenario.
|
99
|
+
polytrix version # Print Polytrix's version information
|
145
100
|
```
|
146
101
|
|
147
|
-
|
102
|
+
The `INSTANCE` or `REGEXP` used in commands is matched against `Test ID`, which is an unique ID derived from the suite, scenario, and implementor names for a test. You can see the `Test ID`s via `polytrix show`.
|
148
103
|
|
149
|
-
|
104
|
+
#### List and Show
|
150
105
|
|
151
|
-
The
|
106
|
+
The command `polytrix list [INSTANCE|REGEXP|all]` or `polytrix show [INSTANCE|REGEXP|all]` can be used to give you an overview (list) or detailed information (show) about all tests or a subset of tests.
|
152
107
|
|
153
|
-
|
108
|
+
Initially the tests will have a status of "<Not Found>", but the status will change and details will become available as you run the commands below.
|
154
109
|
|
155
|
-
|
156
|
-
---|:---:|---
|
157
|
-
<a name="suite_name"/>name | `string` | The name of the suite. (*If omitted, this attribute’s value defaults to hash key associated with this object.*)
|
158
|
-
<a name="suite_input"/>input | `string` | The content to send to the code sample as standard input.
|
159
|
-
<a name="suite_input_file"/>input_file | `file` | Reads the specified file and sets *input*.
|
160
|
-
<a name="code_samples"/>code_samples | Hash of [Code Samples](#code_samples) | Defines the code samples to test
|
110
|
+
#### Cloning
|
161
111
|
|
162
|
-
|
112
|
+
The command `polytrix clone [INSTANCE|REGEXP|all]` will fetch code samples for an implementor from a git repo. This step is skipped if no git repo is specified for the implementor, or if it already appears to be cloned.
|
163
113
|
|
164
|
-
|
165
|
-
override the default values set in the Suite Object.
|
114
|
+
#### Bootstrapping
|
166
115
|
|
167
|
-
|
168
|
-
for testing the same code sample with a variety of different input values.
|
116
|
+
The command `polytrix clone [INSTANCE|REGEXP|all]` will "bootstrap" the implementors.
|
169
117
|
|
170
|
-
|
171
|
-
---|:---:|---
|
172
|
-
<a name="code_sample_name"/>name | `string` | The name of the suite. (*If omitted, this attribute’s value defaults to hash key associated with this object.*)
|
173
|
-
<a name="scenarios"/>scenarios | List of [Scenario Objects](#scenario_object) | Defines the scenarios to test for the code sample. **Default**: An scenario named default with no input.
|
118
|
+
Bootstrapping ensures the implementor has the resources it needs to run samples, especially third-party libraries. Bootstrapping behavior is controlled by:
|
174
119
|
|
120
|
+
- The presence of a [bootstrap script](http://wynnnetherland.com/linked/2013012801/bootstrapping-consistency) in `script/bootstrap`
|
121
|
+
- A bootstrap command defined within the implementor in the `polytrix.yml`
|
122
|
+
- Default behavior for the implementors language
|
175
123
|
|
176
|
-
####
|
124
|
+
#### Detecting
|
177
125
|
|
178
|
-
|
179
|
-
---|:---:|---
|
180
|
-
<a name="scenario_name"/>name | `string` | **Required.** The scenario name.
|
181
|
-
<a name="scenario_input"/>input | `string` | The content to send to the code sample as standard input.
|
182
|
-
<a name="scenario_input_file"/>input_file | `file` | Reads the specified file and sets *input*.
|
183
|
-
<a name="scenarios"/>language | Hash of [Scenario Objects](#scenario_object) | Defines the scenarios within the suite
|
126
|
+
The command `polytrix clone [INSTANCE|REGEXP|all]` will search each implementor for code samples that correspond with test scenarios.
|
184
127
|
|
185
|
-
|
128
|
+
Polytrix searches for samples by:
|
186
129
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
stdout: Hello, World!
|
194
|
-
quine:
|
195
|
-
validate:
|
196
|
-
quine_validator: true
|
197
|
-
utilities:
|
198
|
-
scenarios:
|
199
|
-
word_count:
|
200
|
-
- name: short text
|
201
|
-
input: |
|
202
|
-
I am a word count utility
|
203
|
-
validate:
|
204
|
-
stdout: 6 words
|
205
|
-
- name: small file
|
206
|
-
input_file: fixtures/small_file.txt
|
207
|
-
validate:
|
208
|
-
stdout: 10 words
|
209
|
-
- name: large file
|
210
|
-
input_file: fixtures/large_file.txt
|
211
|
-
validate:
|
212
|
-
stdout: 1000 words
|
213
|
-
```
|
130
|
+
- Checking the implementor definition (in `polytrix.yml`) a static mapping of test scenarios to files.
|
131
|
+
- Searching files matching the scenario name, using a rather lax search pattern
|
132
|
+
- Search for a partial name match
|
133
|
+
- Case-insensitive
|
134
|
+
- Ignore ' ', '_', '-' and '.'
|
135
|
+
- Do not search files or directories that are .gitignore'd.
|
214
136
|
|
215
|
-
|
137
|
+
This search pattern achieves a good hit rate while still letting implementors follow language or pattern conventions. For example, if the scenario is called "create server", the following file names will all match:
|
216
138
|
|
217
|
-
|
139
|
+
- src/java/com/foo/bar/CreateServer.java
|
140
|
+
- lib/foo/bar/create_server.rb
|
141
|
+
- samples/04-create-server.go
|
218
142
|
|
219
|
-
|
143
|
+
In order to avoid matching compiled files with similar names (like `CreateServer.class` or `create_server.pyc`) make sure they are gitignore'd.
|
220
144
|
|
221
|
-
|
145
|
+
Successfully completing this stage will set a test's status to `Sample Found`.
|
222
146
|
|
223
|
-
|
147
|
+
#### Executing
|
224
148
|
|
225
|
-
|
226
|
-
### Bootstrapping implementors
|
227
|
-
### Executing scenarios
|
228
|
-
### Verifying scenario results
|
229
|
-
### Full test
|
149
|
+
The command `polytrix exec [INSTANCE|REGEXP|all]` will execute a code sample while capturing data via spies.
|
230
150
|
|
231
|
-
|
151
|
+
If the code sample is executable (e.g. many Bash, Ruby, or Python scripts) then Polytrix can execute it directly. If it is not direclty executable you can create a `script/wrapper`. Polytrix will execute the wrapper script with the first argument set to the path to the code sample. You can use this to defer to `bundle exec`, `node`, `java`, or any other program or script necessary to run the code sample.
|
152
|
+
|
153
|
+
Polytrix has a built-in spy to capture the processes exit status, stdout, and stderr. You can register custom spies to capture additional information. For example, a [Pacto](https://github.com/thoughtworks/pacto) spy has been used to capture HTTP requests that are made by code samples and match them to known services defined via [Swagger](http://swagger.io/).
|
154
|
+
|
155
|
+
TODO: Documentation on custom spies.
|
156
|
+
|
157
|
+
Successfully completing this stage will set a test's status to `Executed`.
|
158
|
+
|
159
|
+
#### Validating
|
160
|
+
|
161
|
+
The command `polytrix verify [INSTANCE|REGEXP|all]` will check the captured data from executing a code sample against the validators for that test scenario.
|
162
|
+
|
163
|
+
The validators are shared across all implementors, acting as a compliance test suite. A default validator is used if a test does not have any specific validators. A scenario can have more than one validator.
|
164
|
+
|
165
|
+
TODO: Documentation on writing validators.
|
166
|
+
|
167
|
+
This stage will set the test's status to `Partially Verified (n of m)` or `Fully Verified (n of n)`, where `n` is the number of validators that succeeded and `m` is the number of validators registered for the test scenario.
|
168
|
+
|
169
|
+
#### Cleaning
|
170
|
+
|
171
|
+
The command `polytrix destroy [INSTANCE|REGEXP|all]` clears out the saved test status and captured data.
|
172
|
+
|
173
|
+
This will set the status back to `<Not Found>`.
|
174
|
+
|
175
|
+
#### Testing
|
176
|
+
|
177
|
+
The command `polytrix test [INSTANCE|REGEXP|all]` combines the commands above into a single command. It runs in order:
|
178
|
+
|
179
|
+
destroy->detect->exec->verify
|
180
|
+
|
181
|
+
### Reports
|
182
|
+
|
183
|
+
#### Dashboard
|
184
|
+
|
185
|
+
The command `polytrix report dashboard` will generate an HTML feature matrix where each result is a link to more information about the test execution.
|
186
|
+
|
187
|
+
#### Code2doc
|
188
|
+
|
189
|
+
The command `polytrix report code2doc [INSTANCE|REGEXP|all]` will convert annotated code samples to documentation. It is similar to projects like [docco](https://github.com/jashkenas/docco), except that it generates Markdown or reStructuredText rather than fully-styled HTML. The idea is that you can more easily drop these files into static site generators like [middlemanapp](http://middlemanapp.com/), documentation tools like [slate](https://github.com/tripit/slate), or services like [viewdocs](http://progrium.viewdocs.io/viewdocs) or [readthedocs](https://readthedocs.org/), which already handle styling and syntax highlighting.
|
190
|
+
|
191
|
+
## Solo mode
|
192
|
+
|
193
|
+
TODO: Polytrix' experimental solo mode for running samples w/out a `polytrix.yml`.
|
data/Rakefile
CHANGED
@@ -6,14 +6,14 @@ require 'cucumber'
|
|
6
6
|
require 'cucumber/rake/task'
|
7
7
|
require 'rubocop/rake_task'
|
8
8
|
|
9
|
-
task :
|
9
|
+
task default: [:spec, :features, :self, :rubocop]
|
10
10
|
|
11
11
|
RSpec::Core::RakeTask.new('spec') do |t|
|
12
|
-
t.rspec_opts =
|
12
|
+
t.rspec_opts = '-f documentation'
|
13
13
|
end
|
14
14
|
|
15
15
|
Cucumber::Rake::Task.new(:features) do |t|
|
16
|
-
t.cucumber_opts =
|
16
|
+
t.cucumber_opts = 'features --require features/support --require features/step_definitions -t ~@wip'
|
17
17
|
end
|
18
18
|
|
19
19
|
desc 'Remove reports and other generated artifacts'
|
@@ -24,17 +24,10 @@ end
|
|
24
24
|
|
25
25
|
desc 'Self-test and self-document'
|
26
26
|
task :self do
|
27
|
-
sh 'bundle exec polytrix
|
28
|
-
Dir.chdir 'samples' do
|
29
|
-
# sh 'bundle exec polytrix test'
|
30
|
-
sh 'bundle exec polytrix code2doc java --target-dir=docs/samples/code2doc/java'
|
31
|
-
sh 'bundle exec polytrix code2doc python --target-dir=docs/samples/code2doc/python'
|
32
|
-
sh 'bundle exec polytrix code2doc ruby --target-dir=docs/samples/code2doc/ruby'
|
33
|
-
# sh 'bundle exec polytrix code2doc samples/*.rb'
|
34
|
-
end
|
27
|
+
sh 'bundle exec polytrix test'
|
35
28
|
end
|
36
29
|
|
37
|
-
|
30
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
38
31
|
# abort rake on failure
|
39
32
|
task.fail_on_error = true
|
40
33
|
end
|
data/bin/polytrix
CHANGED
@@ -7,7 +7,6 @@ Feature: Boostrapping
|
|
7
7
|
And the java SDK
|
8
8
|
And the python SDK
|
9
9
|
And the hello_world polytrix config
|
10
|
-
And the standard rspec setup
|
11
10
|
When I run `bundle exec polytrix bootstrap`
|
12
11
|
Then the output should contain "-----> Bootstrapping java"
|
13
12
|
Then the output should contain "-----> Bootstrapping python"
|
@@ -18,7 +17,6 @@ Feature: Boostrapping
|
|
18
17
|
And the java SDK
|
19
18
|
And the python SDK
|
20
19
|
And the hello_world polytrix config
|
21
|
-
And the standard rspec setup
|
22
20
|
When I run `bundle exec polytrix bootstrap "(java|ruby)"`
|
23
21
|
Then the output should contain "-----> Bootstrapping java"
|
24
22
|
Then the output should not contain "-----> Bootstrapping python"
|
@@ -29,7 +27,6 @@ Feature: Boostrapping
|
|
29
27
|
And the java SDK
|
30
28
|
And the python SDK
|
31
29
|
And the hello_world polytrix config
|
32
|
-
And the standard rspec setup
|
33
30
|
When I run `bundle exec polytrix bootstrap hello`
|
34
31
|
Then the output should contain "-----> Bootstrapping java"
|
35
32
|
Then the output should contain "-----> Bootstrapping python"
|
data/features/cloning.feature
CHANGED
@@ -5,7 +5,6 @@ Feature: Cloning
|
|
5
5
|
|
6
6
|
Scenario: Cloning all SDKs
|
7
7
|
Given the hello_world polytrix config
|
8
|
-
And the standard rspec setup
|
9
8
|
When I run `bundle exec polytrix clone`
|
10
9
|
Then the output should contain "-----> Cloning java"
|
11
10
|
Then the output should contain "-----> Cloning python"
|
@@ -16,7 +15,6 @@ Feature: Cloning
|
|
16
15
|
And the java SDK
|
17
16
|
And the python SDK
|
18
17
|
And the hello_world polytrix config
|
19
|
-
And the standard rspec setup
|
20
18
|
When I run `bundle exec polytrix clone "(java|ruby)"`
|
21
19
|
Then the output should contain "-----> Cloning java"
|
22
20
|
Then the output should not contain "-----> Cloning python"
|
@@ -27,7 +25,6 @@ Feature: Cloning
|
|
27
25
|
And the java SDK
|
28
26
|
And the python SDK
|
29
27
|
And the hello_world polytrix config
|
30
|
-
And the standard rspec setup
|
31
28
|
When I run `bundle exec polytrix clone hello`
|
32
29
|
Then the output should contain "-----> Cloning java"
|
33
30
|
Then the output should contain "-----> Cloning python"
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Feature: Show
|
2
|
+
|
3
|
+
Scenario: Initial state
|
4
|
+
Given the ruby SDK
|
5
|
+
And the java SDK
|
6
|
+
And the python SDK
|
7
|
+
And the hello_world polytrix config
|
8
|
+
When I run `bundle exec polytrix show katas-hello_world-ruby`
|
9
|
+
Then the output should contain:
|
10
|
+
"""
|
11
|
+
katas-hello_world-ruby: <Not Found>
|
12
|
+
Test suite: Katas
|
13
|
+
Test scenario: hello world
|
14
|
+
Implementor: ruby
|
15
|
+
Source: sdks/ruby/challenges/hello_world.rb
|
16
|
+
Data from spies:
|
17
|
+
"""
|
18
|
+
|
19
|
+
@no-clobber
|
20
|
+
Scenario: State after testing
|
21
|
+
Given I run `bundle exec polytrix test ruby`
|
22
|
+
When I run `bundle exec polytrix show katas-hello_world-ruby`
|
23
|
+
Then the output should contain:
|
24
|
+
"""
|
25
|
+
katas-hello_world-ruby: Fully Verified (1 of 1)
|
26
|
+
Test suite: Katas
|
27
|
+
Test scenario: hello world
|
28
|
+
Implementor: ruby
|
29
|
+
Source: sdks/ruby/challenges/hello_world.rb
|
30
|
+
Execution result:
|
31
|
+
Exit Status: 0
|
32
|
+
Stdout:
|
33
|
+
Hello, world!
|
34
|
+
Stderr:
|
35
|
+
Validations:
|
36
|
+
default validator: ✓ Passed
|
37
|
+
Data from spies:
|
38
|
+
"""
|
data/features/states.feature
CHANGED
@@ -5,14 +5,13 @@ Feature: States
|
|
5
5
|
And the java SDK
|
6
6
|
And the python SDK
|
7
7
|
And the hello_world polytrix config
|
8
|
-
And the standard rspec setup
|
9
8
|
When I run `bundle exec polytrix list`
|
10
9
|
Then the output should contain:
|
11
10
|
"""
|
12
|
-
Suite Scenario Implementor Status
|
13
|
-
Katas hello world ruby <Not Found>
|
14
|
-
Katas hello world java <Not Found>
|
15
|
-
Katas hello world python <Not Found>
|
11
|
+
Test ID Suite Scenario Implementor Status
|
12
|
+
katas-hello_world-ruby Katas hello world ruby <Not Found>
|
13
|
+
katas-hello_world-java Katas hello world java <Not Found>
|
14
|
+
katas-hello_world-python Katas hello world python <Not Found>
|
16
15
|
"""
|
17
16
|
|
18
17
|
@no-clobber
|
@@ -21,10 +20,10 @@ Feature: States
|
|
21
20
|
When I run `bundle exec polytrix list`
|
22
21
|
Then the output should contain:
|
23
22
|
"""
|
24
|
-
Suite Scenario Implementor Status
|
25
|
-
Katas hello world ruby <Not Found>
|
26
|
-
Katas hello world java <Not Found>
|
27
|
-
Katas hello world python Executed
|
23
|
+
Test ID Suite Scenario Implementor Status
|
24
|
+
katas-hello_world-ruby Katas hello world ruby <Not Found>
|
25
|
+
katas-hello_world-java Katas hello world java <Not Found>
|
26
|
+
katas-hello_world-python Katas hello world python Executed
|
28
27
|
"""
|
29
28
|
|
30
29
|
@no-clobber
|
@@ -33,8 +32,8 @@ Feature: States
|
|
33
32
|
When I run `bundle exec polytrix list`
|
34
33
|
Then the output should contain:
|
35
34
|
"""
|
36
|
-
Suite Scenario Implementor Status
|
37
|
-
Katas hello world ruby Verified (
|
38
|
-
Katas hello world java <Not Found>
|
39
|
-
Katas hello world python Executed
|
35
|
+
Test ID Suite Scenario Implementor Status
|
36
|
+
katas-hello_world-ruby Katas hello world ruby Fully Verified (1 of 1)
|
37
|
+
katas-hello_world-java Katas hello world java <Not Found>
|
38
|
+
katas-hello_world-python Katas hello world python Executed
|
40
39
|
"""
|
@@ -9,10 +9,6 @@ Given(/^the (\w+) polytrix config$/) do |config|
|
|
9
9
|
FileUtils.cp_r "features/fixtures/configs/#{config}.yml", "#{current_dir}/polytrix.yml"
|
10
10
|
end
|
11
11
|
|
12
|
-
Given(/^the standard rspec setup$/) do
|
13
|
-
FileUtils.cp_r 'features/fixtures/spec/', "#{current_dir}/"
|
14
|
-
end
|
15
|
-
|
16
12
|
Then(/^the file "(.*?)" should contain yaml matching:$/) do |file, content|
|
17
13
|
in_current_dir do
|
18
14
|
actual_content = YAML.load(File.read(file))
|