rails_dt 0.1.4 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.yardopts +2 -0
- data/Gemfile +14 -0
- data/MIT-LICENSE +1 -1
- data/README.md +43 -135
- data/lib/dt.rb +31 -215
- data/lib/dt/config.rb +74 -0
- data/lib/dt/instance.rb +117 -0
- data/lib/rails_dt.rb +3 -2
- data/lib/rails_dt/version.rb +4 -0
- data/rails_dt.gemspec +12 -50
- data/spec/lib/dt/config_spec.rb +76 -0
- data/spec/lib/dt/instance_spec.rb +173 -0
- data/spec/lib/dt_spec.rb +14 -0
- data/spec/lib/rails_dt_spec.rb +6 -0
- data/spec/lib/spec/alias_method_matcher_spec.rb +16 -0
- data/spec/lib/spec/context_when_spec.rb +32 -0
- data/spec/lib/spec/let_m_spec.rb +104 -0
- data/spec/lib/spec/use_custom_let_spec.rb +46 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/00extend_x.rb +23 -0
- data/spec/support/alias_method_matcher.rb +20 -0
- data/spec/support/context_when.rb +39 -0
- data/spec/support/let_m.rb +27 -0
- data/spec/support/use_custom_let.rb +80 -0
- metadata +43 -52
- data/README.html +0 -171
- data/Rakefile +0 -68
- data/VERSION.yml +0 -4
- data/generators/rails_dt/USAGE +0 -11
- data/generators/rails_dt/WARNING +0 -2
- data/generators/rails_dt/rails_dt_generator.rb +0 -9
- data/generators/rails_dt/templates/INSTALL +0 -20
- data/generators/rails_dt/templates/dt.css +0 -27
- data/generators/rails_dt/templates/dt.rb +0 -4
- data/init.rb +0 -2
- data/lib/dt/action_controller_extensions.rb +0 -29
- data/lib/generators/rails_dt/USAGE +0 -11
- data/lib/generators/rails_dt/rails_dt_generator.rb +0 -9
- data/lib/generators/rails_dt/templates/INSTALL +0 -20
- data/lib/generators/rails_dt/templates/dt.css +0 -27
- data/lib/generators/rails_dt/templates/dt.rb +0 -4
data/spec/lib/dt_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
RSpec.describe DT do
|
3
|
+
subject { described_class.public_send(m) }
|
4
|
+
|
5
|
+
describe ".conf" do
|
6
|
+
let_m
|
7
|
+
it { is_expected.to be_a described_class::Config }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe ".instance" do
|
11
|
+
let_m
|
12
|
+
it { is_expected.to be_a described_class::Instance }
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
RSpec.describe "`alias_method` matcher" do
|
3
|
+
describe "klass" do
|
4
|
+
let(:klass) do
|
5
|
+
Class.new do
|
6
|
+
def is_one
|
7
|
+
end
|
8
|
+
alias_method :one?, :is_one
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { klass.new }
|
13
|
+
|
14
|
+
it { is_expected.to alias_method(:one?, :is_one) }
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
RSpec.describe ".context_when" do
|
5
|
+
context "when default" do
|
6
|
+
context_when a: 1, "b" => 2, x: "y" do
|
7
|
+
description = self.description
|
8
|
+
it { expect(description).to eq 'when {a: 1, "b"=>2, x: "y"}' }
|
9
|
+
it { expect { c }.to raise_error(NameError, /^undefined local variable or method `c'/) }
|
10
|
+
it { expect([a, b, x]).to eq [1, 2, "y"] }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when customized" do
|
15
|
+
context_when({a: 1, x: "y"}, format_proc: ->(h) { "when #{h.to_json}" }) do
|
16
|
+
description = self.description
|
17
|
+
it { expect(description).to eq 'when {"a":1,"x":"y"}' }
|
18
|
+
it { expect([a, x]).to eq [1, "y"] }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with `def` in the block" do
|
23
|
+
context_when a: 1 do
|
24
|
+
def ar
|
25
|
+
[a, 2]
|
26
|
+
end
|
27
|
+
|
28
|
+
it { expect(a).to eq 1 }
|
29
|
+
it { expect(ar).to eq [1, 2] }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
|
2
|
+
RSpec.describe ".let_m" do
|
3
|
+
describe "describe/it scope" do
|
4
|
+
describe "#some_method" do
|
5
|
+
let_m
|
6
|
+
self_m = m
|
7
|
+
it { expect(self_m).to eq :some_method }
|
8
|
+
it { expect(m).to eq :some_method }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "`let` argument handling" do
|
13
|
+
describe "#some_method" do
|
14
|
+
let_m(:x)
|
15
|
+
self_x = x
|
16
|
+
it { expect(self_x).to eq :some_method }
|
17
|
+
it { expect(x).to eq :some_method }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when invalid argument like ..." do
|
22
|
+
def self.doit
|
23
|
+
# OPTIMIZE: There's a more optimal implementation of this in `extract_to_spec.rb`.
|
24
|
+
begin; let_m; rescue ArgumentError => e; let(:message) { e.message }; end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#some_method!!" do
|
28
|
+
doit
|
29
|
+
it { expect(message).to eq "Unknown description format: \"#some_method!!\"" }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#some method" do
|
33
|
+
doit
|
34
|
+
it { expect(message).to eq "Unknown description format: \"#some method\"" }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "method" do
|
38
|
+
doit
|
39
|
+
it { expect(message).to eq "Unknown description format: \"method\"" }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when valid argument like ..." do
|
44
|
+
describe "#some_method" do
|
45
|
+
let_m
|
46
|
+
it { expect(m).to eq :some_method }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#some_method?" do
|
50
|
+
let_m
|
51
|
+
it { expect(m).to eq :some_method? }
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#some_method!" do
|
55
|
+
let_m
|
56
|
+
it { expect(m).to eq :some_method! }
|
57
|
+
end
|
58
|
+
|
59
|
+
describe ".some_method" do
|
60
|
+
let_m
|
61
|
+
it { expect(m).to eq :some_method }
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "::some_method" do
|
65
|
+
let_m
|
66
|
+
it { expect(m).to eq :some_method }
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#[]" do
|
70
|
+
let_m
|
71
|
+
it { expect(m).to eq :[] }
|
72
|
+
end
|
73
|
+
|
74
|
+
describe ".[]" do
|
75
|
+
let_m
|
76
|
+
it { expect(m).to eq :[] }
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "::[]" do
|
80
|
+
let_m
|
81
|
+
it { expect(m).to eq :[] }
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "GET some_action" do
|
85
|
+
let_m
|
86
|
+
it { expect(m).to eq :some_action }
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "POST some_action" do
|
90
|
+
let_m
|
91
|
+
it { expect(m).to eq :some_action }
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "PUT some_action" do
|
95
|
+
let_m
|
96
|
+
it { expect(m).to eq :some_action }
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "DELETE some_action" do
|
100
|
+
let_m
|
101
|
+
it { expect(m).to eq :some_action }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
RSpec.describe ".use_custom_let" do
|
3
|
+
use_custom_let(:let_a, :attrs)
|
4
|
+
|
5
|
+
describe "straight usage" do
|
6
|
+
describe "attrs" do
|
7
|
+
let_a(:name) { "Joe" }
|
8
|
+
let_a(:age) { 25 }
|
9
|
+
let(:gender) { :male }
|
10
|
+
it do
|
11
|
+
expect(name).to eq "Joe"
|
12
|
+
expect(age).to eq 25
|
13
|
+
expect(attrs).to eq(name: "Joe", age: 25)
|
14
|
+
expect(attrs(include: [:gender])).to eq(name: "Joe", age: 25, gender: :male)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "declarative (no block) usage" do
|
20
|
+
let_a(:name)
|
21
|
+
|
22
|
+
subject { attrs }
|
23
|
+
|
24
|
+
context "when no other `let` value" do
|
25
|
+
it { is_expected.to eq({}) }
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when `let`" do
|
29
|
+
let(:name) { "Joe" }
|
30
|
+
it { is_expected.to eq(name: "Joe") }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when `let_a`" do
|
34
|
+
let_a(:name) { "Joe" }
|
35
|
+
it { is_expected.to eq(name: "Joe") }
|
36
|
+
end
|
37
|
+
|
38
|
+
context_when name: "Joe" do
|
39
|
+
context_when name: "Moe" do
|
40
|
+
it { is_expected.to eq(name: "Moe") }
|
41
|
+
end
|
42
|
+
|
43
|
+
it { is_expected.to eq(name: "Joe") }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Convenience methods to extend RSpec metalanguage.
|
4
|
+
# This file must be loaded before other support files.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Kernel
|
8
|
+
def extend_describe(&block)
|
9
|
+
raise ArgumentError, "Code block must be given" unless block
|
10
|
+
|
11
|
+
::RSpec.configure do |config|
|
12
|
+
config.extend Module.new(&block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def extend_it(&block)
|
17
|
+
raise ArgumentError, "Code block must be given" unless block
|
18
|
+
|
19
|
+
::RSpec.configure do |config|
|
20
|
+
config.include Module.new(&block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Method alias matcher.
|
4
|
+
#
|
5
|
+
# describe User do
|
6
|
+
# it { is_expected.to alias_method(:admin?, :is_admin) }
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# Originally from: https://gist.github.com/1950961, but heavily reworked consistency-wise.
|
10
|
+
#
|
11
|
+
|
12
|
+
RSpec::Matchers.define :alias_method do |new_name, old_name|
|
13
|
+
match do |subject|
|
14
|
+
expect(subject.method(new_name)).to eq subject.method(old_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
description do
|
18
|
+
"have #{new_name.inspect} aliased to #{old_name.inspect}"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
extend_describe do
|
3
|
+
# Create a `context "when ..."`, with a set of let variables defined.
|
4
|
+
#
|
5
|
+
# context_when a: 1, x: "y" do
|
6
|
+
# it { expect(a).to eq 1 } # Success.
|
7
|
+
# it { expect(x).to eq "y" } # Success.
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# , is identical to:
|
11
|
+
#
|
12
|
+
# context "when {a: 1, x: \"y\"}" do
|
13
|
+
# let(:a) { 1 }
|
14
|
+
# let(:x) { "y" }
|
15
|
+
# ...
|
16
|
+
#
|
17
|
+
# @param h [Hash]
|
18
|
+
# @param format_proc [Proc]
|
19
|
+
# @return [void]
|
20
|
+
def context_when(h, format_proc: context_when_default_format_proc, &block)
|
21
|
+
context format_proc[h] do
|
22
|
+
h.each do |k, v|
|
23
|
+
let(k) { v }
|
24
|
+
end
|
25
|
+
class_eval(&block)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Default <tt>format_proc</tt> for {.context_when}.
|
30
|
+
# @return [Proc]
|
31
|
+
# @see .context_when
|
32
|
+
def context_when_default_format_proc
|
33
|
+
->(h) do
|
34
|
+
# Primitive readability hack. Might screw string values, too.
|
35
|
+
inspected = h.inspect.gsub(/:(\w+)=>/, "\\1: ")
|
36
|
+
"when #{inspected}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
extend_describe do
|
3
|
+
# Add a variable, named <tt>m</tt> by default, containing the symbolized method name from the
|
4
|
+
# description. Example:
|
5
|
+
#
|
6
|
+
# describe "#some_method" do
|
7
|
+
# let_m
|
8
|
+
#
|
9
|
+
# , is identical to:
|
10
|
+
#
|
11
|
+
# describe "#some_method" do
|
12
|
+
# let(:m) { :some_method }
|
13
|
+
# def self.m; :some_method; end
|
14
|
+
#
|
15
|
+
# @param let [Symbol] Name of the variable to create.
|
16
|
+
# @return [void]
|
17
|
+
def let_m(let = :m)
|
18
|
+
if (mat = (description = self.description).match(/^(?:(?:#|\.|::)(\w+(?:\?|!|)|\[\])|(?:DELETE|GET|PUT|POST) (\w+))$/))
|
19
|
+
s = mat[1] || mat[2]
|
20
|
+
sym = s.to_sym
|
21
|
+
let(let) { sym }
|
22
|
+
define_singleton_method(let) { sym }
|
23
|
+
else
|
24
|
+
raise ArgumentError, "Unknown description format: #{description.inspect}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
|
2
|
+
extend_describe do
|
3
|
+
# Define methods to manage of <tt>let</tt> variables which act as a distinct subset.
|
4
|
+
#
|
5
|
+
# RSpec.describe SomeKlass do
|
6
|
+
# use_custom_let(:let_a, :attrs) # (1)
|
7
|
+
# use_custom_let(:let_p, :params) # (2)
|
8
|
+
# ...
|
9
|
+
#
|
10
|
+
# In above examples, (1) provides our suite with:
|
11
|
+
#
|
12
|
+
# def self.let_a(let, &block)
|
13
|
+
# def attrs(include: [])
|
14
|
+
#
|
15
|
+
# , thus this now becomes possible:
|
16
|
+
#
|
17
|
+
# describe "attrs" do
|
18
|
+
# let_a(:name) { "Joe" }
|
19
|
+
# let_a(:age) { 25 }
|
20
|
+
# let(:gender) { :male }
|
21
|
+
# it do
|
22
|
+
# expect(name).to eq "Joe"
|
23
|
+
# expect(age).to eq 25
|
24
|
+
# expect(attrs).to eq(name: "Joe", age: 25)
|
25
|
+
# expect(attrs(include: [:gender])).to eq(name: "Joe", age: 25, gender: :male)
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# By not providing a block it's possible to <b>declare</b> a custom <tt>let</tt> variable
|
30
|
+
# and be able to redefine it later via regular <tt>let</tt>. This will work:
|
31
|
+
#
|
32
|
+
# describe "declarative (no block) usage" do
|
33
|
+
# let_a(:name)
|
34
|
+
#
|
35
|
+
# subject { attrs }
|
36
|
+
#
|
37
|
+
# context "when no other `let` value" do
|
38
|
+
# it { is_expected.to eq({}) }
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# context "when `let`" do
|
42
|
+
# let(:name) { "Joe" }
|
43
|
+
# it { is_expected.to eq(name: "Joe") }
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# NOTE: At the moment the feature only works if <tt>use_custom_let</tt> is invoked from a
|
48
|
+
# top-level (<tt>RSpec.describe</tt>) context. Correct usage in sub-context is yet not possible.
|
49
|
+
def use_custom_let(let_method, collection_method)
|
50
|
+
class_eval %{
|
51
|
+
def self.#{let_method}(let, &block)
|
52
|
+
#{let_method}_keys << let
|
53
|
+
let(let, &block) if block
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.#{let_method}_keys
|
57
|
+
@#{let_method}_keys ||= []
|
58
|
+
end
|
59
|
+
|
60
|
+
# OPTIMIZE: Consider removing `include:` altogether as we've got declarative mode now.
|
61
|
+
def #{collection_method}(include: [])
|
62
|
+
# NOTE: We don't store computation in a @variable since we have an argument. The result
|
63
|
+
# may vary.
|
64
|
+
begin
|
65
|
+
keys, klass = include, self.class
|
66
|
+
begin
|
67
|
+
keys += klass.#{let_method}_keys
|
68
|
+
end while (klass = klass.superclass) < RSpec::Core::ExampleGroup
|
69
|
+
# NOTE: `< RSpec::Core::ExampleGroup` is probably the reason why we can't use this in
|
70
|
+
# sub-contexts. The need for such use is highly questionable since this feature in
|
71
|
+
# effect extends RSpec syntax.
|
72
|
+
|
73
|
+
{}.tap do |_|
|
74
|
+
keys.uniq.each { |k| begin; _[k] = public_send(k); rescue NoMethodError; end }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
} # class_eval
|
79
|
+
end
|
80
|
+
end
|
metadata
CHANGED
@@ -1,77 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_dt
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.1.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Alex Fortuna
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-07-13 00:00:00 +04:00
|
14
|
-
default_executable:
|
11
|
+
date: 2018-03-23 00:00:00.000000000 Z
|
15
12
|
dependencies: []
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- fortunadze@gmail.com
|
19
16
|
executables: []
|
20
|
-
|
21
17
|
extensions: []
|
22
|
-
|
23
|
-
|
24
|
-
-
|
25
|
-
-
|
26
|
-
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- ".yardopts"
|
22
|
+
- Gemfile
|
27
23
|
- MIT-LICENSE
|
28
|
-
- README.html
|
29
24
|
- README.md
|
30
|
-
- Rakefile
|
31
|
-
- VERSION.yml
|
32
|
-
- generators/rails_dt/USAGE
|
33
|
-
- generators/rails_dt/WARNING
|
34
|
-
- generators/rails_dt/rails_dt_generator.rb
|
35
|
-
- generators/rails_dt/templates/INSTALL
|
36
|
-
- generators/rails_dt/templates/dt.css
|
37
|
-
- generators/rails_dt/templates/dt.rb
|
38
|
-
- init.rb
|
39
25
|
- lib/dt.rb
|
40
|
-
- lib/dt/
|
41
|
-
- lib/
|
42
|
-
- lib/generators/rails_dt/rails_dt_generator.rb
|
43
|
-
- lib/generators/rails_dt/templates/INSTALL
|
44
|
-
- lib/generators/rails_dt/templates/dt.css
|
45
|
-
- lib/generators/rails_dt/templates/dt.rb
|
26
|
+
- lib/dt/config.rb
|
27
|
+
- lib/dt/instance.rb
|
46
28
|
- lib/rails_dt.rb
|
29
|
+
- lib/rails_dt/version.rb
|
47
30
|
- rails_dt.gemspec
|
48
|
-
|
31
|
+
- spec/lib/dt/config_spec.rb
|
32
|
+
- spec/lib/dt/instance_spec.rb
|
33
|
+
- spec/lib/dt_spec.rb
|
34
|
+
- spec/lib/rails_dt_spec.rb
|
35
|
+
- spec/lib/spec/alias_method_matcher_spec.rb
|
36
|
+
- spec/lib/spec/context_when_spec.rb
|
37
|
+
- spec/lib/spec/let_m_spec.rb
|
38
|
+
- spec/lib/spec/use_custom_let_spec.rb
|
39
|
+
- spec/spec_helper.rb
|
40
|
+
- spec/support/00extend_x.rb
|
41
|
+
- spec/support/alias_method_matcher.rb
|
42
|
+
- spec/support/context_when.rb
|
43
|
+
- spec/support/let_m.rb
|
44
|
+
- spec/support/use_custom_let.rb
|
49
45
|
homepage: http://github.com/dadooda/rails_dt
|
50
46
|
licenses: []
|
51
|
-
|
47
|
+
metadata: {}
|
52
48
|
post_install_message:
|
53
49
|
rdoc_options: []
|
54
|
-
|
55
|
-
require_paths:
|
50
|
+
require_paths:
|
56
51
|
- lib
|
57
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
-
|
59
|
-
requirements:
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
60
54
|
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version:
|
63
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
-
|
65
|
-
requirements:
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
66
59
|
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version:
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
69
62
|
requirements: []
|
70
|
-
|
71
63
|
rubyforge_project:
|
72
|
-
rubygems_version:
|
64
|
+
rubygems_version: 2.5.2
|
73
65
|
signing_key:
|
74
|
-
specification_version:
|
75
|
-
summary: Rails
|
66
|
+
specification_version: 4
|
67
|
+
summary: Ruby/Rails debug toolkit
|
76
68
|
test_files: []
|
77
|
-
|