Ruby backend

:construction: Unfinished, just looking to open the discussion
First of all, I know the tests are broken. The failing tests appear to just be mismatched error outputs so far, but I haven't yet run the acceptance tests.
In this pull request, I've added a ruby based solver option using molinillo which Bundler now uses. In the long term, my goal is that when I use solve with ChefDK for policyfiles, we can just use the ruby solver, which will save me the pain of having to maintain the gecode build on a lot of different platforms.
For berks, the issue is much more complicated, of course. For users who use Chef Solo (or local mode) or environment cookbooks or some other homegrown lockdown mechanism, the exact ranking of different solutions isn't too big a deal because they're guaranteed to deploy what they test. Unfortunately, many users don't use any lockdown mechanism, and will depend on berks generating the same solution as the chef server would.
On the other hand, there are users on platforms for which Chef doesn't ship a prebuilt ChefDK or gem install anyway for whatever reason. These users would benefit if we gave them the option to just use the pure-ruby solver.
FWIW, the ruby solver seems to actually be a little faster than the gecode one on the benchmark we have:
$ bundle exec ruby spec/acceptance/benchmark.rb
                   user     system      total        real
Create graph   0.200000   0.000000   0.200000 (  0.196406)
Solve Gecode   0.120000   0.010000   0.130000 (  0.130030)
Solve Ruby     0.090000   0.000000   0.090000 (  0.088621)

But of course dependency solving is a complicated problem so who knows how the backends might compare on different data.
Anyway, thoughts?

@danielsdeleo a ruby based solver implementing Molinillo is greatly preferred to the gecode solution we currently have. Using anything other than what the Chef Server is using wouldn't be a good idea, though, since the Chef Server is deterministically solving some complicated graphs incorrectly.
I don't think this would be much of a problem moving forward since the burden of resolution will be removed from the Chef Server, right?

@reset Yeah, if people use policyfiles or any of the existing lockdown mechanisms based on environments (or the really weird stuff with auto generated cookbook metadata) they're avoiding use of the server side solver, so how we weight the possible solutions doesn't matter.
From a Chef Server maintenance policy perspective, it's gonna be quite a long time until we can drop the server-side dependency solver. Policyfiles are just landing on hosted and non-feature-flagged in Chef Server some time in the next week (if everything goes according to plan), and lots of folks are still on various 11.x versions of Client/Server. Eventually if we can get everyone on to some workflow that doesn't hit the solver (which we really want to do), then we'll be able to remove it.
For right now I'm wondering if it would be optimal to have the backend be selectable and make berks opt for the gecode solver, only if available, by default. So a gem install of berks would use the ruby based solver until you install dep_selector, but in ChefDK we'll continue to build and ship dep_selector.

@danielsdeleo ok that sounds great to me. Let's go ahead and have the Ruby based solver be the default if gecode is not present. Here's a few additional things I think is worth mentioning:

We should allow the solver to be explicitly configurable by extending the Berksfile DSL
The DSL addition will allow you to configure a solver as :preferred or :required
If the solver isn't available on the client's machine and the solver setting is set to :preferred we should display a warning
If the solver isn't available on the client's machine and the solver setting is set to :required we should cancel execution and exit with a non-zero exit code

Sounds like an awesome plan. Setting the desired solver in the berksfile sounds like a really good idea.

@danielsdeleo :+1: great, let me know if you need anything from me!

@reset I made some more progress on this. The acceptance tests for the ruby solver will have some failures, but I wanted to note a few things:

I changed the expected text for solve failures to just expect what molinillo produces. It uses Solve's error classes though.
The solutions it gets are indeed different from what gecode does, but I think generally they're preferable; for example, this acceptance test gets the same result as the old ruby solver did: https://github.com/berkshelf/solve/commit/14b17722b552b0d3e4fa061ece5d9c7baddf7009#diff-8b23e53518f1346aa2ea3ec477634046R243
Molinillo doesn't accept circular dependencies at all. You should double-check that the way I changed this test is ok: https://github.com/berkshelf/solve/commit/14b17722b552b0d3e4fa061ece5d9c7baddf7009#diff-8b23e53518f1346aa2ea3ec477634046R191 Also, circular dep errors are the cause of the remaining failures in the acceptance tests.
I made the ruby solver the default, which probably means we should do a major version bump when this is merged.

