{"action":"created","issue":{"url":"https://api.github.com/repos/bundler/bundler/issues/6457","repository_url":"https://api.github.com/repos/bundler/bundler","labels_url":"https://api.github.com/repos/bundler/bundler/issues/6457/labels{/name}","comments_url":"https://api.github.com/repos/bundler/bundler/issues/6457/comments","events_url":"https://api.github.com/repos/bundler/bundler/issues/6457/events","html_url":"https://github.com/bundler/bundler/issues/6457","id":308613887,"number":6457,"title":"Non-deterministic install of json gem on Ruby 2.4.3p205 / bundler 1.16.1","user":{"login":"Iristyle","id":394081,"avatar_url":"https://avatars0.githubusercontent.com/u/394081?v=4","gravatar_id":"","url":"https://api.github.com/users/Iristyle","html_url":"https://github.com/Iristyle","followers_url":"https://api.github.com/users/Iristyle/followers","following_url":"https://api.github.com/users/Iristyle/following{/other_user}","gists_url":"https://api.github.com/users/Iristyle/gists{/gist_id}","starred_url":"https://api.github.com/users/Iristyle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Iristyle/subscriptions","organizations_url":"https://api.github.com/users/Iristyle/orgs","repos_url":"https://api.github.com/users/Iristyle/repos","events_url":"https://api.github.com/users/Iristyle/events{/privacy}","received_events_url":"https://api.github.com/users/Iristyle/received_events","type":"User","site_admin":false},"labels":[{"id":210390812,"url":"https://api.github.com/repos/bundler/bundler/labels/status:%20user%20feedback%20required","name":"status: user feedback required","color":"fef2c0","default":false}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":3,"created_at":"2018-03-26T15:10:31Z","updated_at":"2018-04-05T15:36:22Z","closed_at":null,"author_association":"NONE","body":"I'm seeing some unexpected behavior with the `json` gem under Ruby 2.4 on Windows / AppVeyor.\r\n\r\nGiven a project with a `Gemfile` that explicitly references an unversioned `json` dependency, but also transitively depends on `json` from an excluded gem group `system_tests` (`beaker` -> `beaker-aws` -> `aws-sdk-v1` -> `json ~> 1.4`), I've observed divergent behavior that I don't understand.\r\n\r\nGiven the same `Gemfile` / `1.16.1` bundler version / `2.4.3` Ruby runtime version / dependency hierarchy, one run fetches, compiles and installs the older `json 1.8.6` as expected. The other run does not. (Note that the code does have different SHAs, but the only difference is that one branch contains an additional `bundle show json` in the `appveyor.yml`). The bundle command run is `bundle install --jobs 4 --retry 2 --without system_tests`. The `Gemfile` in use is at the end of this report.\r\n\r\nI have a gist diff'ing the two runs at https://gist.github.com/Iristyle/154ba00d4c9e96027a645ac7f50df78b#file-bundler-appv-diff\r\n\r\n* The \"YESTERDAY 2.4 x64\" run is against commit https://github.com/puppetlabs/puppetlabs-scheduled_task/commits/0a203bea3249698c0995515f7016ab42615cc049\r\n    * The complete run output is available at https://ci.appveyor.com/project/puppetlabs/puppetlabs-scheduled-task/build/1.1.x.143/job/pfae70sfa1kdv8cg\r\n    * Note that it includes \"Fetching json 1.8.6 / Installing json 1.8.6 with native extensions\"\r\n    * Also note that as a result, `bundle exec ruby -e 'require \\\"json\\\"; puts \\\"bundled json version: #{JSON::VERSION}\\\"'` emits `bundled json version: 1.8.6`\r\n    * And `gem list` includes `json (default: 2.0.4, 1.8.6)`\r\n    * This branch does not contain the `bundle show json` command but presumably we'd see the path to the 1.8.6 gem like `C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/json-1.8.6`\r\n    \r\n* The \"TODAY 2.4 x64\" run is against commit https://github.com/puppetlabs/puppetlabs-scheduled_task/commits/f011d8a6ae782317cae790494d5e03b57fe55c3a\r\n    * The complete run output is available at https://ci.appveyor.com/project/puppetlabs/puppetlabs-scheduled-task/build/1.1.x.150/job/posetp03ctx267a5\r\n    * Note that it does not fetch / build json gem\r\n    * Also note that as a result, `bundle exec ruby -e 'require \\\"json\\\"; puts \\\"bundled json version: #{JSON::VERSION}\\\"'` emits `bundled json version: 2.0.4`\r\n    * And `gem list` includes `json (default: 2.0.4)`\r\n    * `bundle show json` returns `C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/multi_json-1.13.1` as there is no `json` gem in the bundle\r\n    * Also of note is that `2.0.4` doesn't satisfy the transitive dependency for `~> 1.4` from `aws-sdk-v1` - but this dependency is, as mentioned, courtesy of an excluded gem group.\r\n\r\n\r\nI was trying to document some Bundler behaviors in a chart at https://gist.github.com/Iristyle/8a2214a6dd5aa709ba2a1abd32b4eacd while I ran across this inconsistency.\r\n\r\nMy understanding could be wrong, but I've always understood that Bundler would use excluded gem groups in the dependency calculation in the event the group was included again, so that a new gemset didn't have to be downloaded. That would explain `json 1.8.6` being downloaded and built, despite its group being excluded with `--without`. Even if that assumption is not correct, I would expect multiple runs of the same code to install the same gems, so what I've observed is surprising.\r\n\r\n#### Gemfile\r\n\r\n```ruby\r\n#This file is generated by ModuleSync, do not edit.\r\n\r\nsource ENV['GEM_SOURCE'] || \"https://rubygems.org\"\r\n\r\n# Determines what type of gem is requested based on place_or_version.\r\ndef gem_type(place_or_version)\r\n  if place_or_version =~ /^git:/\r\n    :git\r\n  elsif place_or_version =~ /^file:/\r\n    :file\r\n  else\r\n    :gem\r\n  end\r\nend\r\n\r\n# Find a location or specific version for a gem. place_or_version can be a\r\n# version, which is most often used. It can also be git, which is specified as\r\n# `git://somewhere.git#branch`. You can also use a file source location, which\r\n# is specified as `file://some/location/on/disk`.\r\ndef location_for(place_or_version, fake_version = nil)\r\n  if place_or_version =~ /^(git[:@][^#]*)#(.*)/\r\n    [fake_version, { :git => $1, :branch => $2, :require => false }].compact\r\n  elsif place_or_version =~ /^file:\\/\\/(.*)/\r\n    ['>= 0', { :path => File.expand_path($1), :require => false }]\r\n  else\r\n    [place_or_version, { :require => false }]\r\n  end\r\nend\r\n\r\n# Used for gem conditionals\r\nruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments\r\nminor_version = \"#{ruby_version_segments[0]}.#{ruby_version_segments[1]}\"\r\n\r\n# The following gems are not included by default as they require DevKit on Windows.\r\n# You should probably include them in a Gemfile.local or a ~/.gemfile\r\n#gem 'pry' #this may already be included in the gemfile\r\n#gem 'pry-stack_explorer', :require => false\r\n#if RUBY_VERSION =~ /^2/\r\n#  gem 'pry-byebug'\r\n#else\r\n#  gem 'pry-debugger'\r\n#end\r\n\r\ngroup :development do\r\n  gem \"puppet-module-posix-default-r#{minor_version}\",    :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-default-r#{minor_version}\",      :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"puppet-module-posix-dev-r#{minor_version}\",        :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-dev-r#{minor_version}\", '0.0.7', :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"json_pure\", '<= 2.0.1',                            :require => false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0')\r\n  gem \"fast_gettext\", '1.1.0',                            :require => false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0')\r\n  gem \"fast_gettext\",                                     :require => false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0')\r\nend\r\n\r\ngroup :system_tests do\r\n  gem \"puppet-module-posix-system-r#{minor_version}\",                            :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-system-r#{minor_version}\",                              :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"beaker\", *location_for(ENV['BEAKER_VERSION'] || '>= 3')\r\n  gem \"beaker-pe\",                                                               :require => false\r\n  gem \"beaker-rspec\", *location_for(ENV['BEAKER_RSPEC_VERSION'])\r\n  gem \"beaker-hostgenerator\", *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION'])\r\n  gem \"beaker-abs\", *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 0.1')\r\n  gem \"puppet-blacksmith\", '~> 3.4',                                             :require => false\r\n  gem \"beaker-testmode_switcher\", '<= 0.2.0',                                    :require => false\r\n  gem \"master_manipulator\",                                                      :require => false\r\nend\r\n\r\ngem 'puppet', *location_for(ENV['PUPPET_GEM_VERSION'])\r\ngem 'json'\r\n\r\n# Only explicitly specify Facter/Hiera if a version has been specified.\r\n# Otherwise it can lead to strange bundler behavior. If you are seeing weird\r\n# gem resolution behavior, try setting `DEBUG_RESOLVER` environment variable\r\n# to `1` and then run bundle install.\r\ngem 'facter', *location_for(ENV['FACTER_GEM_VERSION']) if ENV['FACTER_GEM_VERSION']\r\ngem 'hiera', *location_for(ENV['HIERA_GEM_VERSION']) if ENV['HIERA_GEM_VERSION']\r\n\r\n# Evaluate Gemfile.local if it exists\r\nif File.exists? \"#{__FILE__}.local\"\r\n  eval(File.read(\"#{__FILE__}.local\"), binding)\r\nend\r\n\r\n# Evaluate ~/.gemfile if it exists\r\nif File.exists?(File.join(Dir.home, '.gemfile'))\r\n  eval(File.read(File.join(Dir.home, '.gemfile')), binding)\r\nend\r\n\r\n# vim:ft=ruby\r\n```\r\n"},"comment":{"url":"https://api.github.com/repos/bundler/bundler/issues/comments/378978838","html_url":"https://github.com/bundler/bundler/issues/6457#issuecomment-378978838","issue_url":"https://api.github.com/repos/bundler/bundler/issues/6457","id":378978838,"user":{"login":"Iristyle","id":394081,"avatar_url":"https://avatars0.githubusercontent.com/u/394081?v=4","gravatar_id":"","url":"https://api.github.com/users/Iristyle","html_url":"https://github.com/Iristyle","followers_url":"https://api.github.com/users/Iristyle/followers","following_url":"https://api.github.com/users/Iristyle/following{/other_user}","gists_url":"https://api.github.com/users/Iristyle/gists{/gist_id}","starred_url":"https://api.github.com/users/Iristyle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Iristyle/subscriptions","organizations_url":"https://api.github.com/users/Iristyle/orgs","repos_url":"https://api.github.com/users/Iristyle/repos","events_url":"https://api.github.com/users/Iristyle/events{/privacy}","received_events_url":"https://api.github.com/users/Iristyle/received_events","type":"User","site_admin":false},"created_at":"2018-04-05T15:36:22Z","updated_at":"2018-04-05T15:36:22Z","author_association":"NONE","body":"So unfortunately I don't have a time machine to go back to the old code and insert a `bundle env` into the unexpected run that didn't download json 1.8.6. But the full output of the job at that point in time is here. Even though it's missing the `bundle env` there's still useful info in there - https://ci.appveyor.com/project/puppetlabs/puppetlabs-scheduled-task/build/1.1.x.150/job/posetp03ctx267a5\r\n\r\nSince this appears to be racy, it may be difficult to reproduce the output for both scenarios, but I'll try to just keep re-running AppVeyor jobs in an effort to collect both.\r\n\r\nThe expected output that includes downloading / installing / building 1.8.6 as one would expect is here, but of course, the less interesting of the two:\r\nhttps://ci.appveyor.com/project/puppetlabs/puppetlabs-scheduled-task/build/1.1.x.164/job/dd85ypqgywifqju9?fullLog=true\r\n\r\n\r\n## Environment\r\n```\r\nBundler       1.16.1\r\n  Platforms   ruby, x64-mingw32\r\nRuby          2.1.9p490 (2016-03-30 revision 54437) [x64-mingw32]\r\n  Full Path   C:/Ruby21-x64/bin/ruby.exe\r\n  Config Dir  C:/ProgramData\r\nRubyGems      2.7.4\r\n  Gem Home    C:/Ruby21-x64/lib/ruby/gems/2.1.0\r\n  Gem Path    C:/Users/appveyor/.gem/ruby/2.1.0;C:/Ruby21-x64/lib/ruby/gems/2.1.0\r\n  User Path   C:/Users/appveyor/.gem/ruby/2.1.0\r\n  Bin Dir     C:/Ruby21-x64/bin\r\nTools         \r\n  Git         2.16.2.windows.1\r\n  RVM         not installed\r\n  rbenv       not installed\r\n  chruby      not installed\r\n```\r\n## Bundler Build Metadata\r\n```\r\nBuilt At          2017-12-21\r\nGit SHA           0034ef341\r\nReleased Version  true\r\n```\r\n## Bundler settings\r\n```\r\nretry\r\n  Set for your local app (C:/projects/puppetlabs-scheduled-task/.bundle/config): 2\r\npath\r\n  Set for your local app (C:/projects/puppetlabs-scheduled-task/.bundle/config): \".bundle/gems\"\r\njobs\r\n  Set for your local app (C:/projects/puppetlabs-scheduled-task/.bundle/config): \"4\"\r\nwithout\r\n  Set for your local app (C:/projects/puppetlabs-scheduled-task/.bundle/config): [:system_tests]\r\n```\r\n## Gemfile\r\n### Gemfile\r\n```ruby\r\n#This file is generated by ModuleSync, do not edit.\r\nsource ENV['GEM_SOURCE'] || \"https://rubygems.org\"\r\n# Determines what type of gem is requested based on place_or_version.\r\ndef gem_type(place_or_version)\r\n  if place_or_version =~ /^git:/\r\n    :git\r\n  elsif place_or_version =~ /^file:/\r\n    :file\r\n  else\r\n    :gem\r\n  end\r\nend\r\n# Find a location or specific version for a gem. place_or_version can be a\r\n# version, which is most often used. It can also be git, which is specified as\r\n# `git://somewhere.git#branch`. You can also use a file source location, which\r\n# is specified as `file://some/location/on/disk`.\r\ndef location_for(place_or_version, fake_version = nil)\r\n  if place_or_version =~ /^(git[:@][^#]*)#(.*)/\r\n    [fake_version, { :git => $1, :branch => $2, :require => false }].compact\r\n  elsif place_or_version =~ /^file:\\/\\/(.*)/\r\n    ['>= 0', { :path => File.expand_path($1), :require => false }]\r\n  else\r\n    [place_or_version, { :require => false }]\r\n  end\r\nend\r\n# Used for gem conditionals\r\nruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments\r\nminor_version = \"#{ruby_version_segments[0]}.#{ruby_version_segments[1]}\"\r\n# The following gems are not included by default as they require DevKit on Windows.\r\n# You should probably include them in a Gemfile.local or a ~/.gemfile\r\n#gem 'pry' #this may already be included in the gemfile\r\n#gem 'pry-stack_explorer', :require => false\r\n#if RUBY_VERSION =~ /^2/\r\n#  gem 'pry-byebug'\r\n#else\r\n#  gem 'pry-debugger'\r\n#end\r\ngroup :development do\r\n  gem \"puppet-module-posix-default-r#{minor_version}\",    :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-default-r#{minor_version}\",      :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"puppet-module-posix-dev-r#{minor_version}\",        :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-dev-r#{minor_version}\", '0.0.7', :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"json_pure\", '<= 2.0.1',                            :require => false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0')\r\n  gem \"fast_gettext\", '1.1.0',                            :require => false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0')\r\n  gem \"fast_gettext\",                                     :require => false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0')\r\nend\r\ngroup :system_tests do\r\n  gem \"puppet-module-posix-system-r#{minor_version}\",                            :require => false, :platforms => \"ruby\"\r\n  gem \"puppet-module-win-system-r#{minor_version}\",                              :require => false, :platforms => [\"mswin\", \"mingw\", \"x64_mingw\"]\r\n  gem \"beaker\", *location_for(ENV['BEAKER_VERSION'] || '>= 3')\r\n  gem \"beaker-pe\",                                                               :require => false\r\n  gem \"beaker-rspec\", *location_for(ENV['BEAKER_RSPEC_VERSION'])\r\n  gem \"beaker-hostgenerator\", *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION'])\r\n  gem \"beaker-abs\", *location_for(ENV['BEAKER_ABS_VERSION'] || '~> 0.1')\r\n  gem \"puppet-blacksmith\", '~> 3.4',                                             :require => false\r\n  gem \"beaker-testmode_switcher\", '<= 0.2.0',                                    :require => false\r\n  gem \"master_manipulator\",                                                      :require => false\r\nend\r\ngem 'json', '>= 0'\r\ngem 'puppet', *location_for(ENV['PUPPET_GEM_VERSION'])\r\n# Only explicitly specify Facter/Hiera if a version has been specified.\r\n# Otherwise it can lead to strange bundler behavior. If you are seeing weird\r\n# gem resolution behavior, try setting `DEBUG_RESOLVER` environment variable\r\n# to `1` and then run bundle install.\r\ngem 'facter', *location_for(ENV['FACTER_GEM_VERSION']) if ENV['FACTER_GEM_VERSION']\r\ngem 'hiera', *location_for(ENV['HIERA_GEM_VERSION']) if ENV['HIERA_GEM_VERSION']\r\n# Evaluate Gemfile.local if it exists\r\nif File.exists? \"#{__FILE__}.local\"\r\n  eval(File.read(\"#{__FILE__}.local\"), binding)\r\nend\r\n# Evaluate ~/.gemfile if it exists\r\nif File.exists?(File.join(Dir.home, '.gemfile'))\r\n  eval(File.read(File.join(Dir.home, '.gemfile')), binding)\r\nend\r\n# vim:ft=ruby\r\n```\r\n### Gemfile.lock\r\n```\r\nGEM\r\n  remote: https://rubygems.org/\r\n  specs:\r\n    CFPropertyList (2.3.6)\r\n    addressable (2.5.2)\r\n      public_suffix (>= 2.0.2, < 4.0)\r\n    ansi (1.5.0)\r\n    ast (2.4.0)\r\n    aws-sdk-v1 (1.67.0)\r\n      json (~> 1.4)\r\n      nokogiri (~> 1)\r\n    beaker (3.34.0)\r\n      beaker-abs (~> 0.4)\r\n      beaker-aws (~> 0.1)\r\n      beaker-docker (~> 0.1)\r\n      beaker-google (~> 0.1)\r\n      beaker-hiera (~> 0.0)\r\n      beaker-hostgenerator\r\n      beaker-openstack (~> 0.1)\r\n      beaker-puppet (~> 0.0)\r\n      beaker-vagrant (~> 0.1)\r\n      beaker-vcloud (~> 0.1)\r\n      beaker-vmpooler (~> 1.0)\r\n      beaker-vmware (~> 0.1)\r\n      hocon (~> 1.0)\r\n      in-parallel (~> 0.1)\r\n      inifile (~> 3.0)\r\n      minitar (~> 0.6)\r\n      minitest (~> 5.4)\r\n      net-scp (~> 1.2)\r\n      net-ssh (~> 4.0)\r\n      open_uri_redirections (~> 0.2.1)\r\n      pry-byebug (~> 3.4.2)\r\n      rb-readline (~> 0.5.3)\r\n      rsync (~> 1.0.9)\r\n      stringify-hash (~> 0.0)\r\n      thor (~> 0.19)\r\n    beaker-abs (0.5.0)\r\n    beaker-answers (0.22.0)\r\n      hocon (~> 1.0)\r\n      require_all (~> 1.3.2)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-aws (0.4.0)\r\n      aws-sdk-v1 (~> 1.57)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-docker (0.3.1)\r\n      docker-api\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-google (0.1.0)\r\n      google-api-client (~> 0.9)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-hiera (0.1.1)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-hostgenerator (1.1.9)\r\n      deep_merge (~> 1.0)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-i18n_helper (1.1.0)\r\n    beaker-module_install_helper (0.1.7)\r\n      beaker (>= 2.0)\r\n    beaker-openstack (0.2.0)\r\n      fog-openstack\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-pe (1.40.1)\r\n      beaker-abs\r\n      beaker-answers (~> 0.0)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-puppet (0.13.0)\r\n      in-parallel (~> 0.1)\r\n      oga\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-puppet_install_helper (0.7.1)\r\n      beaker (>= 2.0)\r\n    beaker-rspec (6.2.3)\r\n      beaker (~> 3.0)\r\n      rspec (~> 3.0)\r\n      serverspec (~> 2)\r\n      specinfra (~> 2)\r\n    beaker-task_helper (1.3.0)\r\n    beaker-testmode_switcher (0.2.0)\r\n      beaker\r\n      master_manipulator\r\n    beaker-vagrant (0.4.0)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-vcloud (0.2.0)\r\n      beaker-vmpooler\r\n      beaker-vmware\r\n      rbvmomi (~> 1.9)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-vmpooler (1.2.0)\r\n      stringify-hash (~> 0.0.0)\r\n    beaker-vmware (0.2.0)\r\n      fission (~> 0.4)\r\n      rbvmomi (~> 1.9)\r\n      stringify-hash (~> 0.0.0)\r\n    builder (3.2.3)\r\n    byebug (9.0.6)\r\n    coderay (1.1.2)\r\n    declarative (0.0.10)\r\n    declarative-option (0.1.0)\r\n    deep_merge (1.2.1)\r\n    diff-lcs (1.3)\r\n    docker-api (1.34.2)\r\n      excon (>= 0.47.0)\r\n      multi_json\r\n    domain_name (0.5.20170404)\r\n      unf (>= 0.0.5, < 1.0.0)\r\n    excon (0.62.0)\r\n    facter (2.5.1-x64-mingw32)\r\n      ffi (~> 1.9.5)\r\n    faraday (0.14.0)\r\n      multipart-post (>= 1.2, < 3)\r\n    fast_gettext (1.1.2)\r\n    ffi (1.9.23-x64-mingw32)\r\n    fission (0.5.0)\r\n      CFPropertyList (~> 2.2)\r\n    fog-core (1.45.0)\r\n      builder\r\n      excon (~> 0.58)\r\n      formatador (~> 0.2)\r\n    fog-json (1.0.2)\r\n      fog-core (~> 1.0)\r\n      multi_json (~> 1.10)\r\n    fog-openstack (0.1.25)\r\n      fog-core (~> 1.40)\r\n      fog-json (>= 1.0)\r\n      ipaddress (>= 0.8)\r\n    formatador (0.2.5)\r\n    gettext (3.2.9)\r\n      locale (>= 2.0.5)\r\n      text (>= 1.3.0)\r\n    gettext-setup (0.30)\r\n      fast_gettext (~> 1.1.0)\r\n      gettext (>= 3.0.2)\r\n      locale\r\n    google-api-client (0.10.3)\r\n      addressable (~> 2.3)\r\n      googleauth (~> 0.5)\r\n      httpclient (~> 2.7)\r\n      hurley (~> 0.1)\r\n      memoist (~> 0.11)\r\n      mime-types (>= 1.6)\r\n      representable (~> 3.0)\r\n      retriable (>= 2.0, < 4.0)\r\n    googleauth (0.6.2)\r\n      faraday (~> 0.12)\r\n      jwt (>= 1.4, < 3.0)\r\n      logging (~> 2.0)\r\n      memoist (~> 0.12)\r\n      multi_json (~> 1.11)\r\n      os (~> 0.9)\r\n      signet (~> 0.7)\r\n    hiera (3.4.2)\r\n    hocon (1.2.5)\r\n    http-cookie (1.0.3)\r\n      domain_name (~> 0.5)\r\n    httpclient (2.8.3)\r\n    hurley (0.2)\r\n    in-parallel (0.1.17)\r\n    inifile (3.0.0)\r\n    ipaddress (0.8.3)\r\n    json (1.8.6)\r\n    json_pure (1.8.6)\r\n    jwt (2.1.0)\r\n    little-plugger (1.1.4)\r\n    locale (2.1.2)\r\n    logging (2.2.2)\r\n      little-plugger (~> 1.1)\r\n      multi_json (~> 1.10)\r\n    master_manipulator (2.1.1)\r\n      beaker (>= 2.7.0)\r\n      multi_json\r\n    memoist (0.16.0)\r\n    metaclass (0.0.4)\r\n    method_source (0.9.0)\r\n    mime-types (2.99.3)\r\n    mini_portile2 (2.1.0)\r\n    minitar (0.6.1)\r\n    minitest (5.11.3)\r\n    mocha (1.1.0)\r\n      metaclass (~> 0.0.1)\r\n    multi_json (1.13.1)\r\n    multipart-post (2.0.0)\r\n    net-scp (1.2.1)\r\n      net-ssh (>= 2.6.5)\r\n    net-ssh (4.2.0)\r\n    net-telnet (0.1.1)\r\n    netrc (0.11.0)\r\n    nokogiri (1.7.2-x64-mingw32)\r\n      mini_portile2 (~> 2.1.0)\r\n    oga (2.14)\r\n      ast\r\n      ruby-ll (~> 2.1)\r\n    open_uri_redirections (0.2.1)\r\n    os (0.9.6)\r\n    parallel (1.12.1)\r\n    parallel_tests (2.21.3)\r\n      parallel\r\n    parser (2.5.0.5)\r\n      ast (~> 2.4.0)\r\n    powerpack (0.1.1)\r\n    pry (0.11.3)\r\n      coderay (~> 1.1.0)\r\n      method_source (~> 0.9.0)\r\n    pry-byebug (3.4.3)\r\n      byebug (>= 9.0, < 9.1)\r\n      pry (~> 0.10)\r\n    public_suffix (3.0.2)\r\n    puppet (4.10.10-x64-mingw32)\r\n      facter (> 2.0, < 4)\r\n      ffi (~> 1.9.6)\r\n      gettext-setup (>= 0.10, < 1)\r\n      hiera (>= 2.0, < 4)\r\n      json_pure (~> 1.8)\r\n      locale (~> 2.1)\r\n      minitar (~> 0.6.1)\r\n      win32-dir (= 0.4.9)\r\n      win32-eventlog (= 0.6.5)\r\n      win32-process (= 0.7.5)\r\n      win32-security (= 0.2.5)\r\n      win32-service (= 0.8.8)\r\n    puppet-blacksmith (3.4.0)\r\n      puppet (>= 2.7.16)\r\n      rest-client (~> 1.8.0)\r\n    puppet-lint (2.3.5)\r\n    puppet-module-win-default-r2.1 (0.3.1)\r\n      nokogiri (= 1.7.2)\r\n      win32-dir (<= 0.4.9)\r\n      win32-eventlog (<= 0.6.5)\r\n      win32-process (<= 0.7.5)\r\n      win32-security (<= 0.2.5)\r\n      win32-service (<= 0.8.8)\r\n    puppet-module-win-dev-r2.1 (0.0.7)\r\n      mocha (< 1.2.0)\r\n      parallel_tests\r\n      pry\r\n      puppet-blacksmith (>= 3.4.0)\r\n      puppet-lint\r\n      puppet_facts\r\n      puppetlabs_spec_helper (>= 1.2.1)\r\n      rainbow (< 2.2.0)\r\n      rspec-puppet (>= 2.3.2)\r\n      rspec_junit_formatter (~> 0.2)\r\n      rubocop\r\n      rubocop-rspec (~> 1.15)\r\n      specinfra (= 2.67.3)\r\n    puppet-module-win-system-r2.1 (0.3.1)\r\n      beaker-i18n_helper (~> 1.1)\r\n      beaker-module_install_helper (>= 0.1.4, < 1.0.0)\r\n      beaker-puppet_install_helper (>= 0.7.1, < 1.0.0)\r\n      beaker-task_helper (>= 1.1.0, < 2.0.0)\r\n      master_manipulator (>= 2.1.1, < 3.0.0)\r\n    puppet-syntax (2.4.1)\r\n      rake\r\n    puppet_facts (0.2.1)\r\n    puppetlabs_spec_helper (2.6.2)\r\n      mocha (~> 1.0)\r\n      puppet-lint (~> 2.0)\r\n      puppet-syntax (~> 2.0)\r\n      rspec-puppet (~> 2.0)\r\n    rainbow (2.1.0)\r\n    rake (12.3.1)\r\n    rb-readline (0.5.5)\r\n    rbvmomi (1.11.7)\r\n      builder (~> 3.0)\r\n      json (>= 1.8)\r\n      nokogiri (~> 1.5)\r\n      trollop (~> 2.1)\r\n    representable (3.0.4)\r\n      declarative (< 0.1.0)\r\n      declarative-option (< 0.2.0)\r\n      uber (< 0.2.0)\r\n    require_all (1.3.3)\r\n    rest-client (1.8.0-x64-mingw32)\r\n      ffi (~> 1.9)\r\n      http-cookie (>= 1.0.2, < 2.0)\r\n      mime-types (>= 1.16, < 3.0)\r\n      netrc (~> 0.7)\r\n    retriable (3.1.1)\r\n    rspec (3.7.0)\r\n      rspec-core (~> 3.7.0)\r\n      rspec-expectations (~> 3.7.0)\r\n      rspec-mocks (~> 3.7.0)\r\n    rspec-core (3.7.1)\r\n      rspec-support (~> 3.7.0)\r\n    rspec-expectations (3.7.0)\r\n      diff-lcs (>= 1.2.0, < 2.0)\r\n      rspec-support (~> 3.7.0)\r\n    rspec-its (1.2.0)\r\n      rspec-core (>= 3.0.0)\r\n      rspec-expectations (>= 3.0.0)\r\n    rspec-mocks (3.7.0)\r\n      diff-lcs (>= 1.2.0, < 2.0)\r\n      rspec-support (~> 3.7.0)\r\n    rspec-puppet (2.6.11)\r\n      rspec\r\n    rspec-support (3.7.1)\r\n    rspec_junit_formatter (0.3.0)\r\n      rspec-core (>= 2, < 4, != 2.12.0)\r\n    rsync (1.0.9)\r\n    rubocop (0.49.1)\r\n      parallel (~> 1.10)\r\n      parser (>= 2.3.3.1, < 3.0)\r\n      powerpack (~> 0.1)\r\n      rainbow (>= 1.99.1, < 3.0)\r\n      ruby-progressbar (~> 1.7)\r\n      unicode-display_width (~> 1.0, >= 1.0.1)\r\n    rubocop-rspec (1.16.0)\r\n      rubocop (>= 0.49.0)\r\n    ruby-ll (2.1.2)\r\n      ansi\r\n      ast\r\n    ruby-progressbar (1.9.0)\r\n    serverspec (2.39.0)\r\n      multi_json\r\n      rspec (~> 3.0)\r\n      rspec-its\r\n      specinfra (~> 2.53)\r\n    sfl (2.3)\r\n    signet (0.8.1)\r\n      addressable (~> 2.3)\r\n      faraday (~> 0.9)\r\n      jwt (>= 1.5, < 3.0)\r\n      multi_json (~> 1.10)\r\n    specinfra (2.67.3)\r\n      net-scp\r\n      net-ssh (>= 2.7, < 5.0)\r\n      net-telnet\r\n      sfl\r\n    stringify-hash (0.0.2)\r\n    text (1.3.1)\r\n    thor (0.20.0)\r\n    trollop (2.1.2)\r\n    uber (0.1.0)\r\n    unf (0.1.4)\r\n      unf_ext\r\n    unf_ext (0.0.7.5-x64-mingw32)\r\n    unicode-display_width (1.3.0)\r\n    win32-dir (0.4.9)\r\n      ffi (>= 1.0.0)\r\n    win32-eventlog (0.6.5)\r\n      ffi\r\n    win32-process (0.7.5)\r\n      ffi (>= 1.0.0)\r\n    win32-security (0.2.5)\r\n      ffi\r\n    win32-service (0.8.8)\r\n      ffi\r\nPLATFORMS\r\n  x64-mingw32\r\nDEPENDENCIES\r\n  beaker (>= 3)\r\n  beaker-abs (~> 0.1)\r\n  beaker-hostgenerator\r\n  beaker-pe\r\n  beaker-rspec\r\n  beaker-testmode_switcher (<= 0.2.0)\r\n  fast_gettext\r\n  json\r\n  master_manipulator\r\n  puppet (~> 4.0)\r\n  puppet-blacksmith (~> 3.4)\r\n  puppet-module-posix-default-r2.1\r\n  puppet-module-posix-dev-r2.1\r\n  puppet-module-posix-system-r2.1\r\n  puppet-module-win-default-r2.1\r\n  puppet-module-win-dev-r2.1 (= 0.0.7)\r\n  puppet-module-win-system-r2.1\r\nBUNDLED WITH\r\n   1.16.1\r\n```"}}
{"actor":{"display_login":"Iristyle"}}