r10k 1.4.2 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (244) hide show
  1. data/.travis.yml +2 -0
  2. data/CHANGELOG.mkd +192 -0
  3. data/CONTRIBUTING.mkd +3 -3
  4. data/Gemfile +4 -0
  5. data/README.mkd +13 -6
  6. data/doc/dynamic-environments/configuration.mkd +77 -8
  7. data/doc/dynamic-environments/git-environments.mkd +12 -2
  8. data/doc/dynamic-environments/quickstart.mkd +6 -0
  9. data/doc/faq.mkd +6 -6
  10. data/doc/git/cloning-and-mirroring.mkd +60 -0
  11. data/doc/git/providers.mkd +68 -0
  12. data/integration/Gemfile +3 -0
  13. data/integration/README.mkd +29 -0
  14. data/integration/configs/README.mkd +7 -0
  15. data/integration/configs/pe/centos-6-64mda +25 -0
  16. data/integration/configs/pe/centos-7-64mda +25 -0
  17. data/integration/configs/pe/debian-6-64mda +25 -0
  18. data/integration/configs/pe/debian-7-64mda +25 -0
  19. data/integration/configs/pe/redhat-6-64mda +25 -0
  20. data/integration/configs/pe/redhat-7-64mda +25 -0
  21. data/integration/configs/pe/sles-11-64mda +25 -0
  22. data/integration/configs/pe/ubuntu-1004-64mda +25 -0
  23. data/integration/configs/pe/ubuntu-1204-64mda +25 -0
  24. data/integration/configs/pe/ubuntu-1404-64mda +25 -0
  25. data/integration/files/README.mkd +4 -0
  26. data/integration/files/hiera.yaml +8 -0
  27. data/integration/files/modules/helloworld/manifests/init.pp +3 -0
  28. data/integration/files/modules/hieratest/manifests/init.pp +3 -0
  29. data/integration/files/modules/unicode/files/pretend_unicode +1 -0
  30. data/integration/files/modules/unicode/manifests/init.pp +6 -0
  31. data/integration/files/pre-suite/prod_env.config +3 -0
  32. data/integration/files/r10k_conf.yaml.erb +9 -0
  33. data/integration/lib/README.mkd +4 -0
  34. data/integration/lib/git_utils.rb +205 -0
  35. data/integration/lib/master_manipulator.rb +205 -0
  36. data/integration/lib/r10k_utils.rb +166 -0
  37. data/integration/manifests/README.mkd +4 -0
  38. data/integration/pre-suite/00_pe_install.rb +4 -0
  39. data/integration/pre-suite/01_git_config.rb +59 -0
  40. data/integration/pre-suite/02_pe_r10k.rb +60 -0
  41. data/integration/pre-suite/03_test_utils.rb +17 -0
  42. data/integration/pre-suite/README.mkd +5 -0
  43. data/integration/test_run_scripts/README.mkd +5 -0
  44. data/integration/test_run_scripts/all_tests-rugged-pe-centos6.sh +20 -0
  45. data/integration/test_run_scripts/all_tests-rugged-pe-rhel7.sh +20 -0
  46. data/integration/test_run_scripts/all_tests-rugged-pe-sles11.sh +20 -0
  47. data/integration/test_run_scripts/all_tests-rugged-pe-ubuntu1204.sh +20 -0
  48. data/integration/test_run_scripts/all_tests-rugged-pe-ubuntu1404.sh +20 -0
  49. data/integration/test_run_scripts/all_tests-shellgit-pe-centos6.sh +20 -0
  50. data/integration/test_run_scripts/all_tests-shellgit-pe-rhel7.sh +20 -0
  51. data/integration/test_run_scripts/all_tests-shellgit-pe-sles11.sh +20 -0
  52. data/integration/test_run_scripts/all_tests-shellgit-pe-ubuntu1204.sh +20 -0
  53. data/integration/test_run_scripts/all_tests-shellgit-pe-ubuntu1404.sh +20 -0
  54. data/integration/test_run_scripts/basic_functionality/all_tests-pe-centos6.sh +20 -0
  55. data/integration/test_run_scripts/command_line/all_tests-pe-centos6.sh +20 -0
  56. data/integration/test_run_scripts/git_source/all_tests-pe-centos6.sh +20 -0
  57. data/integration/test_run_scripts/user_scenario/basic_workflow/all_tests-pe-centos6.sh +20 -0
  58. data/integration/test_run_scripts/user_scenario/complex_workflow/all_tests-pe-centos6.sh +20 -0
  59. data/integration/tests/README.mkd +4 -0
  60. data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +46 -0
  61. data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +27 -0
  62. data/integration/tests/command_line/deploy_env_without_mod_update.rb +75 -0
  63. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +76 -0
  64. data/integration/tests/command_line/negative/neg_invalid_cli_dep_flag.rb +22 -0
  65. data/integration/tests/command_line/negative/neg_invalid_cli_env_flag.rb +22 -0
  66. data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +24 -0
  67. data/integration/tests/git_source/git_source_git.rb +123 -0
  68. data/integration/tests/git_source/git_source_ssh.rb +84 -0
  69. data/integration/tests/git_source/git_source_submodule.rb +69 -0
  70. data/integration/tests/git_source/negative/neg_git_broken_remote.rb +37 -0
  71. data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +45 -0
  72. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +72 -0
  73. data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +34 -0
  74. data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
  75. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +110 -0
  76. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +113 -0
  77. data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +93 -0
  78. data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +132 -0
  79. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +160 -0
  80. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +45 -0
  81. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +43 -0
  82. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +40 -0
  83. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +42 -0
  84. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +44 -0
  85. data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +63 -0
  86. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +73 -0
  87. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +45 -0
  88. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +51 -0
  89. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +33 -0
  90. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +35 -0
  91. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +44 -0
  92. data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +57 -0
  93. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +44 -0
  94. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +73 -0
  95. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +103 -0
  96. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +80 -0
  97. data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +48 -0
  98. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +73 -0
  99. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +81 -0
  100. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +67 -0
  101. data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +93 -0
  102. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +92 -0
  103. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +116 -0
  104. data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +59 -0
  105. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +165 -0
  106. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +162 -0
  107. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +110 -0
  108. data/lib/r10k/action/cri_runner.rb +10 -13
  109. data/lib/r10k/cli.rb +3 -8
  110. data/lib/r10k/cli/version.rb +10 -1
  111. data/lib/r10k/deployment/config.rb +26 -6
  112. data/lib/r10k/deployment/config/loader.rb +38 -29
  113. data/lib/r10k/deployment/source.rb +2 -4
  114. data/lib/r10k/environment/git.rb +10 -19
  115. data/lib/r10k/environment/name.rb +86 -0
  116. data/lib/r10k/errors.rb +8 -5
  117. data/lib/r10k/feature.rb +35 -0
  118. data/lib/r10k/feature/collection.rb +23 -0
  119. data/lib/r10k/features.rb +18 -0
  120. data/lib/r10k/git.rb +106 -12
  121. data/lib/r10k/git/alternates.rb +2 -2
  122. data/lib/r10k/git/cache.rb +43 -26
  123. data/lib/r10k/git/errors.rb +12 -6
  124. data/lib/r10k/git/head.rb +3 -0
  125. data/lib/r10k/git/ref.rb +3 -0
  126. data/lib/r10k/git/remote_head.rb +6 -0
  127. data/lib/r10k/git/repository.rb +6 -0
  128. data/lib/r10k/git/rugged.rb +17 -0
  129. data/lib/r10k/git/rugged/bare_repository.rb +86 -0
  130. data/lib/r10k/git/rugged/base_repository.rb +90 -0
  131. data/lib/r10k/git/rugged/cache.rb +11 -0
  132. data/lib/r10k/git/rugged/thin_repository.rb +72 -0
  133. data/lib/r10k/git/rugged/working_repository.rb +99 -0
  134. data/lib/r10k/git/shellgit.rb +9 -0
  135. data/lib/r10k/git/shellgit/bare_repository.rb +29 -0
  136. data/lib/r10k/git/shellgit/base_repository.rb +102 -0
  137. data/lib/r10k/git/shellgit/cache.rb +11 -0
  138. data/lib/r10k/git/shellgit/thin_repository.rb +56 -0
  139. data/lib/r10k/git/shellgit/working_repository.rb +73 -0
  140. data/lib/r10k/git/stateful_repository.rb +80 -0
  141. data/lib/r10k/git/tag.rb +3 -0
  142. data/lib/r10k/git/working_dir.rb +15 -2
  143. data/lib/r10k/logging.rb +73 -36
  144. data/lib/r10k/logging/terminaloutputter.rb +36 -0
  145. data/lib/r10k/module/forge.rb +10 -9
  146. data/lib/r10k/module/git.rb +14 -44
  147. data/lib/r10k/module/metadata_file.rb +31 -0
  148. data/lib/r10k/module/svn.rb +0 -1
  149. data/lib/r10k/module_repository/forge.rb +20 -7
  150. data/lib/r10k/puppetfile.rb +1 -1
  151. data/lib/r10k/settings/container.rb +6 -0
  152. data/lib/r10k/settings/mixin.rb +9 -0
  153. data/lib/r10k/source.rb +2 -3
  154. data/lib/r10k/source/base.rb +5 -5
  155. data/lib/r10k/source/git.rb +11 -86
  156. data/lib/r10k/source/svn.rb +8 -52
  157. data/lib/r10k/util/basedir.rb +4 -4
  158. data/lib/r10k/util/commands.rb +31 -0
  159. data/lib/r10k/util/exec_env.rb +36 -0
  160. data/lib/r10k/util/platform.rb +4 -0
  161. data/lib/r10k/util/purgeable.rb +2 -2
  162. data/lib/r10k/util/subprocess.rb +3 -7
  163. data/lib/r10k/util/subprocess/runner.rb +3 -28
  164. data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
  165. data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
  166. data/lib/r10k/util/subprocess/{windows/runner.rb → runner/windows.rb} +2 -11
  167. data/lib/r10k/util/symbolize_keys.rb +31 -0
  168. data/lib/r10k/version.rb +1 -1
  169. data/lib/shared/puppet/module_tool/metadata.rb +197 -0
  170. data/r10k.gemspec +7 -5
  171. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  172. data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
  173. data/spec/fixtures/unit/util/subprocess/posix/runner/no-execute.sh +3 -0
  174. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/and_the_expected_version_is_latest/can_fetch_all_versions_of_a_given_module.yml +171 -26
  175. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/and_the_expected_version_is_latest/can_fetch_the_latest_version_of_a_given_module.yml +171 -26
  176. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/and_the_expected_version_is_latest/ignores_deleted_releases.yml +190 -0
  177. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/it_handles_errors_from_forgeapi_puppetlabs_com/raises_an_error_for_a_non-existant_module.yml +34 -0
  178. data/spec/fixtures/vcr/cassettes/R10K_Module_Forge/and_the_expected_version_is_latest/sets_the_expected_version_based_on_the_latest_forge_version.yml +87 -26
  179. data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
  180. data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
  181. data/spec/integration/git/rugged/working_repository_spec.rb +13 -0
  182. data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
  183. data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
  184. data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
  185. data/spec/integration/git/stateful_repository_spec.rb +104 -0
  186. data/spec/matchers/match_realpath.rb +18 -0
  187. data/spec/shared-contexts/git-fixtures.rb +55 -0
  188. data/spec/shared-examples/git-repository.rb +38 -0
  189. data/spec/shared-examples/git/bare_repository.rb +70 -0
  190. data/spec/shared-examples/git/thin_repository.rb +26 -0
  191. data/spec/shared-examples/git/working_repository.rb +115 -0
  192. data/spec/shared-examples/subprocess-runner.rb +83 -0
  193. data/spec/spec_helper.rb +13 -9
  194. data/spec/unit/action/cri_runner_spec.rb +0 -6
  195. data/spec/unit/action/puppetfile/{cri_action_spec.rb → cri_runner_spec.rb} +0 -0
  196. data/spec/unit/deployment/config/loader_spec.rb +48 -0
  197. data/spec/unit/deployment/config_spec.rb +49 -0
  198. data/spec/unit/environment/git_spec.rb +5 -39
  199. data/spec/unit/environment/name_spec.rb +135 -0
  200. data/spec/unit/feature_spec.rb +50 -0
  201. data/spec/unit/git/alternates_spec.rb +1 -1
  202. data/spec/unit/git/cache_spec.rb +32 -19
  203. data/spec/unit/git/commit_spec.rb +1 -0
  204. data/spec/unit/git/head_spec.rb +1 -6
  205. data/spec/unit/git/ref_spec.rb +0 -23
  206. data/spec/unit/git/rugged/cache_spec.rb +26 -0
  207. data/spec/unit/git/shellgit/cache_spec.rb +27 -0
  208. data/spec/unit/git/stateful_repository_spec.rb +43 -0
  209. data/spec/unit/git/tag_spec.rb +1 -0
  210. data/spec/unit/git/working_dir_spec.rb +1 -0
  211. data/spec/unit/git_spec.rb +74 -0
  212. data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
  213. data/spec/unit/logging_spec.rb +68 -0
  214. data/spec/unit/module/forge_spec.rb +7 -38
  215. data/spec/unit/module/git_spec.rb +7 -38
  216. data/spec/unit/module/metadata_file_spec.rb +69 -0
  217. data/spec/unit/module/svn_spec.rb +0 -4
  218. data/spec/unit/module_repository/forge_spec.rb +22 -1
  219. data/spec/unit/puppet/module_tool/metadata_spec.rb +301 -0
  220. data/spec/unit/settings/container_spec.rb +17 -0
  221. data/spec/unit/source/git_spec.rb +0 -123
  222. data/spec/unit/source/svn_spec.rb +66 -0
  223. data/spec/unit/util/commands_spec.rb +61 -0
  224. data/spec/unit/util/exec_env_spec.rb +56 -0
  225. data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
  226. data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
  227. data/spec/unit/util/subprocess_spec.rb +3 -2
  228. data/spec/unit/util/symbolize_keys_spec.rb +51 -0
  229. metadata +226 -45
  230. data/lib/r10k/execution.rb +0 -47
  231. data/lib/r10k/module/metadata.rb +0 -47
  232. data/lib/r10k/util/core_ext/hash_ext.rb +0 -19
  233. data/lib/r10k/util/subprocess/io.rb +0 -7
  234. data/lib/r10k/util/subprocess/posix.rb +0 -4
  235. data/lib/r10k/util/subprocess/posix/io.rb +0 -7
  236. data/lib/r10k/util/subprocess/posix/runner.rb +0 -140
  237. data/lib/r10k/util/subprocess/windows.rb +0 -4
  238. data/lib/r10k/util/subprocess/windows/io.rb +0 -6
  239. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions.yml +0 -42
  240. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions/can_fetch_all_versions_of_a_given_module.yml +0 -42
  241. data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions/can_fetch_the_latest_version_of_a_given_module.yml +0 -42
  242. data/spec/unit/deployment/source_spec.rb +0 -24
  243. data/spec/unit/module/metadata_spec.rb +0 -68
  244. data/spec/unit/util/core_ext/hash_ext_spec.rb +0 -63