Aside from the issues with the acceptance tests, I think the code is generally ready for review.

One more thing, the way I wrote passing options into the solver, where they go both to new and #resolve is not great. We definitely need to pass options in to the ruby solver, it uses them in error messages. For example, the default error would be:
`yum (= 2.4.5)` required by `user-specified dependency`

But you can make it instead say:
`yum (= 2.4.5)` required by `Berksfile`

Also, doing some more testing with the benchmarks. For the LargeGraphNoSolution case, the ruby solver takes ~ 1 second and the error looks like:
Unable to satisfy the following requirements:

- `yum (= 2.4.5)` required by `user-specified dependency`
- `yum (~> 3.1)` required by `virtualbox-cookbook-1.0.3`
- `yum (>= 0.0.0)` required by `logstash-0.7.6`
- `yum (~> 3.0)` required by `jenkins-2.0.3`
- `yum (~> 3.0)` required by `memcached-1.7.2`
- `yum (~> 3.0)` required by `yum-epel-0.3.4`
- `yum (< 3.0.0)` required by `git-2.8.5`
- `yum (~> 3.0)` required by `git-2.8.5`

Whereas the gecode solver takes 4 seconds and produces this error message:
Unable to satisfy constraints on package yum due to solution constraint (jenkins = 2.0.3). Solution constraints that may result in a constraint on yum: [(sensu = 0.1.0) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 3.1.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (rabbitmq = 3.1.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (yum >= 0.5.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.8.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (yum >= 0.5.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (rabbitmq = 1.4.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(sensu = 0.1.0) -> (redis = 3.0.4) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (redis = 3.0.4) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (redis = 3.0.4) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (redis = 3.0.4) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (redis = 3.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (redis = 3.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (redis = 3.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (redis = 3.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.5.1) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.5.1) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.5.1) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.5.1) -> (runit = 1.4.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 2.5.1) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = {1.2.0,1.6.0}) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.6.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.6.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.6.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.6.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (runit = 1.4.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.4.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.0.8) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.0.8) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.0.8) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.0.8) -> (runit = 1.4.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 2.0.8) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.0.4) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.0.4) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 2.0.4) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 2.0.4) -> (runit = 1.4.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 2.0.4) -> (yum ~> 2.3)], [(sensu = 0.1.0) -> (nginx = 1.4.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.0.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.0.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.2) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 1.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 1.0.0) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 0.101.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.101.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.101.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 0.101.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 0.100.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.100.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.100.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 0.100.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 0.99.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.99.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.99.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 0.99.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(sensu = 0.1.0) -> (nginx = 0.14.3) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.14.3) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(sensu = 0.1.0) -> (nginx = 0.14.3) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(sensu = 0.1.0) -> (nginx = 0.14.3) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.7.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = {1.6.2,1.2.0}) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.7.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.6) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.6) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.6.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = {1.6.2,1.2.0}) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.2) -> (memcached = 1.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.7.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.6) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.6) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.6.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = {1.6.2,1.2.0}) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.4.0) -> (memcached = 1.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.3.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.1.2) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.1.2) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (graphite = 0.0.5) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (graphite = 0.0.5) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(ganglia = 0.2.1) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(ganglia = 0.2.1) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(git = 2.8.5) -> (yum < 3.0.0)], [(git = 2.8.5) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(git = 2.8.5) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(git = 2.8.5) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(git = 2.8.5) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.7.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (memcached = 1.6.6) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (memcached = 1.6.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (memcached = 1.6.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(graphite = 0.4.8) -> (memcached = {1.6.2,1.2.0}) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(graphite = 0.4.8) -> (memcached = 1.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(jenkins = 2.0.3) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(jenkins = 2.0.3) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(jenkins = 2.0.3) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.8.5) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.8.5) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.8.5) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.3.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.3.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.3.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 4.0.0) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.7.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.2.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.1.2) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 2.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 2.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 2.0.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 1.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 1.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 1.0.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.10.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 0.10.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 0.10.0) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.9.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 0.9.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (git = 0.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(logstash = 0.7.6) -> (git = 0.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 3.1.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 3.1.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (rabbitmq = 3.1.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (yum >= 0.5.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.8.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (yum >= 0.5.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (erlang = 1.5.2) -> (yum-erlang_solutions = 0.2.0) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (erlang = 1.3.6) -> (yum < 3.0.0)], [(logstash = 0.7.6) -> (rabbitmq = 1.4.0) -> (erlang = {1.3.2,1.2.0,1.1.2}) -> (yum >= 0.5.0)], [(logstash = 0.7.6) -> (python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(logstash = 0.7.6) -> (python = 1.4.4) -> (yum >= 0.0.0)], [(nginx = 2.5.1) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(nginx = 2.5.1) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(nginx = 2.5.1) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(nginx = 2.5.1) -> (runit = 1.4.0) -> (yum >= 0.0.0)], [(nginx = 2.5.1) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(php = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(python = 1.4.7) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.8.5) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.8.5) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.8.5) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 2.3.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.3.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.3.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 4.0.0) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.7.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 2.2.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 2.1.2) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 2.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 2.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 2.0.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 1.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 1.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 1.0.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.10.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 0.10.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 0.10.0) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.9.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 0.9.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(rbenv = 1.7.1) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(rbenv = 1.7.1) -> (git = 0.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(rbenv = 1.7.1) -> (git = 0.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(runit = 1.5.11) -> (yum ~> 3.0)], [(runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.8.5) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.8.5) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.8.5) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.8.5) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 2.3.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.3.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.3.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.3.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 4.0.0) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.7.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 2.2.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.1.2) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.1.2) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.1.2) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 2.1.2) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 2.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 2.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 2.0.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 1.0.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 1.0.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 1.0.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 1.0.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.10.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.10.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 0.10.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 0.10.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.9.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.9.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 0.9.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.7.0) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (git = 0.7.0) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (git = 0.7.0) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(statsd = 1.1.5) -> (nodejs = 1.3.0) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (runit = 1.5.11) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (runit = 1.5.11) -> (yum-epel = 0.3.4) -> (yum ~> 3.0)], [(statsd = 1.1.5) -> (runit = 1.1.4) -> (yum >= 0.0.0)], [(statsd = 1.1.5) -> (runit = 1.4.6) -> (yum < 3.0.0)], [(virtualbox-cookbook = 1.0.3) -> (yum ~> 3.1)], [(yum = 2.4.5)]
Demand that cannot be met: (jenkins = 2.0.3)
Artifacts for which there are conflicting dependencies: yum = 2.4.5 -> []

