polytrix 0.0.1 → 0.1.0.pre

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.rspec +1 -6
  4. data/.rubocop-todo.yml +19 -0
  5. data/.rubocop.yml +10 -0
  6. data/.travis.yml +11 -0
  7. data/Gemfile +0 -16
  8. data/README.md +119 -28
  9. data/Rakefile +18 -123
  10. data/bin/polytrix +5 -0
  11. data/doc-src/_markdown.md +5 -0
  12. data/doc-src/default_bootstrap.md +13 -0
  13. data/docs/influences.md +28 -0
  14. data/docs/samples/code2doc/java/HelloWorld.md +13 -0
  15. data/docs/samples/code2doc/java/Quine.md +33 -0
  16. data/docs/samples/code2doc/python/hello_world.md +3 -0
  17. data/docs/samples/code2doc/python/quine.md +4 -0
  18. data/docs/samples/code2doc/ruby/hello_world.md +7 -0
  19. data/features/execution.feature +67 -0
  20. data/features/fixtures/configs/empty.yml +12 -0
  21. data/features/fixtures/configs/hello_world.yml +10 -0
  22. data/features/fixtures/spec/polytrix_merge.rb +5 -0
  23. data/features/fixtures/spec/polytrix_spec.rb +10 -0
  24. data/features/reporting.feature +140 -0
  25. data/features/step_definitions/sdk_steps.rb +12 -0
  26. data/features/support/env.rb +8 -0
  27. data/lib/polytrix/challenge.rb +20 -7
  28. data/lib/polytrix/challenge_runner.rb +9 -44
  29. data/lib/polytrix/cli/add.rb +67 -0
  30. data/lib/polytrix/cli/report.rb +88 -0
  31. data/lib/polytrix/cli/reports/hash_reporter.rb +30 -0
  32. data/lib/polytrix/cli/reports/json_reporter.rb +14 -0
  33. data/lib/polytrix/cli/reports/markdown_reporter.rb +23 -0
  34. data/lib/polytrix/cli/reports/yaml_reporter.rb +14 -0
  35. data/lib/polytrix/cli.rb +158 -0
  36. data/lib/polytrix/configuration.rb +65 -4
  37. data/lib/polytrix/core/file_system_helper.rb +75 -0
  38. data/lib/polytrix/core/implementor.rb +31 -3
  39. data/lib/polytrix/documentation/code_segmenter.rb +168 -0
  40. data/lib/polytrix/documentation/comment_styles.rb +87 -0
  41. data/lib/polytrix/documentation/helpers/code_helper.rb +85 -0
  42. data/lib/polytrix/documentation/view_helper.rb +21 -0
  43. data/lib/polytrix/documentation_generator.rb +59 -10
  44. data/lib/polytrix/executor.rb +89 -0
  45. data/lib/polytrix/logger.rb +17 -0
  46. data/lib/polytrix/manifest.rb +64 -7
  47. data/lib/polytrix/result.rb +16 -2
  48. data/lib/polytrix/rspec/documentation_formatter.rb +41 -16
  49. data/lib/polytrix/rspec/yaml_report.rb +51 -0
  50. data/lib/polytrix/rspec.rb +32 -53
  51. data/lib/polytrix/runners/middleware/feature_executor.rb +4 -3
  52. data/lib/polytrix/runners/middleware/setup_env_vars.rb +6 -4
  53. data/lib/polytrix/validation.rb +20 -0
  54. data/lib/polytrix/validations.rb +23 -0
  55. data/lib/polytrix/validator.rb +20 -0
  56. data/lib/polytrix/validator_registry.rb +34 -0
  57. data/lib/polytrix/version.rb +1 -1
  58. data/lib/polytrix.rb +125 -22
  59. data/polytrix.gemspec +7 -2
  60. data/polytrix.rb +6 -0
  61. data/polytrix_tests.yml +20 -0
  62. data/resources/code_sample.tt +2 -0
  63. data/samples/.gitignore +2 -0
  64. data/samples/_markdown.md +5 -0
  65. data/samples/default_bootstrap.rb +14 -0
  66. data/samples/polytrix.rb +28 -0
  67. data/samples/polytrix_cli.sh +7 -0
  68. data/samples/polytrix_tests.yml +10 -0
  69. data/{sdks/fog → samples}/scripts/bootstrap +0 -2
  70. data/samples/scripts/wrapper +7 -0
  71. data/samples/sdks/custom/polytrix.yml +2 -0
  72. data/samples/sdks/java/.gitignore +2 -0
  73. data/samples/sdks/java/build.gradle +14 -0
  74. data/samples/sdks/java/challenges/HelloWorld.java +10 -0
  75. data/samples/sdks/java/challenges/Quine.java +31 -0
  76. data/samples/sdks/java/code_sample.tt +11 -0
  77. data/samples/sdks/java/scripts/bootstrap +2 -0
  78. data/samples/sdks/java/scripts/wrapper +8 -0
  79. data/samples/sdks/python/challenges/hello_world.py +2 -0
  80. data/samples/sdks/python/challenges/quine.py +2 -0
  81. data/{sdks/pkgcloud → samples/sdks/python}/scripts/wrapper +1 -1
  82. data/samples/sdks/ruby/challenges/hello_world.rb +4 -0
  83. data/scripts/bootstrap +1 -9
  84. data/scripts/wrapper +7 -0
  85. data/spec/fabricators/challenge_fabricator.rb +17 -0
  86. data/spec/fabricators/manifest_fabricator.rb +50 -0
  87. data/spec/fabricators/validator_fabricator.rb +12 -0
  88. data/spec/fixtures/{polytrix.yml → polytrix_tests.yml} +0 -0
  89. data/spec/fixtures/src-doc/_scenario.md.erb +1 -0
  90. data/spec/polytrix/challenge_runner_spec.rb +3 -3
  91. data/spec/polytrix/challenge_spec.rb +3 -4
  92. data/spec/polytrix/cli_spec.rb +39 -0
  93. data/spec/polytrix/configuration_spec.rb +45 -1
  94. data/spec/polytrix/documentation/helpers/code_helper_spec.rb +120 -0
  95. data/spec/polytrix/documentation_generator_spec.rb +41 -20
  96. data/spec/polytrix/file_finder_spec.rb +4 -3
  97. data/spec/polytrix/implementor_spec.rb +33 -0
  98. data/spec/polytrix/manifest_spec.rb +32 -14
  99. data/spec/polytrix/middleware/feature_executor_spec.rb +1 -1
  100. data/spec/polytrix/result_spec.rb +49 -0
  101. data/spec/polytrix/validations_spec.rb +16 -0
  102. data/spec/polytrix/validator_registry_spec.rb +39 -0
  103. data/spec/polytrix/validator_spec.rb +63 -0
  104. data/spec/polytrix_spec.rb +33 -7
  105. data/spec/spec_helper.rb +14 -1
  106. data/spec/thor_spy.rb +64 -0
  107. metadata +177 -160
  108. data/.rspec_parallel +0 -10
  109. data/Vagrantfile +0 -41
  110. data/features/0_identity_spec.rb +0 -40
  111. data/features/1_cloud_files_spec.rb +0 -48
  112. data/features/2_servers_spec.rb +0 -19
  113. data/features/features_helper.rb +0 -46
  114. data/features/helpers/cloudfiles_helper.rb +0 -31
  115. data/features/helpers/pacto_helper.rb +0 -33
  116. data/features/helpers/teardown_helper.rb +0 -49
  117. data/features/pacto/extensions/loaders/api_blueprint_loader.rb +0 -63
  118. data/features/pacto/extensions/loaders/simple_loader.rb +0 -55
  119. data/features/pacto/extensions/loaders/yaml_or_json_loader.rb +0 -17
  120. data/features/pacto/extensions/matchers.rb +0 -38
  121. data/features/phase2/feature_coverage_report.rb +0 -109
  122. data/features/phase2/run_all_features.rb +0 -14
  123. data/features/static_site/fixtures/index.html +0 -6
  124. data/lib/polytrix/challenge_builder.rb +0 -16
  125. data/lib/polytrix/core/file_finder.rb +0 -43
  126. data/lib/polytrix/core/result_tracker.rb +0 -25
  127. data/lib/polytrix/runners/middleware/pacto.rb +0 -59
  128. data/packer/.gitignore +0 -3
  129. data/packer/Berksfile +0 -15
  130. data/packer/Gemfile +0 -5
  131. data/packer/Vagrantfile +0 -128
  132. data/packer/cookbooks/drg/metadata.rb +0 -27
  133. data/packer/cookbooks/drg/recipes/admins.rb +0 -22
  134. data/packer/cookbooks/drg/recipes/default.rb +0 -9
  135. data/packer/cookbooks/drg/recipes/dotnet.rb +0 -4
  136. data/packer/cookbooks/drg/recipes/golang.rb +0 -4
  137. data/packer/cookbooks/drg/recipes/java.rb +0 -5
  138. data/packer/cookbooks/drg/recipes/php.rb +0 -10
  139. data/packer/cookbooks/drg/recipes/ruby.rb +0 -29
  140. data/packer/cookbooks/drg/recipes/system.rb +0 -13
  141. data/packer/create_box.sh +0 -10
  142. data/packer/http/preseed.cfg +0 -87
  143. data/packer/packer.json +0 -91
  144. data/packer/scripts/root_setup.sh +0 -37
  145. data/packer/scripts/setup.sh +0 -32
  146. data/pacto/config/pacto_server.rb +0 -40
  147. data/pacto/contracts/dfw.servers.api.rackspacecloud.com/v2/account_id/extensions.json +0 -64
  148. data/pacto/contracts/dfw.servers.api.rackspacecloud.com/v2/account_id/flavors/id.json +0 -100
  149. data/pacto/contracts/dfw.servers.api.rackspacecloud.com/v2/account_id/images/id.json +0 -176
  150. data/pacto/contracts/dfw.servers.api.rackspacecloud.com/v2/account_id/servers/id.json +0 -189
  151. data/pacto/contracts/dfw.servers.api.rackspacecloud.com/v2/account_id/servers.json +0 -63
  152. data/pacto/contracts/dns.api.rackspacecloud.com/v1.0/_tenant_id/domains.json +0 -62
  153. data/pacto/contracts/identity.api.rackspacecloud.com/v2.0/tokens.json +0 -192
  154. data/pacto/contracts/monitoring.api.rackspacecloud.com/v1.0/_tenant_id/account.json +0 -39
  155. data/pacto/contracts/ord.autoscale.api.rackspacecloud.com/v1.0/_tenant_id/groups.json +0 -38
  156. data/pacto/contracts/ord.blockstorage.api.rackspacecloud.com/v1/_tenant_id/volumes.json +0 -30
  157. data/pacto/contracts/ord.databases.api.rackspacecloud.com/v1.0/_tenant_id/instances.json +0 -30
  158. data/pacto/contracts/ord.loadbalancers.api.rackspacecloud.com/v1.0/_tenant_id/loadbalancers.json +0 -114
  159. data/pacto/contracts/ord.queues.api.rackspacecloud.com/v1/_tenant_id/queues.json +0 -13
  160. data/pacto/contracts/ord.servers.api.rackspacecloud.com/v2/_tenant_id/os-networksv2.json +0 -46
  161. data/pacto/contracts/ord.servers.api.rackspacecloud.com/v2/_tenant_id/servers/detail.json +0 -230
  162. data/pacto/contracts/storage101.dfw1.clouddrive.com/v1/mosso_account/container/object.json +0 -15
  163. data/pacto/contracts/storage101.dfw1.clouddrive.com/v1/mosso_account.json +0 -43
  164. data/pacto/contracts/storage101.ord1.clouddrive.com/v1/_mosso_id.json +0 -44
  165. data/pacto/pacto_server.rb +0 -100
  166. data/pacto/rackspace_uri_map.yaml +0 -229
  167. data/scripts/cibuild +0 -4
  168. data/sdks/fog/.gitignore +0 -1
  169. data/sdks/fog/Gemfile +0 -5
  170. data/sdks/fog/challenges/all_connections.rb +0 -45
  171. data/sdks/fog/challenges/authenticate_token.rb +0 -15
  172. data/sdks/fog/challenges/cdn_enable_container.rb +0 -20
  173. data/sdks/fog/challenges/create_a_container.rb +0 -17
  174. data/sdks/fog/challenges/create_server.rb +0 -36
  175. data/sdks/fog/challenges/get_object_metadata.rb +0 -13
  176. data/sdks/fog/challenges/list_containers.rb +0 -10
  177. data/sdks/fog/challenges/provision_scalable_webapp.rb +0 -30
  178. data/sdks/fog/challenges/upload_folder.rb +0 -25
  179. data/sdks/fog/scripts/bootstrap.ps1 +0 -1
  180. data/sdks/fog/scripts/wrapper +0 -2
  181. data/sdks/fog/scripts/wrapper.ps1 +0 -1
  182. data/sdks/gophercloud/.gitignore +0 -2
  183. data/sdks/gophercloud/challenges/authenticate_token.go +0 -23
  184. data/sdks/gophercloud/scripts/bootstrap +0 -6
  185. data/sdks/gophercloud/scripts/wrapper +0 -10
  186. data/sdks/jclouds/.gitignore +0 -1
  187. data/sdks/jclouds/challenges/AuthenticateToken.java +0 -115
  188. data/sdks/jclouds/pom.xml +0 -34
  189. data/sdks/jclouds/scripts/bootstrap +0 -3
  190. data/sdks/jclouds/scripts/wrapper +0 -7
  191. data/sdks/openstack.net/.gitignore +0 -4
  192. data/sdks/openstack.net/.nuget/Microsoft.Build.dll +0 -0
  193. data/sdks/openstack.net/.nuget/NuGet.Config +0 -6
  194. data/sdks/openstack.net/.nuget/NuGet.exe +0 -0
  195. data/sdks/openstack.net/.nuget/NuGet.targets +0 -136
  196. data/sdks/openstack.net/Challenge.cs +0 -10
  197. data/sdks/openstack.net/RunChallenge.cs +0 -19
  198. data/sdks/openstack.net/challenges/AuthenticateToken.cs +0 -24
  199. data/sdks/openstack.net/challenges/Weird.cs +0 -133
  200. data/sdks/openstack.net/openstack.net.csproj +0 -58
  201. data/sdks/openstack.net/openstack.net.sln +0 -27
  202. data/sdks/openstack.net/openstack.net.userprefs +0 -8
  203. data/sdks/openstack.net/packages.config +0 -6
  204. data/sdks/openstack.net/scripts/bootstrap +0 -2
  205. data/sdks/openstack.net/scripts/bootstrap.ps1 +0 -2
  206. data/sdks/openstack.net/scripts/wrapper +0 -7
  207. data/sdks/openstack.net/scripts/wrapper.ps1 +0 -1
  208. data/sdks/php-opencloud/.gitignore +0 -4
  209. data/sdks/php-opencloud/challenges/all_connections.php +0 -64
  210. data/sdks/php-opencloud/challenges/authenticate_token.php +0 -14
  211. data/sdks/php-opencloud/challenges/create_server.php +0 -39
  212. data/sdks/php-opencloud/challenges/get_object_metadata.php +0 -19
  213. data/sdks/php-opencloud/composer.json +0 -5
  214. data/sdks/php-opencloud/scripts/bootstrap +0 -4
  215. data/sdks/php-opencloud/scripts/bootstrap.ps1 +0 -2
  216. data/sdks/php-opencloud/scripts/wrapper +0 -2
  217. data/sdks/php-opencloud/scripts/wrapper.ps1 +0 -1
  218. data/sdks/pkgcloud/.gitignore +0 -1
  219. data/sdks/pkgcloud/challenges/authenticate_token.js +0 -17
  220. data/sdks/pkgcloud/challenges/get_object_metadata.js +0 -18
  221. data/sdks/pkgcloud/scripts/bootstrap +0 -2
  222. data/sdks/pkgcloud/scripts/bootstrap.ps1 +0 -1
  223. data/sdks/pkgcloud/scripts/wrapper.ps1 +0 -1
  224. data/sdks/pyrax/.gitignore +0 -2
  225. data/sdks/pyrax/challenges/all_connections.py +0 -61
  226. data/sdks/pyrax/challenges/authenticate_token.py +0 -17
  227. data/sdks/pyrax/challenges/cdn_enable_container.py +0 -22
  228. data/sdks/pyrax/challenges/create_a_container.py +0 -21
  229. data/sdks/pyrax/challenges/create_server.py +0 -35
  230. data/sdks/pyrax/challenges/get_object_metadata.py +0 -17
  231. data/sdks/pyrax/challenges/upload_folder.py +0 -32
  232. data/sdks/pyrax/requirements.txt +0 -21
  233. data/sdks/pyrax/scripts/bootstrap +0 -9
  234. data/sdks/pyrax/scripts/bootstrap.ps1 +0 -7
  235. data/sdks/pyrax/scripts/wrapper +0 -3
  236. data/sdks/pyrax/scripts/wrapper.ps1 +0 -2
  237. data/spec/polytrix/challenge_builder_spec.rb +0 -16
  238. data/spec/rspec_spec.rb +0 -17
