attr_extras 6.2.4 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4f8e12f94bbc166632e1a65a52f83ddc14e4982ad57f87043fa285e7e7a8cf2
4
- data.tar.gz: 1d621e46616f5df763909d9481f983d60fe4e014a8a9a3b0dbfc2635d8867d71
3
+ metadata.gz: e5fd3ea490025e4ed3942658efff5b14335b261d843dead16fedd3f75fe9ca2c
4
+ data.tar.gz: 1adcf6c8e345de200ba9d0798caa4d996a62fb76ebcbe4ad2d167a996e98dacd
5
5
  SHA512:
6
- metadata.gz: 44cade5ed299c18a1e8c01706e04767f1b49f3a934a53759542702fd6435c8ba225b360250dd276a78174fdea32e112ca1155cf20e172db765940ea05ecb3b03
7
- data.tar.gz: 7fe165a6de71503666cb3344478c769385d50a31ca11de78cce7f934d87393867a5e2c3bc05703c7a3fdc86dd81da729703452c35d0999600f70b42a35851629
6
+ metadata.gz: ba168966ed66c2369fd23e1a11505ea06b0c559ce874492ec9744240505d6fbc3af2a13fc91b0e4ed4b51ff0768fd67c51fb24b6ed2ae5181fe71194ce304159
7
+ data.tar.gz: 37696980e733441e426e0102e2e8473b61206ef95be7a761197d5ed41571f2ead7304313a8c49d810b00eed4f21b485be1b0011ef3e5aa77a2efdde32852a598
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ # Check for updates to GitHub Actions every weekday
8
+ interval: "daily"
@@ -0,0 +1,26 @@
1
+ name: Ruby CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ matrix:
16
+ ruby-version: [3.1, "3.0", 2.7, jruby-head]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v3
20
+ - name: Set up Ruby ${{ matrix.ruby-version }}
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby-version }}
24
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
25
+ - name: Run tests
26
+ run: bundle exec rake
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "tmp/**/*"
4
+ inherit_gem:
5
+ barsoom_utils: shared_rubocop.yml
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [7.0.0](https://github.com/barsoom/attr_extras/releases/tag/v7.0.0)
4
+
5
+ - Drop end-of-lifed Ruby 2.5 and 2.6.
6
+ - Don't share default value object instances. (We now do a shallow `dup`.) Thanks to [sammo1235](https://github.com/barsoom/attr_extras/pull/46)!
7
+
3
8
  ## [6.2.4](https://github.com/barsoom/attr_extras/releases/tag/v6.2.4)
4
9
 
5
10
  - Fix keyword argument warnings with Ruby 2.7. Thanks to [Elliot Winkler](https://github.com/barsoom/attr_extras/pull/34)!
data/Gemfile CHANGED
@@ -1,4 +1,12 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in attr_extras.gemspec
4
4
  gemspec
5
+
6
+ group :development, :test do
7
+ gem "barsoom_utils"
8
+ gem "m" # Running individual tests.
9
+ gem "minitest"
10
+ gem "rake"
11
+ gem "rubocop"
12
+ end
data/README.md CHANGED
@@ -1,22 +1,31 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/attr_extras.svg)](https://badge.fury.io/rb/attr_extras)
2
- [![Build status](https://secure.travis-ci.org/barsoom/attr_extras.svg)](https://travis-ci.org/#!/barsoom/attr_extras/builds)
2
+ [![Ruby CI](https://github.com/barsoom/attr_extras/actions/workflows/ci.yml/badge.svg)](https://github.com/barsoom/attr_extras/actions/workflows/ci.yml)
3
3
  [![Code Climate](https://codeclimate.com/github/barsoom/attr_extras/badges/gpa.svg)](https://codeclimate.com/github/barsoom/attr_extras)
4
4
 
5
5
  # attr\_extras
6
6
 
7
7
  Takes some boilerplate out of Ruby, lowering the barrier to extracting small focused classes, without [the downsides of using `Struct`](http://thepugautomatic.com/2013/08/struct-inheritance-is-overused/).
8
8
 
9
+ Provides lower-level methods like `attr_private` and `attr_value` that nicely complement Ruby's built-in `attr_accessor`, `attr_reader` and `attr_writer`.
10
+
11
+ Also higher-level ones like `pattr_initialize` (or `attr_private_initialize`) and `method_object` to really cut down on the boilerplate.
12
+
9
13
  Instead of
10
14
 
11
15
  ``` ruby
12
- class InvoiceBuilder
13
- def initialize(invoice, employee)
14
- @invoice, @employee = invoice, employee
16
+ class InvoicePolicy
17
+ def initialize(invoice, company:)
18
+ @invoice = invoice
19
+ @company = company
20
+ end
21
+
22
+ def payable?
23
+ some_logic(invoice, company)
15
24
  end
16
25
 
17
26
  private
18
27
 
19
- attr_reader :invoice, :employee
28
+ attr_reader :invoice, :company
20
29
  end
21
30
  ```
22
31
 
@@ -24,11 +33,58 @@ you can just do
24
33
 
25
34
  ``` ruby
26
35
  class InvoiceBuilder
27
- pattr_initialize :invoice, :employee
36
+ pattr_initialize :invoice, [:company!]
37
+
38
+ def payable?
39
+ some_logic(invoice, company)
40
+ end
41
+ end
42
+ ```
43
+
44
+ And instead of
45
+
46
+ ``` ruby
47
+ class PayInvoice
48
+ def self.call(invoice, amount)
49
+ new(invoice, amount).call
50
+ end
51
+
52
+ def initialize(invoice, amount)
53
+ @invoice = invoice
54
+ @amount = amount
55
+ end
56
+
57
+ def call
58
+ PaymentGateway.charge(invoice.id, amount_in_cents)
59
+ end
60
+
61
+ private
62
+
63
+ def amount_in_cents
64
+ amount * 100
65
+ end
66
+
67
+ attr_reader :invoice, :amount
28
68
  end
29
69
  ```
30
70
 
31
- This nicely complements Ruby's built-in `attr_accessor`, `attr_reader` and `attr_writer`.
71
+ you can just do
72
+
73
+ ``` ruby
74
+ class PayInvoice
75
+ method_object :invoice, :amount
76
+
77
+ def call
78
+ PaymentGateway.charge(invoice.id, amount_in_cents)
79
+ end
80
+
81
+ private
82
+
83
+ def amount_in_cents
84
+ amount * 100
85
+ end
86
+ end
87
+ ```
32
88
 
33
89
  Supports positional arguments as well as optional and required keyword arguments.
34
90
 
@@ -461,17 +517,6 @@ You can run an individual test using the [m](https://github.com/qrush/m) gem:
461
517
  The tests are intentionally split into two test suites for reasons described in `Rakefile`.
462
518
 
463
519
 
464
- ## Contributors
465
-
466
- * [Henrik Nyh](https://github.com/henrik)
467
- * [Joakim Kolsjö](https://github.com/joakimk)
468
- * [Victor Arias](https://github.com/victorarias)
469
- * [Teo Ljungberg](https://github.com/teoljungberg)
470
- * [Kim Persson](https://github.com/lavinia)
471
- * [Joe Ferris](https://github.com/jferris)
472
- * [Julien Vanier](https://github.com/monkbroc)
473
-
474
-
475
520
  ## License
476
521
 
477
522
  [MIT](LICENSE.txt)
data/attr_extras.gemspec CHANGED
@@ -2,22 +2,17 @@
2
2
  require File.expand_path("../lib/attr_extras/version", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Henrik Nyh", "Joakim Kolsjö", "Tomas Skogberg", "Victor Arias", "Ola K"]
6
- gem.email = ["henrik@nyh.se"]
5
+ gem.authors = [ "Henrik Nyh", "Joakim Kolsjö", "Tomas Skogberg", "Victor Arias", "Ola K" ]
6
+ gem.email = [ "henrik@nyh.se" ]
7
7
  gem.summary = %q{Takes some boilerplate out of Ruby with methods like attr_initialize.}
8
8
  gem.homepage = "https://github.com/barsoom/attr_extras"
9
9
 
10
10
  gem.files = `git ls-files`.split($\)
11
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
11
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "attr_extras"
14
- gem.require_paths = ["lib"]
14
+ gem.require_paths = [ "lib" ]
15
15
  gem.license = "MIT"
16
16
  gem.version = AttrExtras::VERSION
17
-
18
- gem.add_development_dependency "minitest", ">= 5"
19
- gem.add_development_dependency "m", "~> 1.5.1" # Running individual tests.
20
-
21
- # For Travis CI.
22
- gem.add_development_dependency "rake"
17
+ gem.metadata = { "rubygems_mfa_required" => "true" }
23
18
  end
@@ -1,6 +1,7 @@
1
1
  class AttrExtras::AttrImplement
2
2
  def initialize(klass, names)
3
- @klass, @names = klass, names.dup
3
+ @klass = klass
4
+ @names = names.dup
4
5
  end
5
6
 
6
7
  def apply
@@ -2,7 +2,9 @@ require "attr_extras/params_builder"
2
2
 
3
3
  class AttrExtras::AttrInitialize
4
4
  def initialize(klass, names, block)
5
- @klass, @names, @block = klass, names, block
5
+ @klass = klass
6
+ @names = names
7
+ @block = block
6
8
  end
7
9
 
8
10
  attr_reader :klass, :names
@@ -19,13 +21,13 @@ class AttrExtras::AttrInitialize
19
21
  validate_args = method(:validate_args)
20
22
 
21
23
  klass.send(:define_method, :initialize) do |*values|
22
- hash_values = (values[(klass_params.positional_args.length)..-1] || []).inject(:merge) || {}
24
+ hash_values = (values[(klass_params.positional_args.length)..-1] || []).reduce(:merge) || {}
23
25
 
24
26
  validate_arity.call(values.length, self.class)
25
27
  validate_args.call(values, klass_params)
26
28
 
27
29
  klass_params.default_values.each do |name, default_value|
28
- instance_variable_set("@#{name}", default_value)
30
+ instance_variable_set("@#{name}", default_value.dup)
29
31
  end
30
32
 
31
33
  klass_params.positional_args.zip(values).each do |name, value|
@@ -55,7 +57,7 @@ class AttrExtras::AttrInitialize
55
57
  end
56
58
 
57
59
  def validate_args(values, klass_params)
58
- hash_values = values[(klass_params.positional_args.length)..-1].inject(:merge) || {}
60
+ hash_values = values[(klass_params.positional_args.length)..-1].reduce(:merge) || {}
59
61
  unknown_keys = hash_values.keys - klass_params.hash_args_names
60
62
 
61
63
  if unknown_keys.any?
@@ -1,6 +1,7 @@
1
1
  class AttrExtras::AttrValue
2
2
  def initialize(klass, *names)
3
- @klass, @names = klass, names
3
+ @klass = klass
4
+ @names = names
4
5
  end
5
6
 
6
7
  attr_reader :klass, :names
@@ -25,13 +25,13 @@ module AttrExtras
25
25
  end
26
26
 
27
27
  def hash_args_required
28
- @hash_args_required ||= hash_args.select { |name| name.to_s.end_with?(REQUIRED_SIGN) }.
29
- map { |name| remove_required_sign(name) }
28
+ @hash_args_required ||= hash_args.select { |name| name.to_s.end_with?(REQUIRED_SIGN) }
29
+ .map { |name| remove_required_sign(name) }
30
30
  end
31
31
 
32
32
  def default_values
33
33
  @default_values ||= begin
34
- default_values_hash = names.flatten.select { |name| name.is_a?(Hash) }.inject(:merge) || {}
34
+ default_values_hash = names.flatten.select { |name| name.is_a?(Hash) }.reduce(:merge) || {}
35
35
 
36
36
  default_values_hash.map { |name, value|
37
37
  [ remove_required_sign(name), value ]
@@ -1,7 +1,8 @@
1
1
  module AttrExtras::Utils
2
2
  def self.flat_names(names)
3
- names.flatten.
4
- flat_map { |x| x.is_a?(Hash) ? x.keys : x }.
5
- map { |x| x.to_s.sub(/!\z/, "") }
3
+ names
4
+ .flatten
5
+ .flat_map { |x| x.is_a?(Hash) ? x.keys : x }
6
+ .map { |x| x.to_s.sub(/!\z/, "") }
6
7
  end
7
8
  end
@@ -1,3 +1,3 @@
1
1
  module AttrExtras
2
- VERSION = "6.2.4"
2
+ VERSION = "7.0.0"
3
3
  end
@@ -65,4 +65,29 @@ describe Object, ".aattr_initialize" do
65
65
 
66
66
  _(example.foo).must_equal "Foo"
67
67
  end
68
+
69
+ it "does not use the same default value object across class instances" do
70
+ klass = Class.new do
71
+ aattr_initialize [:name, items: []]
72
+ end
73
+
74
+ data = [
75
+ { name: "One", items: [1, 2, 3] },
76
+ { name: "Two", items: [4, 5, 6] },
77
+ ]
78
+
79
+ results = data.each_with_object([]) do |datum, results|
80
+ name, items = datum.values_at(:name, :items)
81
+ foo = klass.new(name: name)
82
+
83
+ items.each do |n|
84
+ foo.items << n
85
+ end
86
+
87
+ results << foo
88
+ end
89
+
90
+ _(results.first.items).must_equal [1, 2, 3]
91
+ _(results.last.items).must_equal [4, 5, 6]
92
+ end
68
93
  end
@@ -13,7 +13,7 @@ describe Object, ".attr_implement" do
13
13
 
14
14
  it "allows specifying arity and argument names" do
15
15
  klass = Class.new do
16
- attr_implement :foo, [:name, :age]
16
+ attr_implement :foo, [ :name, :age ]
17
17
  end
18
18
 
19
19
  example = klass.new
@@ -80,7 +80,7 @@ end
80
80
  describe Object, ".cattr_implement" do
81
81
  it "applies to class methods" do
82
82
  klass = Class.new do
83
- cattr_implement :foo, [:name, :age]
83
+ cattr_implement :foo, [ :name, :age ]
84
84
  end
85
85
 
86
86
  exception = _(lambda { klass.foo(1, 2) }).must_raise AttrExtras::MethodNotImplementedError
@@ -24,7 +24,7 @@ describe Object, ".attr_initialize" do
24
24
 
25
25
  it "can set ivars from a hash" do
26
26
  klass = Class.new do
27
- attr_initialize :foo, [:bar, :baz]
27
+ attr_initialize :foo, [ :bar, :baz ]
28
28
  end
29
29
 
30
30
  example = klass.new("Foo", bar: "Bar", baz: "Baz")
@@ -35,7 +35,7 @@ describe Object, ".attr_initialize" do
35
35
 
36
36
  it "can set default values for keyword arguments" do
37
37
  klass = Class.new do
38
- attr_initialize :foo, [:bar, baz: "default baz"]
38
+ attr_initialize :foo, [ :bar, baz: "default baz" ]
39
39
  end
40
40
 
41
41
  example = klass.new("Foo", bar: "Bar")
@@ -49,7 +49,7 @@ describe Object, ".attr_initialize" do
49
49
 
50
50
  it "treats hash values as optional" do
51
51
  klass = Class.new do
52
- attr_initialize :foo, [:bar, :baz]
52
+ attr_initialize :foo, [ :bar, :baz ]
53
53
  end
54
54
 
55
55
  example = klass.new("Foo", bar: "Bar")
@@ -61,7 +61,7 @@ describe Object, ".attr_initialize" do
61
61
 
62
62
  it "can require hash values" do
63
63
  klass = Class.new do
64
- attr_initialize [:optional, :required!]
64
+ attr_initialize [ :optional, :required! ]
65
65
  end
66
66
 
67
67
  example = klass.new(required: "X")
@@ -72,7 +72,7 @@ describe Object, ".attr_initialize" do
72
72
 
73
73
  it "complains about unknown hash values" do
74
74
  klass = Class.new do
75
- attr_initialize :foo, [:bar, :baz!]
75
+ attr_initialize :foo, [ :bar, :baz! ]
76
76
  end
77
77
 
78
78
  # Should not raise.
@@ -85,7 +85,7 @@ describe Object, ".attr_initialize" do
85
85
  # Regression.
86
86
  it "assigns hash values to positional arguments even when there's also hash arguments" do
87
87
  klass = Class.new do
88
- attr_initialize :foo, [:bar]
88
+ attr_initialize :foo, [ :bar ]
89
89
  end
90
90
 
91
91
  # Should not raise.
@@ -95,7 +95,7 @@ describe Object, ".attr_initialize" do
95
95
  # Regression.
96
96
  it "only looks at hash arguments when determining missing required keys" do
97
97
  klass = Class.new do
98
- attr_initialize :foo, [:bar!]
98
+ attr_initialize :foo, [ :bar! ]
99
99
  end
100
100
 
101
101
  # Provides a hash to "foo" but does not provide "bar".
@@ -4,7 +4,7 @@ describe AttrExtras::AttrInitialize::ParamsBuilder do
4
4
  subject { AttrExtras::AttrInitialize::ParamsBuilder.new(names) }
5
5
 
6
6
  describe "when positional and hash params are present" do
7
- let(:names) { [ :foo, :bar, [ :baz, :qux!, quux: "Quux" ]] }
7
+ let(:names) { [ :foo, :bar, [ :baz, :qux!, quux: "Quux" ] ] }
8
8
 
9
9
  it "properly devides params by the type" do
10
10
  _(subject.positional_args).must_equal [ :foo, :bar ]
@@ -16,7 +16,7 @@ describe AttrExtras::AttrInitialize::ParamsBuilder do
16
16
  end
17
17
 
18
18
  describe "when only positional params are present" do
19
- let(:names) { [ :foo, :bar] }
19
+ let(:names) { [ :foo, :bar ] }
20
20
 
21
21
  it "properly devides params by the type" do
22
22
  _(subject.positional_args).must_equal [ :foo, :bar ]
@@ -28,7 +28,7 @@ describe AttrExtras::AttrInitialize::ParamsBuilder do
28
28
  end
29
29
 
30
30
  describe "when only hash params are present" do
31
- let(:names) { [[ { baz: "Baz" }, :qux!, { quux: "Quux" } ]] }
31
+ let(:names) { [ [ { baz: "Baz" }, :qux!, { quux: "Quux" } ] ] }
32
32
 
33
33
  it "properly devides params by the type" do
34
34
  _(subject.positional_args).must_be_empty
@@ -12,7 +12,7 @@ describe Object, ".pattr_initialize" do
12
12
 
13
13
  it "works with hash ivars" do
14
14
  klass = Class.new do
15
- pattr_initialize :foo, [:bar, :baz!]
15
+ pattr_initialize :foo, [ :bar, :baz! ]
16
16
  end
17
17
 
18
18
  example = klass.new("Foo", bar: "Bar", baz: "Baz")
@@ -13,7 +13,7 @@ describe AttrExtras::Utils do
13
13
  end
14
14
 
15
15
  it "flattens hash arguments with defaults and strips any bangs" do
16
- _(AttrExtras::Utils.flat_names([ :foo, [ bar: "Bar", baz!: "Baz"] ])).must_equal [ "foo", "bar", "baz" ]
16
+ _(AttrExtras::Utils.flat_names([ :foo, [ bar: "Bar", baz!: "Baz" ] ])).must_equal [ "foo", "bar", "baz" ]
17
17
  end
18
18
  end
19
19
  end
@@ -15,7 +15,7 @@ describe Object, ".vattr_initialize" do
15
15
 
16
16
  it "works with hash ivars" do
17
17
  klass = Class.new do
18
- vattr_initialize :foo, [:bar, :baz!]
18
+ vattr_initialize :foo, [ :bar, :baz! ]
19
19
  end
20
20
 
21
21
  example1 = klass.new("Foo", bar: "Bar", baz: "Baz")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_extras
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.2.4
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henrik Nyh
@@ -12,50 +12,8 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2020-06-08 00:00:00.000000000 Z
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: minitest
19
- requirement: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: '5'
24
- type: :development
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- version: '5'
31
- - !ruby/object:Gem::Dependency
32
- name: m
33
- requirement: !ruby/object:Gem::Requirement
34
- requirements:
35
- - - "~>"
36
- - !ruby/object:Gem::Version
37
- version: 1.5.1
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - "~>"
43
- - !ruby/object:Gem::Version
44
- version: 1.5.1
45
- - !ruby/object:Gem::Dependency
46
- name: rake
47
- requirement: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- version: '0'
52
- type: :development
53
- prerelease: false
54
- version_requirements: !ruby/object:Gem::Requirement
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: '0'
15
+ date: 2022-11-10 00:00:00.000000000 Z
16
+ dependencies: []
59
17
  description:
60
18
  email:
61
19
  - henrik@nyh.se
@@ -63,8 +21,10 @@ executables: []
63
21
  extensions: []
64
22
  extra_rdoc_files: []
65
23
  files:
24
+ - ".github/dependabot.yml"
25
+ - ".github/workflows/ci.yml"
66
26
  - ".gitignore"
67
- - ".travis.yml"
27
+ - ".rubocop.yml"
68
28
  - CHANGELOG.md
69
29
  - Gemfile
70
30
  - LICENSE.txt
@@ -102,7 +62,8 @@ files:
102
62
  homepage: https://github.com/barsoom/attr_extras
103
63
  licenses:
104
64
  - MIT
105
- metadata: {}
65
+ metadata:
66
+ rubygems_mfa_required: 'true'
106
67
  post_install_message:
107
68
  rdoc_options: []
108
69
  require_paths:
@@ -118,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
79
  - !ruby/object:Gem::Version
119
80
  version: '0'
120
81
  requirements: []
121
- rubygems_version: 3.1.2
82
+ rubygems_version: 3.3.20
122
83
  signing_key:
123
84
  specification_version: 4
124
85
  summary: Takes some boilerplate out of Ruby with methods like attr_initialize.
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.7.1
4
- - 2.6.6
5
- - 2.5.8
6
- - jruby-head