@danielsdeleo overall the code looks great - some comments from your dev pass that you could go and strip out and that's about it!
Yeah, I expected the tests to match more closely the old Ruby solver and not Gecode, sigh. I think it's appropriate to include this as long as we are clear in the Berkshelf docs that if a solution does not match on the server based on what your client resolver thought, you should switch to gecode for compat reasons.
I like the output of a failed resolution MUCH more than what we were getting from gecode.
Aside from getting the remaining tests passing, is there anything left that you'd like to do before merging this in? I'm down to update docs and release a new major version of Solve.

@reset Things remaining to do that I can remember:

I think the code that switches engines could use a bit of improvement so that it's easier to write the code in berks that does the actual engine picking. In particular, it shouldn't just be a generic LoadError if you try to use the gecode solver and it's not available.
Remove runtime dep on dep_selector. I'm thinking to specify it as a development dependency (?)
Rename Solver to GecodeSolver
make sure the serializer works with the ruby solver

@danielsdeleo yeah I'm also good with making the Gecode solver a sort of "plugin" or "extension" to Solve which would allow you to split it into a separate gem and instead ask people to install that if they'd like the option of switching solver backends.

@reset quick question: The serializer right now only supports one kind of solver. So I can either add a type field to the json, or I could make a Solver::Problem class that has the required fields. Do you have a preference for one over the other?