@@ -1,4 +1,5 @@
1
1
  require 'open3'
2
+ require 'r10k/util/subprocess/runner'
2
3
 
3
4
  # Run processes on Windows.
4
5
  #
@@ -6,11 +7,10 @@ require 'open3'
6
7
  # results. In contrast to the POSIX runner this cannot be used in an
7
8
  # asynchronous manner as-is; implementing that will probably mean launching a
8
9
  # thread and invoking #capture3 in that thread.
9
- class R10K::Util::Subprocess::Windows::Runner < R10K::Util::Subprocess::Runner
10
+ class R10K::Util::Subprocess::Runner::Windows < R10K::Util::Subprocess::Runner
10
11
 
11
12
  def initialize(argv)
12
13
  @argv = argv
13
- @io = R10K::Util::Subprocess::Windows::IO.new
14
14
  end
15
15
 
16
16
  def run
@@ -18,15 +18,6 @@ class R10K::Util::Subprocess::Windows::Runner < R10K::Util::Subprocess::Runner
18
18
 
19
19
  stdout, stderr, status = Open3.capture3(cmd)
20
20
 
21
- @status = status
22
21
  @result = R10K::Util::Subprocess::Result.new(@argv, stdout, stderr, status.exitstatus)
23
22
  end
24
-
25
- def exit_code
26
- @status.exitstatus
27
- end
28
-
29
- def crashed?
30
- exit_code != 0
31
- end
32
23
  end