data/Vagrantfile DELETED
@@ -1,41 +0,0 @@
1
- # -*- mode: ruby -*-
2
- # vi: set ft=ruby :
3
-
4
- # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
- VAGRANTFILE_API_VERSION = "2"
6
-
7
- Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
- config.vm.box = "drg"
9
-
10
- # Original box used to build pre-packaged DRG box
11
- # config.vm.box = "ubuntu1310"
12
- # config.vm.box_url = "https://dl.dropboxusercontent.com/s/ng79gg5bg24r38p/ubuntu1310.box?token_hash=AAGKH9rJTMozemrLMLw8n8Htvg8-gGhb7xo8cwh0TaYCaw&dl=1"
13
-
14
- config.cache.auto_detect = true
15
-
16
- config.vm.provision :shell, :inline => "curl -L https://opscode.com/chef/install.sh | bash"
17
-
18
- config.vm.define :polytrix do |vm|
19
- end
20
-
21
- config.vm.provider :rackspace do |rs, override|
22
- override.vm.box = "dummy"
23
- override.ssh.private_key_path = '~/.ssh/id_rsa'
24
- rs.public_key_path = '~/.ssh/id_rsa.pub'
25
- rs.username = ENV['RAX_USERNAME']
26
- rs.api_key = ENV['RAX_API_KEY']
27
- rs.flavor = /2 GB Performance/
28
- rs.image = "DRG" # image created by packer. See ./packer/
29
- rs.rackspace_region = :ord
30
- end
31
-
32
- config.vm.provision :chef_solo do |chef|
33
- chef.cookbooks_path = ["packer/cookbooks", "packer/vendor/cookbooks"]
34
- chef.add_recipe "drg"
35
- # chef.log_level = :debug
36
- chef.json = {
37
- :instance_role => "vagrant"
38
- }
39
- end
40
-
41
- end
@@ -1,40 +0,0 @@
1
- describe 'Getting Started', :markdown =>
2
- """
3
- Welcome to the SDK guide!
4
-
5
- In this section, you will learn how to connect to OpenStack by authenticating against the [Identity service](http://docs.openstack.org/api/openstack-identity-service/2.0/content/).
6
-
7
- By the end of the section, you will know:
8
- - You have valid, working credentials
9
- - You are able to load use the SDK of your choice
10
-
11
- In the sections that follow, we will build the cloud infrastructure for a sample application using the OpenStack services.
12
- """ do
13
- code_sample 'authenticate token', """
14
- Please use the SDK to [authenticate](http://docs.rackspace.com/auth/api/v2.0/auth-client-devguide/content/POST_authenticate_v2.0_tokens_Token_Calls.html) using a username and API key.
15
- """, standard_env_vars, [:Authenticate] do
16
- # Assertions
17
- expect(Pacto).to have_validated_service('Identity', 'Authenticate')
18
- expect(Pacto).to_not have_failed_validations
19
- expect(Pacto).to_not have_unmatched_requests
20
- end
21
-
22
- code_sample 'all connections', """
23
- Let's make a connection to each of the available OpenStack products
24
- """, standard_env_vars, [] do
25
- expect(Pacto).to have_validated_service('Identity', 'Authenticate')
26
- expect(Pacto).to have_validated_service('Cloud Servers', 'List Servers')
27
- expect(Pacto).to have_validated_service('Cloud Networks', 'List Networks')
28
- expect(Pacto).to have_validated_service('Cloud Files', 'List Containers')
29
- expect(Pacto).to have_validated_service('Cloud Load Balancers', 'List Load Balancers')
30
- expect(Pacto).to have_validated_service('Cloud Databases', 'List Instances')
31
- expect(Pacto).to have_validated_service('DNS', 'List Domains')
32
- # Only a few SDKs have implemented monitoring
33
- # expect(Pacto).to have_validated_service('Cloud Monitoring', 'Get Account')
34
- expect(Pacto).to have_validated_service('Cloud Block Storage', 'List Volumes')
35
- expect(Pacto).to have_validated_service('Autoscale', 'List Groups')
36
- expect(Pacto).to have_validated_service('Cloud Queues', 'List Queues')
37
- expect(Pacto).to_not have_failed_validations
38
- # expect(Pacto).to_not have_unmatched_requests
39
- end
40
- end
@@ -1,48 +0,0 @@
1
- describe 'Cloud Files', :markdown =>
2
- """
3
- In this section we'll cover Cloud Files. We'll start with a few simple services. In the final example for this section, we will upload static assets to a CDN-enabled Cloud Files container that will be used by our sample application.
4
- """ do
5
- env = standard_env_vars
6
- file = build :file, env
7
- env.merge!(
8
- 'TEST_DIRECTORY' => file.directory.key,
9
- 'TEST_FILE' => file.key
10
- )
11
-
12
- vars = standard_env_vars
13
- code_sample "List Containers", """
14
- Use the SDK to list your existing cloud Cloud Files containers.
15
- """, vars, [] do |success|
16
- # Assertions
17
- expect(Pacto).to have_validated_service('Cloud Files', 'List Containers')
18
- expect(Pacto).to_not have_failed_validations
19
- expect(Pacto).to_not have_unmatched_requests
20
- end
21
-
22
- code_sample "Get object metadata", """
23
- Now, use the SDK to retrieve a file from Cloud Files.
24
- """, env, [] do
25
- expect(Pacto).to have_validated_service('Cloud Files', 'Get Object Metadata')
26
- # Not that we're validated it did *not* get the data
27
- expect(Pacto).to_not have_validated('Cloud Files', 'Get Object Data')
28
- end
29
-
30
- code_sample "Upload a single file", """
31
- Now, let's upload logo.png to Cloud Files so we can start building a website.
32
- """, env, [] do
33
- pending
34
- end
35
-
36
- code_sample "Upload static assets", """
37
- Finally, let's upload static assets (javascript, css, images, fonts) for a website.
38
- """, env, [] do
39
- pending
40
- end
41
-
42
- code_sample "Upload static assets", """
43
- Let's enable the CDN for our assets.
44
- """, env, [] do
45
- pending
46
- end
47
-
48
- end
@@ -1,19 +0,0 @@
1
- describe 'Cloud Servers', :markdown =>
2
- """
3
-
4
- Scenarios using [Next Generation Cloud Servers API V2](http://docs.rackspace.com/servers/api/v2/cs-devguide/content/ch_preface.html).
5
- """ do
6
- code_sample "Create Server", """
7
- [Create a Server](http://docs.rackspace.com/servers/api/v2/cs-devguide/content/CreateServers.html)
8
- using the image and flavor, and region specified in the environment.
9
- """, standard_env_vars.merge({
10
- 'RAX_REGION' => 'DFW',
11
- 'SERVER1_IMAGE' => 'f70ed7c7-b42e-4d77-83d8-40fa29825b85',
12
- 'SERVER1_FLAVOR' => 'performance1-1'
13
- }), [] do |success|
14
- # Assertions
15
- expect(Pacto).to have_validated_service('Cloud Servers', 'Create Server')
16
- expect(Pacto).to_not have_failed_validations
17
- expect(Pacto).to_not have_unmatched_requests
18
- end
19
- end
@@ -1,46 +0,0 @@
1
- $:.unshift File.expand_path('../pacto', File.dirname(__FILE__))
2
- require 'polytrix/rspec'
3
- require 'webmock/rspec'
4
- require 'matrix_formatter'
5
- require 'helpers/pacto_helper'
6
- require 'pacto/extensions/matchers'
7
- require 'pacto/extensions/loaders/simple_loader'
8
- require 'pacto/extensions/loaders/api_blueprint_loader'
9
- require 'helpers/teardown_helper'
10
- require 'helpers/cloudfiles_helper'
11
-
12
- SDKs = Dir['sdks/*'].map{|sdk| File.basename sdk}
13
-
14
- Polytrix.implementors = SDKs.map{ |sdk|
15
- Polytrix::Implementor.new :name => sdk #, :language => lang
16
- }
17
-
18
- require 'polytrix/runners/middleware/pacto'
19
- Polytrix.configure do |c|
20
- c.middleware.insert 0, Polytrix::Runners::Middleware::Pacto, {}
21
- end
22
-
23
- RSpec.configure do |c|
24
- c.matrix_implementors = SDKs
25
- c.treat_symbols_as_metadata_keys_with_true_values = true
26
- c.include Polytrix::RSpec::Helper
27
- end
28
-
29
- def standard_env_vars
30
- @standard_env_vars ||= {
31
- 'RAX_USERNAME' => ENV['RAX_USERNAME'],
32
- 'RAX_API_KEY' => ENV['RAX_API_KEY'],
33
- 'RAX_REGION' => 'ORD', # FIXME: stubbing multiple hosts
34
- # 'RAX_REGION' => ENV['RAX_REGION'] || %w{DFW ORD IAD SYD HKG}.sample, # omitted LON since it requires UK account
35
- 'RAX_AUTH_URL' => PACTO_SERVER || 'https://identity.api.rackspacecloud.com'
36
- }
37
- end
38
-
39
- def redact(data)
40
- Hash[data.map do |k,v|
41
- if k =~ /password|api_key/i
42
- v = '******'
43
- end
44
- [k, v]
45
- end]
46
- end
@@ -1,31 +0,0 @@
1
- require 'fog'
2
-
3
- def build type, env = {}
4
- case type
5
- when :file
6
- build_file env
7
- else
8
- raise ArgumentError.new "Don't know how to be a #{type}"
9
- end
10
- end
11
-
12
- def build_file env
13
- without_webmock do
14
- service = Fog::Storage.new({
15
- :provider => 'rackspace',
16
- :rackspace_username => env['RAX_USERNAME'],
17
- :rackspace_api_key => env['RAX_API_KEY'],
18
- :rackspace_region => env['RAX_REGION']
19
- })
20
-
21
- directory = service.directories.create :key => 'asdf'
22
- file = directory.files.create :key => 'asdf', :body => 'efgh'
23
- end
24
- end
25
-
26
- def without_webmock
27
- WebMock.disable!
28
- ret_val = yield
29
- WebMock.enable!
30
- ret_val
31
- end
@@ -1,33 +0,0 @@
1
- require 'pacto'
2
- require 'pacto/rspec'
3
- require 'pacto_server'
4
- require 'goliath/test_helper'
5
-
6
- def test_env_number
7
- ENV['TEST_ENV_NUMBER'].to_i
8
- end
9
-
10
- def pacto_port
11
- @pacto_port ||= 9900 + test_env_number
12
- end
13
-
14
- COVERAGE_FILE = "reports/api_coverage#{test_env_number}.yaml"
15
- PACTO_SERVER = "http://identity.api.rackspacecloud.dev:#{pacto_port}" unless ENV['NO_PACTO']
16
-
17
- RSpec.configure do |c|
18
- c.include Goliath::TestHelper
19
- c.before(:each) { Pacto.clear! }
20
- c.after(:each) { save_coverage }
21
- end
22
-
23
- def generate?
24
- ENV['PACTO_GENERATE'] == 'true'
25
- end
26
-
27
- def save_coverage
28
- data = YAML::load(File.read(COVERAGE_FILE)) if File.exists?(COVERAGE_FILE)
29
- data ||= {}
30
- validations = Pacto::ValidationRegistry.instance.validations
31
- data[example.full_description] = validations.reject{|v| v.contract.nil?}.map{|v| v.contract.name }
32
- File.open(COVERAGE_FILE, 'w') {|f| f.write data.to_yaml }
33
- end
@@ -1,49 +0,0 @@
1
- RSpec.configure do |c|
2
- c.after(:each) { auto_teardown }
3
- end
4
-
5
- def auth_token
6
- @auth_token ||= Pacto::ValidationRegistry.instance.validations.map do | val |
7
- token = val.request.headers['X-Auth-Token']
8
- end.compact.reject(&:empty?).first
9
- end
10
-
11
- def auto_teardown
12
- # HACK: This should be simplified and moved to Pacto
13
-
14
- created_resources = auto_find_prg
15
- auto_delete created_resources, auth_token
16
- end
17
-
18
- REDIRECTS = [201, 202, (300...400).to_a.flatten]
19
-
20
- def auto_find_prg
21
- # Find URLs that were the "Get" part of a Post-Redirect-Get pattern
22
- created_uris = Pacto::ValidationRegistry.instance.validations.map {|validation|
23
- validation.response.headers['Location'] if validation.request.method == :post and REDIRECTS.include? validation.response.status
24
- }.compact
25
-
26
- created_uris.map do | created_uri |
27
- Addressable::URI.parse created_uri
28
- end
29
- end
30
-
31
- def auto_delete uris, auth_token
32
- uris.group_by(&:site).each do | site, uris |
33
- connection = Excon.new(site)
34
- uris.each do | uri |
35
- puts "Removing #{uri}"
36
- connection.delete(:path => uri.path,
37
- :debug_request => true,
38
- :debug_response => true,
39
- :expects => [204],
40
- :headers => {
41
- "User-Agent" => "fog/1.18.0",
42
- "Content-Type" => "application/json",
43
- "Accept" => "application/json",
44
- "X-Auth-Token" => auth_token
45
- }
46
- )
47
- end
48
- end
49
- end
@@ -1,63 +0,0 @@
1
- require 'multi_json'
2
- require 'yaml'
3
- require 'jsonpath'
4
- require 'pacto'
5
-
6
- module Pacto
7
- module Extensions
8
- module Loaders
9
- class APIBlueprintLoader < YamlOrJsonLoader
10
- def self.load(file)
11
- data = super
12
- contracts = []
13
- resources = JsonPath.on(data, '$..resources[(@.uriTemplate)]')
14
- resources.each do |resource|
15
- resource['actions'].each do |action|
16
- contract = load_action(action, resource, file)
17
- Pacto.contract_registry.register(contract)
18
- contracts << contract
19
- end
20
- end
21
- Pacto::ContractList.new contracts
22
- end
23
-
24
- private
25
-
26
- def self.load_action(action, resource, file)
27
- # contract_definition = File.read(contract_path)
28
- # definition = JSON.parse(contract_definition)
29
- # schema.validate definition
30
- # request = RequestClause.new(host, definition['request'])
31
- # response = ResponseClause.new(definition['response'])
32
- # Contract.new(request, response, contract_path, definition['name'])
33
-
34
- # FIXME: Host info not available in blueprint.
35
- host = 'http://localhost'
36
- request_clause = RequestClause.new(host, {
37
- 'method' => action['method'],
38
- 'headers' => [], #not supporting this yet, probably needs conversion
39
- 'path' => resource['uriTemplate']
40
- })
41
- response = action['examples'].first['responses'].first
42
- response_clause = ResponseClause.new({
43
- 'status' => response['name'],
44
- 'headers' => [], #not supporting this yet, probably needs conversion
45
- 'body' => schema_from(response)
46
- })
47
- Contract.new(request_clause, response_clause, file, resource['name'])
48
- end
49
-
50
- def self.schema_from(response)
51
- schema = response['schema']
52
- if schema.nil? or schema.empty?
53
- {}
54
- else
55
- MultiJson.load schema
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
62
-
63
- # contracts = Pacto::Extensions::Loaders::APIBlueprintLoader.load('pacto/blueprints/otter.json')
@@ -1,55 +0,0 @@
1
- require 'multi_json'
2
- require 'yaml'
3
- require 'pacto'
4
- require_relative 'yaml_or_json_loader'
5
-
6
- class Pacto::Extensions::Loaders::URIMapLoader < Pacto::Extensions::Loaders::YamlOrJsonLoader
7
- class << self
8
- include Pacto::Logger
9
-
10
- def load(file)
11
- data = super
12
- contracts = []
13
- data['services'].each do | group_name, service_group |
14
- service_group['servers'].each do | server |
15
- if service_group['services']
16
- service_group['services'].each_pair do | service_name, service_definition|
17
- contract = build_simple_contract service_definition, group_name, service_name, server, file
18
- Pacto.contract_registry.register(contract)
19
- contracts << contract
20
- end
21
- end
22
- end
23
- end
24
- Pacto::ContractList.new contracts
25
- end
26
-
27
- private
28
- def build_simple_contract service_definition, group_name, service_name, server, file
29
- service_signature = "#{service_definition['method'].upcase} #{service_definition['uriTemplate']}"
30
- logger.debug "Building contract for '#{service_signature}' as '#{group_name} - #{service_name}' on #{server}"
31
- # FIXME: What about scheme?
32
- host = "https://#{server}"
33
- request_clause = Pacto::RequestClause.new(host, {
34
- 'method' => service_definition['method'],
35
- 'headers' => [], #not supporting this yet, probably needs conversion
36
- 'path' => convert_template(service_definition['uriTemplate']),
37
- 'body' => service_definition['requestSchema'] || {}
38
- })
39
- response_clause = Pacto::ResponseClause.new({
40
- 'status' => service_definition['responseStatusCode'] || 200,
41
- 'headers' => [], #not supporting this yet, probably needs conversion
42
- 'body' => service_definition['responseSchema'] || {}
43
- })
44
- Pacto::Contract.new(request_clause, response_clause, file, service_name)
45
- end
46
-
47
- def convert_template path
48
- Addressable::Template.new(path) if path
49
- # path.gsub(/{(\w+)}/, ':\1') if path
50
- end
51
- end
52
- end
53
-
54
- # Pacto.configuration.strict_matchers = false
55
- # contracts = Pacto::Extensions::Loaders::URIMapLoader.load('pacto/rackspace_uri_map.yaml')
@@ -1,17 +0,0 @@
1
- module Pacto
2
- module Extensions
3
- module Loaders
4
- class YamlOrJsonLoader
5
- YAML_EXTENSIONS = %w{.yml .yaml}
6
- def self.load(file)
7
- raw_data = File.read file
8
- if YAML_EXTENSIONS.include? File.extname(file)
9
- YAML::load(raw_data)
10
- else
11
- MultiJson.load(raw_data)
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,38 +0,0 @@
1
- RSpec::Matchers.define :have_validated_service do |group_name, service_name|
2
- @requested_name = service_name
3
- @contract = Pacto.contract_registry.find{ |c| c.name == @requested_name }
4
- match do
5
- unless @contract.nil?
6
- @validations = Pacto::ValidationRegistry.instance.validations.select {|v|
7
- # FIXME: Same contract on multiple servers is currently problematic
8
- v.contract && v.contract.name == @contract.name
9
- }
10
- !(@validations.empty? || @validations.map(&:successful?).include?(false))
11
- end
12
- end
13
-
14
- failure_message_for_should do
15
- buffer = StringIO.new
16
- buffer.puts "expected Pacto to have validated #{@requested_name}"
17
- if @contract.nil?
18
- buffer.puts ' but no known contract matches that name'
19
- elsif @validations.empty?
20
- buffer.puts ' but no request matched the pattern'
21
- buffer.puts " pattern: #{@contract.request_pattern}"
22
- buffer.puts ' received:'
23
- buffer.puts "#{WebMock::RequestRegistry.instance}"
24
- elsif @validations.map(&:successful?).include?(false)
25
- buffer.puts ' but validation errors were found:'
26
- buffer.print ' '
27
- validation_results = @validations.map(&:results).flatten.compact
28
- buffer.puts validation_results.join "\n "
29
- validation_results.each do |validation_result|
30
- buffer.puts " #{validation_result}"
31
- end
32
- else
33
- # FIXME: ensure this is unreachable?
34
- buffer.puts ' but an unknown problem occurred'
35
- end
36
- buffer.string
37
- end
38
- end
@@ -1,109 +0,0 @@
1
- require 'spec_helper'
2
- require 'yaml'
3
- require 'csv'
4
-
5
- class CSVFeatureMatrix
6
- def initialize(matrix_csv)
7
- @feature_matrix = []
8
-
9
- CSV.foreach(matrix_csv, :headers => :first_row) do |row|
10
-
11
- # Carry the product
12
- @product = row['Product'] if row['Product']
13
- row['Product'] ||= @product
14
-
15
- next if row['Feature'].nil? or row['Feature'].empty?
16
-
17
- # Normalize status
18
- SDKs.each do |sdk|
19
- row[sdk] = '' unless row[sdk] == 'Done'
20
- end
21
-
22
- @feature_matrix << row.to_hash
23
- end
24
- end
25
-
26
- def products
27
- @feature_matrix.map{|f| f['Product']}.uniq.compact
28
- end
29
-
30
- def features(product)
31
- @feature_matrix.select{|f| f['Product'] == product}.map{|f| f['Feature']}.compact
32
- end
33
-
34
- def implementers product, service_name
35
- code_sample = @feature_matrix.find{|f| f['Feature'] == service_name}
36
- feature.keys.select{|k| feature[k] == 'Done'}
37
- end
38
- end
39
-
40
- class CoveredFeatures
41
- def initialize(coverage_files)
42
- @coverage = {}
43
- @covered_features = {}
44
- [*coverage_files].each do |file|
45
- @coverage.merge! YAML::load(File.read(file))
46
- end
47
- @coverage.values.flatten.uniq do |covered_feature|
48
- @covered_features[covered_feature] = SDKs.select{|sdk|
49
- @coverage.select{|k,v| k =~ /#{sdk}$/}.values.flatten.include? covered_feature
50
- }
51
- end
52
- end
53
-
54
- def coverers(product, feature)
55
- @covered_features[feature] || []
56
- end
57
- end
58
-
59
- sdk_coverage = CoveredFeatures.new(Dir['reports/api_coverage*.yaml'])
60
- original_feature_matrix = CSVFeatureMatrix.new 'original_feature_matrix.csv'
61
-
62
- original_feature_matrix.products.each do |product|
63
- describe product do
64
- original_feature_matrix.features(product).each do |feature|
65
- describe feature do
66
- coverers = sdk_coverage.coverers(product, feature)
67
- implementers = original_feature_matrix.implementers(product,feature)
68
- SDKs.each do |sdk|
69
- it sdk, sdk.to_sym do
70
- if coverers.include? sdk
71
- # pass
72
- else
73
- if implementers.include? sdk
74
- pending
75
- else
76
- fail
77
- end
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
85
-
86
- # data = YAML::load(File.read('pacto/rackspace_uri_map.yaml'))
87
- # data['services'].each do |service_group_name, service_group|
88
- # describe service_group_name do
89
- # services = service_group['services'] || []
90
- # services.each do |service_name, service|
91
- # describe service_name do
92
- # SDKs.each do |sdk|
93
- # it sdk, sdk.to_sym do
94
- # sdk_coverage = coverage.select{|k,v| k =~ /#{sdk}$/ }
95
- # if sdk_coverage.values.flatten.include? service_name
96
- # # pass
97
- # else
98
- # if original_feature_matrix.implemented? service_name, sdk
99
- # pending
100
- # else
101
- # fail
102
- # end
103
- # end
104
- # end
105
- # end
106
- # end
107
- # end
108
- # end
109
- # end
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
- require 'yaml'
3
-
4
- data = YAML::load(File.read('pacto/rackspace_uri_map.yaml'))
5
- data['services'].each do |service_group_name, service_group|
6
- describe service_group_name do
7
- services = service_group['services'] || []
8
- services.each do |service_name, service|
9
- code_sample service_name, '', standard_env_vars, [] do
10
- end
11
- end
12
- end
13
- end
14
-
@@ -1,6 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <body>
4
- <h1>Hello, World!</h1>
5
- </body>
6
- </html>
@@ -1,16 +0,0 @@
1
- module Polytrix
2
- class ChallengeBuilder
3
- include Polytrix::Core::FileFinder
4
-
5
- def initialize(implementor)
6
- @implementor = implementor
7
- end
8
-
9
- def build(challenge_data)
10
- challenge_data[:source_file] ||= find_file @implementor.basedir, challenge_data[:name]
11
- challenge_data[:basedir] ||= @implementor.basedir
12
- challenge_data[:implementor] ||= @implementor.name
13
- Challenge.new challenge_data
14
- end
15
- end
16
- end