@danielsdeleo I think that either approach is just fine, I would decide which based on the cost of work

Okay, I think this is good to go. I added an ::activate class method to the solvers, which will raise EngineNotAvailable if there's a missing dep. So berks should be able to do Solve.engine = :gecode and then rescue and print a warning for the case that someone gem installed berks and hasn't set a preference for the ruby solver.
I mucked with the gemspec and Gemfile a bit, making test dependencies rubygems-level development dependencies. I did that so I could add a NoGecode.gemfile and corresponding travis job. That ensures that if we accidentally create a dependency on the dep selector stuff where we don't mean to, a travis job will fail.
Also, I opted go for the Solve::Problem class in the serializer. There's a convenience method to create one directly from a solver object so it's only one more line of code to turn a solver into JSON.

@danielsdeleo this looks great! If there's nothing else that you'd like to add we can merge it in and make a new major release.

Yep, I don't have anything else I want to add. Let's go!


More interoperable propagation via extra stuff in TraceContext

Right now, you cannot use wider trace context propagation formats than B3 because there's no way to carry that data from the incoming request to any outgoing requests. For example, AWS X-Ray includes a timestamp in their trace ID format. If we lost this, we break traces.
Also, many folks have asked in various ways to carry things like request ids so that they can be accessed in custom-code or tagged in log files.
I'm resisting the term baggage as change proposed are data structure only, and "baggage" itself tends to have more implications on api. I'm intentionally punting any api changes.
Here are some use cases that could be supported by adding List<Object> TraceContext.extra() and List<Object> SamplingFlags.extra() for when there is extra stuff, but not a trace yet. I think this is the only change needed to support this, as everything else is existing apis.
Making a custom propagation handler for Amazon X-Ray
@Override public void inject(TraceContext traceContext, C carrier) {
  for (Object thing : traceContext.extra()) {
    if (thing instanceof XRayTraceContext) {
      inject(traceContext, (XRayTraceContext) thing, C carrier)
      break;
    }
  }
}

// dumbed down, but for example
void inject(TraceContext traceContext, XRayTraceContext xrayTraceContext, C carrier) {
  setter.put(carrier, "X-Amzn-Trace-Id", xrayTraceContext.root() + ";Parent=" + HexCodec.toLowerHex(traceContext.spanId()) + ";Sampled=1");
}

Adding type-safe data to a root span
// let's pretend there's a standard "debug-id" that many use regardless of trace format!
for (Object thing : span.context().extra()) {
  if (thing instanceof DebugTraceId) {
    span.tag("debug-id", thing.toString());
    break;
  }
}

Making custom propagated stuff visible without requiring people to use brave's api
// Assume Sony defines a header format for pre-defined tags, and a propagation handler
// User code wants to use PlayStationContext.currentGame() which is controlled by them
// The below facilitates propagation without pinning anyone to Brave's api.
// This means they can switch impl to any other means and no problemo.
// IOTW zero, like zero lock-in. No lock in to B3 header format.
// No lock in to a specific version of a tracer api. This is a choice not a requirement.

class PlayStationAwareCurrentTraceContext extends CurrentTraceContext {
  --snip--

  @Override public Scope newScope(TraceContext currentSpan) {
    Scope scope = delegate.newScope(currentSpan);
    Object current = findPlayStationContext(currentSpan.extra());
    if (current == null) return scope;
    final Object previous = PlayStationContext.save();
    PlayStationContext.set(current);
    return () -> {
      scope.close();
      PlayStationContext.set(previous);
    };
  }
}