@@ -0,0 +1,31 @@
1
+ module R10K
2
+ module Util
3
+ module SymbolizeKeys
4
+ module_function
5
+
6
+ # Convert all String keys to Symbol keys
7
+ #
8
+ # @param hash [Hash] The data structure to convert
9
+ # @param recurse [Boolean] Whether to recursively symbolize keys in nested
10
+ # hash values. Defaults to false.
11
+ # @raise [TypeError] If a String key collides with an existing Symbol key
12
+ # @return [void]
13
+ def symbolize_keys!(hash, recurse = false)
14
+ hash.keys.each do |key|
15
+ if key.is_a?(String)
16
+ if hash.key?(key.to_sym)
17
+ raise TypeError, "An existing interned key for #{key} exists, cannot overwrite"
18
+ end
19
+ hash[key.to_sym] = hash.delete(key)
20
+ key = key.to_sym
21
+ end
22
+
23
+ value = hash[key]
24
+ if recurse && value.is_a?(Hash)
25
+ symbolize_keys!(value, true)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module R10K
2
- VERSION = '1.4.2'
2
+ VERSION = '1.5.1'
3
3
  end
@@ -0,0 +1,197 @@
1
+ require 'uri'
2
+ require 'json'
3
+ require 'set'
4
+ require 'semantic_puppet/version'
5
+
6
+ module Puppet
7
+ module ModuleTool
8
+
9
+ # This class provides a data structure representing a module's metadata.
10
+ # @api private
11
+ class Metadata
12
+
13
+ attr_accessor :module_name
14
+
15
+ DEFAULTS = {
16
+ 'name' => nil,
17
+ 'version' => nil,
18
+ 'author' => nil,
19
+ 'summary' => nil,
20
+ 'license' => 'Apache-2.0',
21
+ 'source' => '',
22
+ 'project_page' => nil,
23
+ 'issues_url' => nil,
24
+ 'dependencies' => Set.new.freeze,
25
+ }
26
+
27
+ def initialize
28
+ @data = DEFAULTS.dup
29
+ @data['dependencies'] = @data['dependencies'].dup
30
+ end
31
+
32
+ # Returns a filesystem-friendly version of this module name.
33
+ def dashed_name
34
+ @data['name'].tr('/', '-') if @data['name']
35
+ end
36
+
37
+ # Returns a string that uniquely represents this version of this module.
38
+ def release_name
39
+ return nil unless @data['name'] && @data['version']
40
+ [ dashed_name, @data['version'] ].join('-')
41
+ end
42
+
43
+ alias :name :module_name
44
+ alias :full_module_name :dashed_name
45
+
46
+ # Merges the current set of metadata with another metadata hash. This
47
+ # method also handles the validation of module names and versions, in an
48
+ # effort to be proactive about module publishing constraints.
49
+ def update(data, with_dependencies = true)
50
+ process_name(data) if data['name']
51
+ process_version(data) if data['version']
52
+ process_source(data) if data['source']
53
+ merge_dependencies(data) if with_dependencies && data['dependencies']
54
+
55
+ @data.merge!(data)
56
+ return self
57
+ end
58
+
59
+ # Validates the name and version_requirement for a dependency, then creates
60
+ # the Dependency and adds it.
61
+ # Returns the Dependency that was added.
62
+ def add_dependency(name, version_requirement=nil, repository=nil)
63
+ validate_name(name)
64
+ validate_version_range(version_requirement) if version_requirement
65
+
66
+ if dup = @data['dependencies'].find { |d| d.full_module_name == name && d.version_requirement != version_requirement }
67
+ raise ArgumentError, "Dependency conflict for #{full_module_name}: Dependency #{name} was given conflicting version requirements #{version_requirement} and #{dup.version_requirement}. Verify that there are no duplicates in the metadata.json or the Modulefile."
68
+ end
69
+
70
+ dep = Dependency.new(name, version_requirement, repository)
71
+ @data['dependencies'].add(dep)
72
+
73
+ dep
74
+ end
75
+
76
+ # Provides an accessor for the now defunct 'description' property. This
77
+ # addresses a regression in Puppet 3.6.x where previously valid templates
78
+ # refering to the 'description' property were broken.
79
+ # @deprecated
80
+ def description
81
+ @data['description']
82
+ end
83
+
84
+ def dependencies
85
+ @data['dependencies'].to_a
86
+ end
87
+
88
+ # Returns a hash of the module's metadata. Used by Puppet's automated
89
+ # serialization routines.
90
+ #
91
+ # @see Puppet::Network::FormatSupport#to_data_hash
92
+ def to_hash
93
+ @data
94
+ end
95
+ alias :to_data_hash :to_hash
96
+
97
+ def to_json
98
+ data = @data.dup.merge('dependencies' => dependencies)
99
+
100
+ contents = data.keys.map do |k|
101
+ value = (JSON.pretty_generate(data[k]) rescue data[k].to_json)
102
+ "#{k.to_json}: #{value}"
103
+ end
104
+
105
+ "{\n" + contents.join(",\n").gsub(/^/, ' ') + "\n}\n"
106
+ end
107
+
108
+ # Expose any metadata keys as callable reader methods.
109
+ def method_missing(name, *args)
110
+ return @data[name.to_s] if @data.key? name.to_s
111
+ super
112
+ end
113
+
114
+ private
115
+
116
+ # Do basic validation and parsing of the name parameter.
117
+ def process_name(data)
118
+ validate_name(data['name'])
119
+ author, @module_name = data['name'].split(/[-\/]/, 2)
120
+
121
+ data['author'] ||= author if @data['author'] == DEFAULTS['author']
122
+ end
123
+
124
+ # Do basic validation on the version parameter.
125
+ def process_version(data)
126
+ validate_version(data['version'])
127
+ end
128
+
129
+ # Do basic parsing of the source parameter. If the source is hosted on
130
+ # GitHub, we can predict sensible defaults for both project_page and
131
+ # issues_url.
132
+ def process_source(data)
133
+ if data['source'] =~ %r[://]
134
+ source_uri = URI.parse(data['source'])
135
+ else
136
+ source_uri = URI.parse("http://#{data['source']}")
137
+ end
138
+
139
+ if source_uri.host =~ /^(www\.)?github\.com$/
140
+ source_uri.scheme = 'https'
141
+ source_uri.path.sub!(/\.git$/, '')
142
+ data['project_page'] ||= @data['project_page'] || source_uri.to_s
143
+ data['issues_url'] ||= @data['issues_url'] || source_uri.to_s.sub(/\/*$/, '') + '/issues'
144
+ end
145
+
146
+ rescue URI::Error
147
+ return
148
+ end
149
+
150
+ # Validates and parses the dependencies.
151
+ def merge_dependencies(data)
152
+ data['dependencies'].each do |dep|
153
+ add_dependency(dep['name'], dep['version_requirement'], dep['repository'])
154
+ end
155
+
156
+ # Clear dependencies so @data dependencies are not overwritten
157
+ data.delete 'dependencies'
158
+ end
159
+
160
+ # Validates that the given module name is both namespaced and well-formed.
161
+ def validate_name(name)
162
+ return if name =~ /\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z/i
163
+
164
+ namespace, modname = name.split(/[-\/]/, 2)
165
+ modname = :namespace_missing if namespace == ''
166
+
167
+ err = case modname
168
+ when nil, '', :namespace_missing
169
+ "the field must be a namespaced module name"
170
+ when /[^a-z0-9_]/i
171
+ "the module name contains non-alphanumeric (or underscore) characters"
172
+ when /^[^a-z]/i
173
+ "the module name must begin with a letter"
174
+ else
175
+ "the namespace contains non-alphanumeric characters"
176
+ end
177
+
178
+ raise ArgumentError, "Invalid 'name' field in metadata.json: #{err}"
179
+ end
180
+
181
+ # Validates that the version string can be parsed by SemanticPuppet.
182
+ def validate_version(version)
183
+ return if SemanticPuppet::Version.valid?(version)
184
+
185
+ err = "version string cannot be parsed as a valid Semantic Version"
186
+ raise ArgumentError, "Invalid 'version' field in metadata.json: #{err}"
187
+ end
188
+
189
+ # Validates that the version range can be parsed by SemanticPuppet.
190
+ def validate_version_range(version_range)
191
+ SemanticPuppet::VersionRange.parse(version_range)
192
+ rescue ArgumentError => e
193
+ raise ArgumentError, "Invalid 'version_range' field in metadata.json: #{e}"
194
+ end
195
+ end
196
+ end
197
+ end
@@ -23,19 +23,21 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency 'colored', '1.2'
24
24
  s.add_dependency 'cri', '~> 2.6.1'
25
25
 
26
- s.add_dependency 'systemu', '~> 2.5.2'
27
-
28
26
  s.add_dependency 'log4r', '1.1.10'
29
- s.add_dependency 'multi_json', '~> 1.8.2'
27
+ s.add_dependency 'multi_json', '~> 1.10'
30
28
  s.add_dependency 'json_pure', '~> 1.8'
31
29
 
32
- s.add_dependency 'faraday', '~> 0.8.8'
30
+ s.add_dependency 'faraday', '~> 0.9.0'
33
31
  s.add_dependency 'faraday_middleware', '~> 0.9.0'
34
- s.add_dependency 'faraday_middleware-multi_json', '~> 0.0.5'
32
+ s.add_dependency 'faraday_middleware-multi_json', '~> 0.0.6'
33
+
34
+ s.add_dependency 'semantic_puppet', '~> 0.1.0'
35
35
 
36
36
  s.add_development_dependency 'rspec', '~> 3.1'
37
37
  s.add_development_dependency 'vcr', '~> 2.9'
38
38
 
39
+ s.add_development_dependency 'minitar'
40
+
39
41
  s.add_development_dependency 'yard', '~> 0.8.7.3'
40
42
 
41
43
  s.files = %x[git ls-files].split($/)
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo "This was supposed to be non-executable..."
@@ -2,41 +2,186 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://forge.puppetlabs.com/api/v1/releases.json?module=adrien%2Fboolean
5
+ uri: https://forgeapi.puppetlabs.com/v3/modules/adrien-boolean
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
10
  User-Agent:
11
- - Faraday v0.8.8
11
+ - Faraday v0.8.9
12
12
  response:
13
13
  status:
14
14
  code: 200
15
15
  message:
16
16
  headers:
17
- server:
18
- - nginx
19
- date:
20
- - Tue, 31 Dec 2013 02:53:38 GMT
21
- content-type:
22
- - application/json
23
- content-length:
24
- - '432'
25
- connection:
26
- - close
27
- status:
28
- - 200 OK
29
- x-frame-options:
30
- - sameorigin
31
- x-xss-protection:
32
- - 1; mode=block
33
- x-node:
34
- - forgeweb04
35
- x-revision:
36
- - b288c1e7e86f82eef7692085670c78693062c84d
17
+ !binary "c2VydmVy":
18
+ - !binary |-
19
+ bmdpbng=
20
+ !binary "ZGF0ZQ==":
21
+ - !binary |-
22
+ TW9uLCAwMiBNYXIgMjAxNSAxOTo1OTowMiBHTVQ=
23
+ !binary "Y29udGVudC10eXBl":
24
+ - !binary |-
25
+ YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04
26
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
27
+ - !binary |-
28
+ Y2h1bmtlZA==
29
+ !binary "Y29ubmVjdGlvbg==":
30
+ - !binary |-
31
+ Y2xvc2U=
32
+ !binary "c3RhdHVz":
33
+ - !binary |-
34
+ MjAwIE9L
35
+ !binary "Y2FjaGUtY29udHJvbA==":
36
+ - !binary |-
37
+ cHVibGljLCBtdXN0LXJldmFsaWRhdGU=
38
+ !binary "bGFzdC1tb2RpZmllZA==":
39
+ - !binary |-
40
+ TW9uLCAwMiBNYXIgMjAxNSAxNzoxODoxMSBHTVQ=
41
+ !binary "eC1ub2Rl":
42
+ - !binary |-
43
+ Zm9yZ2UtYXBwMDMtcHJvZA==
44
+ !binary "eC1yZXZpc2lvbg==":
45
+ - !binary |-
46
+ ODQ4NDQyZA==
47
+ !binary "eC1jb250ZW50LXR5cGUtb3B0aW9ucw==":
48
+ - !binary |-
49
+ bm9zbmlmZg==
50
+ !binary "dmFyeQ==":
51
+ - !binary |-
52
+ QWNjZXB0LUVuY29kaW5n
37
53
  body:
38
- encoding: US-ASCII
39
- string: ! '{"adrien/boolean":[{"file":"/system/releases/a/adrien/adrien-boolean-0.9.0-rc1.tar.gz","version":"0.9.0-rc1","dependencies":[]},{"file":"/system/releases/a/adrien/adrien-boolean-0.9.0.tar.gz","version":"0.9.0","dependencies":[]},{"file":"/system/releases/a/adrien/adrien-boolean-1.0.0.tar.gz","version":"1.0.0","dependencies":[]},{"file":"/system/releases/a/adrien/adrien-boolean-1.0.1.tar.gz","version":"1.0.1","dependencies":[]}]}'
54
+ encoding: ASCII-8BIT
55
+ string: !binary |-
56
+ ewogICJ1cmkiOiAiL3YzL21vZHVsZXMvYWRyaWVuLWJvb2xlYW4iLAogICJu
57
+ YW1lIjogImJvb2xlYW4iLAogICJkb3dubG9hZHMiOiAzMTU3NCwKICAiY3Jl
58
+ YXRlZF9hdCI6ICIyMDEyLTEyLTEzIDEwOjM5OjM0IC0wODAwIiwKICAidXBk
59
+ YXRlZF9hdCI6ICIyMDE1LTAzLTAyIDA5OjE4OjExIC0wODAwIiwKICAic3Vw
60
+ cG9ydGVkIjogZmFsc2UsCiAgImVuZG9yc2VtZW50IjogbnVsbCwKICAibW9k
61
+ dWxlX2dyb3VwIjogImJhc2UiLAogICJvd25lciI6IHsKICAgICJ1cmkiOiAi
62
+ L3YzL3VzZXJzL2FkcmllbiIsCiAgICAidXNlcm5hbWUiOiAiYWRyaWVuIiwK
63
+ ICAgICJncmF2YXRhcl9pZCI6ICI1ZDZlMTRjMzYwNDBkMTdlMGFlMjJmMjgx
64
+ Yjk5N2FkMiIKICB9LAogICJjdXJyZW50X3JlbGVhc2UiOiB7CiAgICAidXJp
65
+ IjogIi92My9yZWxlYXNlcy9hZHJpZW4tYm9vbGVhbi0xLjAuMSIsCiAgICAi
66
+ bW9kdWxlIjogewogICAgICAidXJpIjogIi92My9tb2R1bGVzL2Fkcmllbi1i
67
+ b29sZWFuIiwKICAgICAgIm5hbWUiOiAiYm9vbGVhbiIsCiAgICAgICJvd25l
68
+ ciI6IHsKICAgICAgICAidXJpIjogIi92My91c2Vycy9hZHJpZW4iLAogICAg
69
+ ICAgICJ1c2VybmFtZSI6ICJhZHJpZW4iLAogICAgICAgICJncmF2YXRhcl9p
70
+ ZCI6ICI1ZDZlMTRjMzYwNDBkMTdlMGFlMjJmMjgxYjk5N2FkMiIKICAgICAg
71
+ fQogICAgfSwKICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKICAgICJtZXRhZGF0
72
+ YSI6IHsKICAgICAgIm5hbWUiOiAiYWRyaWVuLWJvb2xlYW4iLAogICAgICAi
73
+ dmVyc2lvbiI6ICIxLjAuMSIsCiAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9n
74
+ aXRodWIuY29tL2FkcmllbnRoZWJvL3B1cHBldC1ib29sZWFuIiwKICAgICAg
75
+ ImF1dGhvciI6ICJBZHJpZW4gVGhlYm8gPGFkcmllbkBzb21ldGhpbmdzaW5p
76
+ c3RyYWwubmV0PiIsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZSAyLjAiLAog
77
+ ICAgICAic3VtbWFyeSI6ICJCb29sZWFuIG5vcm1hbGl6aW5nIHByb3BlcnR5
78
+ IGZvciBQdXBwZXQgdHlwZXMiLAogICAgICAiZGVzY3JpcHRpb24iOiAiRGVm
79
+ aW5lIHRydWUgYm9vbGVhbiBwcm9wZXJ0aWVzIGluIFB1cHBldCB0eXBlcywg
80
+ dGhhdCBjYW4gbm9ybWFsaXplXG5hbGwgcmVhc29uYWJsZSBib29sZWFuIHZh
81
+ bHVlcyB0byBSdWJ5IGJvb2xlYW4gdmFsdWVzLlxuIiwKICAgICAgInByb2pl
82
+ Y3RfcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYWRyaWVudGhlYm8vcHVw
83
+ cGV0LWJvb2xlYW4iLAogICAgICAiZGVwZW5kZW5jaWVzIjogWwoKICAgICAg
84
+ XSwKICAgICAgInR5cGVzIjogWwoKICAgICAgXSwKICAgICAgImNoZWNrc3Vt
85
+ cyI6IHsKICAgICAgICAiQ0hBTkdFTE9HIjogImVlNzlkZDk3OWJiZDY0NTUw
86
+ MzFhYzEwMzk3NzhmYzFkIiwKICAgICAgICAiTElDRU5TRSI6ICI4Y2JkNDRm
87
+ NGZmYmM4MTYzMmRmMjJmZGQ0YWU4NzgxMSIsCiAgICAgICAgIk1vZHVsZWZp
88
+ bGUiOiAiYTQ3NWNlOTYzMzI1NzI1ZTE2YWRjMjZlY2MzOGJhNTMiLAogICAg
89
+ ICAgICJSRUFETUUubWFya2Rvd24iOiAiNDM4YzBlMjhhNDI1ZmI2OWQwZGNi
90
+ NDllOGM1MTIyYzIiLAogICAgICAgICJsaWIvcHVwcGV0L3Byb3BlcnR5L2Jv
91
+ b2xlYW4ucmIiOiAiMDc5NTQ4ZmE1YzE2OGYzMDM1MzA0NzU1OTgyZTllYjAi
92
+ CiAgICAgIH0KICAgIH0sCiAgICAidGFncyI6IFsKICAgICAgImRldmVsb3Bl
93
+ ciIsCiAgICAgICJleHRlbnNpb24iLAogICAgICAiYm9vbGVhbiIsCiAgICAg
94
+ ICJwcm9wZXJ0eSIKICAgIF0sCiAgICAic3VwcG9ydGVkIjogZmFsc2UsCiAg
95
+ ICAidmFsaWRhdGlvbl9zY29yZSI6IDgyLAogICAgImZpbGVfdXJpIjogIi92
96
+ My9maWxlcy9hZHJpZW4tYm9vbGVhbi0xLjAuMS50YXIuZ3oiLAogICAgImZp
97
+ bGVfc2l6ZSI6IDI1ODAsCiAgICAiZmlsZV9tZDUiOiAiOTY0OTQyMTBlNDNi
98
+ ZGNkYjM1NjFiZDA1NjVmYmI0MWQiLAogICAgImRvd25sb2FkcyI6IDI5NDIx
99
+ LAogICAgInJlYWRtZSI6ICJwdXBwZXQtYm9vbGVhblxuPT09PT09PT09PT09
100
+ PT1cblxuRGVmaW5lIGFjdHVhbCBib29sZWFuIHByb3BlcnRpZXMgZm9yIHB1
101
+ cHBldCB0eXBlcy5cblxuU3lub3BzaXNcbi0tLS0tLS0tXG5cblB1cHBldCBo
102
+ YXMgbG9vc2VseSBkZWZpbmVkIGludGVybmFsIHR5cGVzIHdoaWNoIGNhbiBt
103
+ YWtlIG5vcm1hbGl6aW5nIGJvb2xlYW5cbnZhbHVlcyBpbiB0eXBlcyBhbmQg
104
+ cHJvdmlkZXJzIGRpZmZpY3VsdC4gVGhpcyBjdXN0b20gcHJvcGVydHkgaGFu
105
+ ZGxlcyB0aGF0XG5ub3JtYWxpemF0aW9uIGluIG9uZSBwbGFjZSBieSBkZWZp
106
+ bmluZyBhY3R1YWwgYm9vbGVhbiBzdGF0ZXMuXG5cbkV4YW1wbGVcbi0tLS0t
107
+ LS1cblxuKipUeXBlIGltcGxlbWVudGF0aW9uKio6XG5cbiAgICByZXF1aXJl
108
+ ICdwdXBwZXQvcHJvcGVydHkvYm9vbGVhbidcblxuICAgIFB1cHBldDo6VHlw
109
+ ZS5uZXd0eXBlKDphd2Vzb21lKSBkb1xuXG4gICAgICBuZXdwYXJhbSg6bmFt
110
+ ZSwgOm5hbWV2YXIgPT4gdHJ1ZSlcblxuICAgICAgbmV3cHJvcGVydHkoOmJl
111
+ dHRlcnRoYW5zbGljZWRicmVhZCwgOnBhcmVudCA9PiBQdXBwZXQ6OlByb3Bl
112
+ cnR5OjpCb29sZWFuKSBkb1xuICAgICAgICBkZXNjIFwiRGV0ZXJtaW5lIGlm
113
+ IHRoZSB0aGluZyBpcyBtb3JlIGF3ZXNvbWUgdGhhbiBzbGljZWQgYnJlYWRc
114
+ IlxuICAgICAgICBkZWZhdWx0dG8gdHJ1ZSAjIEl0J3Mgbm90IGhhcmQgdG8g
115
+ YmUgbW9yZSBhd2Vzb21lIHRoYW4gc2xpY2VkIGJyZWFkXG4gICAgICBlbmRc
116
+ blxuICAgICAgbmV3cHJvcGVydHkoOmJldHRlcl90aGFuX3JvY2tldF9ib290
117
+ cywgOnBhcmVudCA9PiBQdXBwZXQ6OlByb3BlcnR5OjpCb29sZWFuKSBkb1xu
118
+ ICAgICAgICBkZXNjIFwiRGV0ZXJtaW5lIGlmIHRoZSB0aGluZyBpcyBtb3Jl
119
+ IG9mdGVuIHRoYW4gcm9ja2V0IGJvb3RzXCJcbiAgICAgICAgZGVmYXVsdHRv
120
+ IGZhbHNlICMgUm9ja2V0IGJvb3RzIGFyZSBwcmV0dHkgaGFyZCB0byBiZWF0
121
+ XG4gICAgICBlbmRcblxuICAgICAgbmV3cHJvcGVydHkoOndpbGxfZ2V0X3lv
122
+ dV9lYXRlbl9ieV9zaGFya3MsIDpwYXJlbnQgPT4gUHVwcGV0OjpQcm9wZXJ0
123
+ eTo6Qm9vbGVhbikgZG9cbiAgICAgICAgZGVzYyBcIkRldGVybWluZSBpZiB0
124
+ aGlzIGlzIHNvIGF3ZXNvbWUgdGhhdCBpdCdsbCBnZXQgeW91IGVhdGVuIGJ5
125
+ IHNoYXJrc1wiXG4gICAgICAgIGRlZmF1bHR0byA6ZmFsc2UgIyBVc2UgYSBz
126
+ eW1ib2wgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCBpdCdsbCBzdGlsbCBi
127
+ ZSBmYWxzZVxuICAgICAgZW5kXG5cbiAgICAgIG5ld3Byb3BlcnR5KDpzdWl0
128
+ YWJsZV9mb3JfaHVtYW5fY29uc3VtcHRpb24sIDpwYXJlbnQgPT4gUHVwcGV0
129
+ OjpQcm9wZXJ0eTo6Qm9vbGVhbikgZG9cbiAgICAgICAgZGVzYyBcIkRldGVy
130
+ bWluZSBpZiB0aGUgdGhpbmcgaXMgYm90aCBhd2Vzb21lIGFuZCBlZGlibGVc
131
+ IlxuICAgICAgICBkZWZhdWx0dG8gOmZhbHNlICMgVGhlIGFyZSBtb3JlIG5v
132
+ bi1lZGlibGUgdGhpbmdzIHRoYW4gZWRpYmxlIHRoaW5nc1xuICAgICAgZW5k
133
+ XG4gICAgZW5kXG5cbioqVHlwZSB1c2FnZSoqOlxuXG4gICAgYXdlc29tZSB7
134
+ ICdhY3R1YWwgYm9vbGVhbnMnOlxuICAgICAgYmV0dGVyX3RoYW5fcm9ja2V0
135
+ X2Jvb3RzICAgICAgID0+IHRydWUsICAgIyBVc2UgYW4gdW5xdW90ZWQgc3Ry
136
+ aW5nIVxuICAgICAgYmV0dGVyX3RoYW5fc2xpY2VkX2JyZWFkICAgICAgID0+
137
+ ICd0cnVlJywgIyBVc2UgYSBxdW90ZWQgc3RyaW5nIVxuICAgICAgc3VpdGFi
138
+ bGVfZm9yX2h1bWFuX2NvbnN1bXB0aW9uID0+IG5vLCAgICAgIyBVc2UgeWVz
139
+ IGFuZCBubyEgSXQgZG9lc24ndCBtYXR0ZXIhXG4gICAgfVxuXG5Db250YWN0
140
+ XG4tLS0tLS0tXG5cbiAgKiBzb3VyY2UgY29kZTogaHR0cHM6Ly9naXRodWIu
141
+ Y29tL2FkcmllbnRoZWJvL3B1cHBldC1ib29sZWFuXG4gICogaXNzdWUgdHJh
142
+ Y2tlcjogaHR0cHM6Ly9naXRodWIuY29tL2FkcmllbnRoZWJvL3B1cHBldC1i
143
+ b29sZWFuL2lzc3Vlc1xuXG5JZiB5b3UgaGF2ZSBxdWVzdGlvbnMgb3IgY29u
144
+ Y2VybnMgYWJvdXQgdGhpcyBtb2R1bGUsIGNvbnRhY3QgZmluY2ggb24gI3B1
145
+ cHBldFxub24gRnJlZW5vZGUsIG9yIGVtYWlsIGFkcmllbkBwdXBwZXRsYWJz
146
+ LmNvbS5cbiIsCiAgICAiY2hhbmdlbG9nIjogIkNIQU5HRUxPR1xuXG4xLjAu
147
+ MVxuLS0tLS1cblxuVGhpcyBpcyBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIGJ1
148
+ Z2ZpeCByZWxlYXNlXG5cbiAgKiBDb3JyZWN0IHBlcm1pc3Npb25zIHRvIG1h
149
+ a2UgcGx1Z2luIHdvcmxkIHJlYWRhYmxlLlxuIiwKICAgICJsaWNlbnNlIjog
150
+ IkNvcHlyaWdodCAyMDEzIEFkcmllbiBUaGVib1xuXG5MaWNlbnNlZCB1bmRl
151
+ ciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNl
152
+ bnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g
153
+ Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4g
154
+ YSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFw
155
+ YWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVp
156
+ cmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5n
157
+ LCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMg
158
+ ZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBX
159
+ QVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl
160
+ eHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBz
161
+ cGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5s
162
+ aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuIiwKICAgICJjcmVh
163
+ dGVkX2F0IjogIjIwMTMtMDgtMTQgMTQ6MDA6MjQgLTA3MDAiLAogICAgInVw
164
+ ZGF0ZWRfYXQiOiAiMjAxNS0wMi0wNCAyMToxNzowMiAtMDgwMCIsCiAgICAi
165
+ ZGVsZXRlZF9hdCI6IG51bGwKICB9LAogICJyZWxlYXNlcyI6IFsKICAgIHsK
166
+ ICAgICAgInVyaSI6ICIvdjMvcmVsZWFzZXMvYWRyaWVuLWJvb2xlYW4tMS4w
167
+ LjEiLAogICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCiAgICAgICJzdXBwb3J0
168
+ ZWQiOiBmYWxzZSwKICAgICAgImNyZWF0ZWRfYXQiOiAiMjAxMy0wOC0xNCAx
169
+ NDowMDoyNCAtMDcwMCIKICAgIH0sCiAgICB7CiAgICAgICJ1cmkiOiAiL3Yz
170
+ L3JlbGVhc2VzL2Fkcmllbi1ib29sZWFuLTEuMC4wIiwKICAgICAgInZlcnNp
171
+ b24iOiAiMS4wLjAiLAogICAgICAic3VwcG9ydGVkIjogZmFsc2UsCiAgICAg
172
+ ICJjcmVhdGVkX2F0IjogIjIwMTMtMDctMDQgMTc6MTU6MzcgLTA3MDAiCiAg
173
+ ICB9LAogICAgewogICAgICAidXJpIjogIi92My9yZWxlYXNlcy9hZHJpZW4t
174
+ Ym9vbGVhbi0wLjkuMCIsCiAgICAgICJ2ZXJzaW9uIjogIjAuOS4wIiwKICAg
175
+ ICAgInN1cHBvcnRlZCI6IGZhbHNlLAogICAgICAiY3JlYXRlZF9hdCI6ICIy
176
+ MDEyLTEyLTI4IDEwOjM5OjM2IC0wODAwIgogICAgfSwKICAgIHsKICAgICAg
177
+ InVyaSI6ICIvdjMvcmVsZWFzZXMvYWRyaWVuLWJvb2xlYW4tMC45LjAtcmMx
178
+ IiwKICAgICAgInZlcnNpb24iOiAiMC45LjAtcmMxIiwKICAgICAgInN1cHBv
179
+ cnRlZCI6IGZhbHNlLAogICAgICAiY3JlYXRlZF9hdCI6ICIyMDEyLTEyLTEz
180
+ IDEwOjQwOjExIC0wODAwIgogICAgfQogIF0sCiAgImZlZWRiYWNrX3Njb3Jl
181
+ IjogbnVsbCwKICAiaG9tZXBhZ2VfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNv
182
+ bS9hZHJpZW50aGViby9wdXBwZXQtYm9vbGVhbiIsCiAgImlzc3Vlc191cmwi
183
+ OiAiaHR0cHM6Ly9naXRodWIuY29tL2FkcmllbnRoZWJvL3B1cHBldC1ib29s
184
+ ZWFuL2lzc3VlcyIKfQ==
40
185
  http_version:
41
- recorded_at: Tue, 31 Dec 2013 02:54:56 GMT
42
- recorded_with: VCR 2.8.0
186
+ recorded_at: Mon, 02 Mar 2015 19:59:13 GMT
187
+ recorded_with: VCR 2.9.3