Details..
For example, I can easily create a decorating propagation system. Ex new CustomPropagationFactory(Propagation.B3) where the custom one parses wider trace ids such as Amazon X-Ray. However, there's no place to store it, so when the CurrentTraceContext code executes, it would neither see nor be able to propagate that data. The impact of this is that we cannot continue a trace in such a system without breaking it.
This is a similar problem to what @nbmorgan brought up about customizing context to include application-specific keys. For example, if one wanted to make pony-currentUser, they would need to add interceptors before Brave's, duplicate the effort of propagating it in-process, finally duplicate the effort of attaching it to the outgoing requests. This could also be solved by the same tool, ex CustomPropagationFactory, if there was a place to store this custom data.
We may at some point be able to leverage or implement a baggage handler, but minimally, we need to be able to extra "extra" stuff into a read-only object, then allow injection of that stuff on the other side.
The api would need to be on TraceContext itself, and it is likely safest to use an Object as opposed to a map to describe that custom "stuff". That's because it may take the form of a data structure or binary content, which is not a Map. For example baggage buffers, or type-safe user data.
This discussion is further elaborated here, though I think the salient issue for Brave is being able to interop with other trace context formats. The fact that this also enables a limited use case of arbitrary propagation is a bonus  https://docs.google.com/document/d/1rq-oCR8gNOi2-G0GFhQJZgSZCmKkxL8jbMZCHhyj268/edit

cc @devinsba @reta @llinder

interested in this，+1。

I've only recently started thinking about the implications of interoperating with X-Ray.  I like the idea of Object instead of Map as well and the method List<Object> extra() seems like a good fit.

I came across an internal doc that has the ambition of defining an organization wide correlation ID spec that we would be expected to interact with.
My hope is that this work would support this use case.
The expectations:

If the header is on a request, forward it along downstream
If the header is not included, create a new value and forward that along down stream
Attach the value as the same header on http responses as well

This data is a UUID as currently written so I could just use it as the traceID after stripping the -s but that only solves the problem if the shape of that correlation ID doesn't change, that could happen but I don't foresee the header name changing after it is put to use so I think a variable length field is safer from my point of view

interested in this as well, envoy expects a header to be passed through for correlation, and it would be nice to propagate this header as well with the rest of them.

here's the implementation https://github.com/openzipkin/brave/pull/514

here's a working example of extra field propagation #515
you can use this to pass your favorite request ID or fields that some random reason means you need to or a trace that is incompatible with zipkin etc.  If this is popular, it could be built-in.
cc @llinder @devinsba @songxin1990  @gregdurham @jcchavezs @jkschneider @sirtyro @hyleung @takezoe

going out now in version 4.9.0


Add Georgia Cyber Academy

http://gacyber.org

@judge2020 Regrettably, we do not add online schools to this repository according the repository rules. JetBrains does not grant free licenses to online universities and schools students on the base of posessing an email from such an institution, however a teacher of an online school can apply for free classroom licenses by email to<EMAIL_ADDRESS>Please request the license by email. I am closing this request without merging. Thank you for the understanding!


[HUDI-6500] Fix bug when Using the RuntimeReplaceable function in the…

… merge into matched condition
Change Logs
Error messages will be reported when using RuntimeReplaceable functions (such as nvl) in the merge into matching conditions.
error log:
Caused by: java.lang.UnsupportedOperationException: Cannot evaluate expression: nvl(age#24, 0)
at org.apache.spark.sql.errors.QueryExecutionErrors$.cannotEvaluateExpressionError(QueryExecutionErrors.scala:79)
at org.apache.spark.sql.catalyst.expressions.Unevaluable.eval(Expression.scala:309)
at org.apache.spark.sql.catalyst.expressions.Unevaluable.eval$(Expression.scala:308)
at org.apache.spark.sql.catalyst.expressions.Nvl.eval(nullExpressions.scala:185)
at org.apache.spark.sql.catalyst.expressions.ExpressionProxy.proxyEval(SubExprEvaluationRuntime.scala:132)
at org.apache.spark.sql.catalyst.expressions.SubExprEvaluationRuntime$$anon$1.load(SubExprEvaluationRuntime.scala:46)
at org.apache.spark.sql.catalyst.expressions.SubExprEvaluationRuntime$$anon$1.load(SubExprEvaluationRuntime.scala:44)
at org.sparkproject.guava.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3599)
at org.sparkproject.guava.cache.LocalCache$Segment.loadSync(LocalCache.java:2379)
at org.sparkproject.guava.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2342)
at org.sparkproject.guava.cache.LocalCache$Segment.get(LocalCache.java:2257)
at org.sparkproject.guava.cache.LocalCache.get(LocalCache.java:4000)
for more detail info : https://issues.apache.org/jira/browse/HUDI-6500
Impact
Fix bug when Using the RuntimeReplaceable function in the merge into matched condition
Risk level (write none, low medium or high below)
Media
Documentation Update
Describe any necessary documentation update if there is any new feature, config, or user-facing change

The config description must be updated if new configs are added or the default value of the configs are changed
Any new feature or user-facing change requires updating the Hudi website. Please create a Jira ticket, attach the
ticket number here and follow the instruction to make
changes to the website.

Contributor's checklist

[ ] Read through contributor's guide
[ ] Change Logs and Impact were stated clearly
[ ] Adequate tests were added if applicable
[ ] CI passed

@hudi-bot run azure

@danny0405  Danny, thanks for your review and merge


Filter manifest to install/uninstall extensions such as serving-cert-manager, ns-cert and networking-istio

This patch supports filter function to install/uninstall extensions
such as serving-cert-manager, networking-ns-cert and istio
ingress by the configuration. It solves following two problems.
problem 1
When autoTLS is enabled in config-network, we need
namespace-wildcard-certs and cert-manager
to be deployed. However current operator does not install them.
problem 2
When we want to change ingress.class to antoher Ingress solution
instead of Istio, current operator always deploys networking-istio and
istio gateways.
To solve them, this patch filters manifest to install/uninstall
by the configuration.
e.g - when autoTLS=Enabled ingress.calss=kourier is configured w/ this PR
$ kubectl get pod  -n knative-serving
NAME                                      READY   STATUS    RESTARTS   AGE
activator-869f6d4f9f-ll75v                1/1     Running   2          87m
autoscaler-78994c9fdf-c6kmn               1/1     Running   2          87m
autoscaler-hpa-66bcf9cdc-sxt72            1/1     Running   0          87m
controller-b94c5b667-97wkl                1/1     Running   2          87m
networking-certmanager-5bfcf45d79-kc958   1/1     Running   0          21m
networking-ns-cert-5447795455-wx9pj       1/1     Running   0          21m
webhook-7cdb467d79-4jrfq                  1/1     Running   2          87m

Release Note
serving-cert-manager and networking-ns-cert are deployed when autoTLS is Enabled.
networking-istio is not deployed when ingress.class is not Istio.

/lint

/retest

/test pull-knative-serving-operator-upgrade-tests
TestProbe failed. I think it is flaky.

I'm not sure if serverless-opeator will support cert-manager, ns-cert and other ingress solutions. So I'm closing this rather than keep rebasing it.


A few edits.

I didn't look at the comments in the open PR. If you merge those, I can have another pass at this if you like.

Merged into awsvpc-docs branch as 3c45ba09f9e7a2cd311cc9ce2d272bfa3642b752


Fix for #93: does not work correctly on relations with foreign_key option

Merged and released as 0.1.30. Thank you!

Great!
It is also missing the handling of conditions option, but it gets too
difficult to follow with the relationship loop in the source and I needed
my fix asap for a bug in production.
El dia 10/02/2015 16.46, "Magnus von Koeller"<EMAIL_ADDRESS>va
escriure:

Merged and released as 0.1.30. Thank you!
—
Reply to this email directly or view it on GitHub
https://github.com/magnusvk/counter_culture/pull/94#issuecomment-73722244
.


app.Uri2Path needs deprecating

In recent versions of Android, its no longer to query the content database for the _data column (for security reasons) which makes it impossible to work out the original file path.  So we need to mark app.Uri2Path as deprecated in the docs and make sure all DS methods can cope with URI as well as absolute path.

fixed by 32b649cc3a0b9e9ef6d0ec89da948890a5f13376


regex for NAPTR

I was not be able to add a NAPTR record within dns-ui, with the pdnsutil cli (pdnsutil add-record ZONE @ NAPTR '50 50 "s" "x-eduroam:radius.tls" "" _radsec._tcp.kennisnet.eduroam.nl') this is no issue.
After making some modifications to the data-content-pattern in the zone.php file I was be able to create the record within dns-ui.
old:
<option value="NAPTR" data-content-pattern="[0-9]+\s+[0-9]+\s+"[A-Z0-9]+"\s+"[\w+]+"\s+"[^"]*"\s+\S+">NAPTR</option>
new:
<option value="NAPTR" data-content-pattern="[0-9]+\s+[0-9]+\s+"[a-zA-Z0-9]"+\s+"[\S+]+"+\s+"[\S]*"+\s+[\S]+">NAPTR</option>
I'm not sure if the new regex is causing some other issues, but for me it's working fine.

The old regexp was trying to follow the specification of RFC 2915 but I see now that this was superseded by RFC 3403.
My proposed replacement would be: [0-9]+\s+[0-9]+\s+"[A-Za-z0-9]+"\s*"[^"]*"\s+"[^"]*"\s+\S+, or in HTML-escaped form: <option value="NAPTR" data-content-pattern="[0-9]+\s+[0-9]+\s+"[A-Za-z0-9]+"\s*"[^"]*"\s+"[^"]*"\s+\S+">NAPTR</option>


Hydrogen App not starting in Local Env.

What is the location of your example repository?
https://github.com/FrederickOB/test_hydrogen_app
What version of Hydrogen are you using?
2023.1.4
What version of Remix are you using?
1.12.0
Steps to Reproduce
I create a new demo store using @shopify/create-hydrogen , after a successful setup up when I try to run it on my local machine, I keep getting an error.
Expected Behavior
See demo page in browser
Actual Behavior
getting this error
ReferenceError: URL is not defined. Attempted to access binding using global in modules. You must use the 2nd envparameter passed to exported handlers/Durable Object constructors, orcontext.env with Pages Functions.     at EventTarget.get (/Users/fred/Projects/hydrogen-storefront/node_modules/@miniflare/core/src/standards/event.ts:291:19)     at getLocaleFromRequest (/Users/fred/Projects/hydrogen-storefront/app/lib/utils.js:233:19)     at Object.fetch (/Users/fred/Projects/hydrogen-storefront/server.js:34:15)     at processTicksAndRejections (node:internal/process/task_queues:96:5)     at EventTarget.[kDispatchFetch] (/Users/fred/Projects/hydrogen-storefront/node_modules/@miniflare/core/src/standards/event.ts:385:13)     at /Users/fred/Projects/hydrogen-storefront/node_modules/@shopify/mini-oxygen/dist/mini-oxygen/server.js:115:24

I'm experiencing this behaviour as well. It only happens if I run the site via the Netlify CLI. I'm still not sure why that would cause that particular error. The only thing I can think of is it's proxying requests, so instead of port 3000 it's running on port 8888, but I still don't understand why that would cause a global class to throw. 🤔
See https://github.com/netlify/remix-compute/pull/126#issuecomment-1654623400


Left over property in NetworkManager

Describe the bug
NetworkManager has IsNetworkActive property but no other properties or functions
Expected behavior
either:

NetworkManager should only have fields for other types
or:
NetworkManager should have more helper functions/properties

Any suggestions for other helpers that could fit in NetMan?