pdd 0.15.4 → 0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/.rultor.yml +2 -2
- data/.travis.yml +1 -1
- data/README.md +34 -8
- data/bin/pdd +5 -5
- data/features/step_definitions/steps.rb +10 -10
- data/lib/pdd.rb +4 -4
- data/lib/pdd/rule/duplicates.rb +6 -5
- data/lib/pdd/rule/roles.rb +7 -7
- data/lib/pdd/source.rb +11 -11
- data/lib/pdd/sources.rb +1 -1
- data/lib/pdd/version.rb +1 -1
- data/pdd.gemspec +8 -8
- data/test/test_pdd.rb +2 -2
- data/test/test_source.rb +2 -2
- metadata +21 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ccf65c43c8c73f60aacdb97b18fb0e1aa1d8a95
|
4
|
+
data.tar.gz: 0816acf8952b943efe05cb6f7d0bde9e80240b06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: feb1ce6850ca49b79f1f1c24450c7a3a10e457d9d61f59f7fb50a216be0f7997f22d6d293c50792267d5adb56354d9353c28d35abfc883db689f0b4bf9242e79
|
7
|
+
data.tar.gz: 164f86ac91279090b113b712d773bfc721b5b6f2f6b263b2ba4160301c8c564f3847a1422feb4a2f2e7e8df2fe7a3a77d2629714f91f198a19e23fa4ee4a60a7
|
data/.rubocop.yml
CHANGED
data/.rultor.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
assets:
|
2
|
-
rubygems.yml:
|
3
|
-
s3cfg:
|
2
|
+
rubygems.yml: teamed/home#assets/rubygems.yml
|
3
|
+
s3cfg: teamed/home#assets/s3cfg
|
4
4
|
install: |
|
5
5
|
sudo apt-get update
|
6
6
|
sudo apt-get install -y --fix-missing libmagic1 libmagic-dev
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
[![Made By Teamed.io](http://img.teamed.io/btn.svg)](http://www.teamed.io)
|
2
2
|
[![DevOps By Rultor.com](http://www.rultor.com/b/teamed/pdd)](http://www.rultor.com/p/teamed/pdd)
|
3
|
+
[![We recommend RubyMine](http://img.teamed.io/rubymine-recommend.svg)](https://www.jetbrains.com/ruby/)
|
3
4
|
|
4
5
|
[![Build Status](https://travis-ci.org/teamed/pdd.svg)](https://travis-ci.org/teamed/pdd)
|
5
6
|
[![Build status](https://ci.appveyor.com/api/projects/status/pojnoa1bp7t2ecbr?svg=true)](https://ci.appveyor.com/project/yegor256/pdd)
|
@@ -8,13 +9,36 @@
|
|
8
9
|
[![Code Climate](http://img.shields.io/codeclimate/github/teamed/pdd.svg)](https://codeclimate.com/github/teamed/pdd)
|
9
10
|
[![Coverage Status](https://img.shields.io/coveralls/teamed/pdd.svg)](https://coveralls.io/r/teamed/pdd)
|
10
11
|
|
11
|
-
|
12
|
+
## What This is for?
|
13
|
+
|
14
|
+
Read this article about
|
15
|
+
[Puzzle Driven Development](http://www.yegor256.com/2009/03/04/pdd.html).
|
16
|
+
Check also patent application [US 12/840,306](http://www.google.com/patents/US20120023476)
|
17
|
+
|
18
|
+
## How to Install?
|
19
|
+
|
20
|
+
Install it first (Debian Linux):
|
12
21
|
|
13
22
|
```bash
|
14
|
-
$ apt-get install -y libmagic1 libmagic-dev ruby-dev
|
23
|
+
$ apt-get install -y libmagic1 libmagic-dev zlib1g-dev ruby-dev
|
24
|
+
$ gem install pdd
|
25
|
+
```
|
26
|
+
|
27
|
+
On RedHat:
|
28
|
+
|
29
|
+
```bash
|
30
|
+
$ yum install -y libmagic1 libmagic-dev zlib1g-dev ruby-dev
|
31
|
+
$ gem install pdd
|
32
|
+
```
|
33
|
+
|
34
|
+
On OSX and Windows, just that:
|
35
|
+
|
36
|
+
```
|
15
37
|
$ gem install pdd
|
16
38
|
```
|
17
39
|
|
40
|
+
## How to Run?
|
41
|
+
|
18
42
|
Run it locally and read its output:
|
19
43
|
|
20
44
|
```bash
|
@@ -43,11 +67,15 @@ Possible formats of puzzle markers:
|
|
43
67
|
#678:40m/DEV
|
44
68
|
```
|
45
69
|
|
46
|
-
|
47
|
-
|
48
|
-
|
70
|
+
You can exclude certain files from the search, for example:
|
71
|
+
|
72
|
+
```bash
|
73
|
+
pdd --exclude=src/**/*.java --exclude=target/**/*
|
74
|
+
pdd --exclude=src/**/*.java # exclude .java files in src/
|
75
|
+
pdd --exclude=src/**/* # exclude all files in src/
|
76
|
+
```
|
49
77
|
|
50
|
-
## Rules
|
78
|
+
## How to Configure Rules
|
51
79
|
|
52
80
|
You can specify post-parsing rules for your puzzles, in command line,
|
53
81
|
for example:
|
@@ -76,7 +104,5 @@ Here is a list of rules available now:
|
|
76
104
|
* `max-duplicates:1` blocks more than one duplicate of any puzzle
|
77
105
|
(this rule is used by default).
|
78
106
|
|
79
|
-
## .pdd
|
80
|
-
|
81
107
|
You can put all command line options into `.pdd` file. The options from the
|
82
108
|
file will be used first. Command line options may be added on top of them.
|
data/bin/pdd
CHANGED
@@ -30,8 +30,8 @@ require 'pdd/version'
|
|
30
30
|
require 'nokogiri'
|
31
31
|
|
32
32
|
args = []
|
33
|
-
args
|
34
|
-
args
|
33
|
+
args += File.read('.pdd').split(/\s+/).map(&:strip) if File.exist?('.pdd')
|
34
|
+
args += ARGV
|
35
35
|
|
36
36
|
opts = Slop.parse(args, strict: true, help: true) do
|
37
37
|
banner "Usage (#{PDD::VERSION}): pdd [options]"
|
@@ -72,7 +72,7 @@ opts = Slop.parse(args, strict: true, help: true) do
|
|
72
72
|
)
|
73
73
|
end
|
74
74
|
|
75
|
-
|
75
|
+
raise '-f is mandatory when using -v' if opts.verbose? && !opts.file?
|
76
76
|
|
77
77
|
if opts.help?
|
78
78
|
puts opts
|
@@ -95,8 +95,8 @@ if opts[:format]
|
|
95
95
|
'assets', 'puzzles.xsl'
|
96
96
|
)
|
97
97
|
output = Nokogiri::XSLT(File.read(xslt)).transform(Nokogiri::XML(output))
|
98
|
-
|
99
|
-
|
98
|
+
elsif opts[:format] != 'xml'
|
99
|
+
raise 'invalid format, use html or xml'
|
100
100
|
end
|
101
101
|
end
|
102
102
|
file << output
|
@@ -46,7 +46,7 @@ end
|
|
46
46
|
Given(/^I have a "([^"]*)" file with content:$/) do |file, text|
|
47
47
|
FileUtils.mkdir_p(File.dirname(file)) unless File.exist?(file)
|
48
48
|
File.open(file, 'w') do |f|
|
49
|
-
f.write(text.gsub(/\\xFF/,
|
49
|
+
f.write(text.gsub(/\\xFF/, 0xFF.chr))
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -55,7 +55,7 @@ When(/^I run pdd$/) do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
Then(/^XML matches "([^"]+)"$/) do |xpath|
|
58
|
-
|
58
|
+
raise "XML doesn't match \"#{xpath}\":\n#{@xml}" if @xml.xpath(xpath).empty?
|
59
59
|
end
|
60
60
|
|
61
61
|
When(/^I run pdd it fails with "([^"]*)"$/) do |txt|
|
@@ -67,10 +67,10 @@ When(/^I run pdd it fails with "([^"]*)"$/) do |txt|
|
|
67
67
|
raise "PDD failed but exception doesn't contain \"#{txt}\": #{ex.message}"
|
68
68
|
end
|
69
69
|
end
|
70
|
-
|
70
|
+
raise "PDD didn't fail" if passed
|
71
71
|
end
|
72
72
|
|
73
|
-
When(
|
73
|
+
When(%r{^I run bin/pdd with "([^"]*)"$}) do |arg|
|
74
74
|
home = File.join(File.dirname(__FILE__), '../..')
|
75
75
|
@stdout = `ruby -I#{home}/lib #{home}/bin/pdd #{arg}`
|
76
76
|
@exitstatus = $CHILD_STATUS.exitstatus
|
@@ -78,29 +78,29 @@ end
|
|
78
78
|
|
79
79
|
Then(/^Stdout contains "([^"]*)"$/) do |txt|
|
80
80
|
unless @stdout.include?(txt)
|
81
|
-
|
81
|
+
raise "STDOUT doesn't contain '#{txt}':\n#{@stdout}"
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
Then(/^Stdout is empty$/) do
|
86
|
-
|
86
|
+
raise "STDOUT is not empty:\n#{@stdout}" unless @stdout == ''
|
87
87
|
end
|
88
88
|
|
89
89
|
Then(/^XML file "([^"]+)" matches "([^"]+)"$/) do |file, xpath|
|
90
|
-
|
90
|
+
raise "File #{file} doesn't exit" unless File.exist?(file)
|
91
91
|
xml = Nokogiri::XML.parse(File.read(file))
|
92
92
|
xml.remove_namespaces!
|
93
93
|
if xml.xpath(xpath).empty?
|
94
|
-
|
94
|
+
raise "XML file #{file} doesn't match \"#{xpath}\":\n#{xml}"
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
Then(/^Exit code is zero$/) do
|
99
|
-
|
99
|
+
raise "Non-zero exit code #{@exitstatus}" unless @exitstatus == 0
|
100
100
|
end
|
101
101
|
|
102
102
|
Then(/^Exit code is not zero$/) do
|
103
|
-
|
103
|
+
raise 'Zero exit code' if @exitstatus == 0
|
104
104
|
end
|
105
105
|
|
106
106
|
When(/^I run bash with$/) do |text|
|
data/lib/pdd.rb
CHANGED
@@ -50,7 +50,7 @@ module PDD
|
|
50
50
|
'min-words' => PDD::Rule::Text::MinWords,
|
51
51
|
'max-duplicates' => PDD::Rule::MaxDuplicates,
|
52
52
|
'available-roles' => PDD::Rule::Roles::Available
|
53
|
-
}
|
53
|
+
}.freeze
|
54
54
|
|
55
55
|
# Get logger.
|
56
56
|
def self.log
|
@@ -141,13 +141,13 @@ module PDD
|
|
141
141
|
(@opts[:rule] || []).push('max-duplicates:1').map do |r|
|
142
142
|
name, value = r.split(':')
|
143
143
|
rule = RULES[name]
|
144
|
-
|
144
|
+
raise "rule '#{name}' doesn't exist" if rule.nil?
|
145
145
|
rule.new(doc, value).errors.each do |e|
|
146
146
|
PDD.log.error e
|
147
147
|
total += 1
|
148
148
|
end
|
149
149
|
end
|
150
|
-
|
150
|
+
raise PDD::Error, "#{total} errors, see log above" unless total == 0
|
151
151
|
xml
|
152
152
|
end
|
153
153
|
|
@@ -158,7 +158,7 @@ module PDD
|
|
158
158
|
errors = xsd.validate(Nokogiri::XML(xml)).map(&:message)
|
159
159
|
errors.each { |e| PDD.log.error e }
|
160
160
|
PDD.log.error(xml) unless errors.empty?
|
161
|
-
|
161
|
+
raise SchemaError, errors.join('; ') unless errors.empty?
|
162
162
|
xml
|
163
163
|
end
|
164
164
|
end
|
data/lib/pdd/rule/duplicates.rb
CHANGED
@@ -33,15 +33,16 @@ module PDD
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def errors
|
36
|
-
@xml
|
36
|
+
@xml
|
37
|
+
.xpath('//puzzle')
|
37
38
|
.group_by { |p| p.xpath('body/text()').to_s }
|
38
39
|
.map do |_, puzzles|
|
39
40
|
next nil if puzzles.count <= @max
|
40
41
|
"there are #{puzzles.count} duplicate(s) of the same puzzle: " +
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
puzzles.map do |p|
|
43
|
+
"#{p.xpath('file/text()')}:#{p.xpath('lines/text()')}"
|
44
|
+
end.join(', ') +
|
45
|
+
", while maximum #{@max} duplicate is allowed"
|
45
46
|
end.compact
|
46
47
|
end
|
47
48
|
end
|
data/lib/pdd/rule/roles.rb
CHANGED
@@ -38,13 +38,13 @@ module PDD
|
|
38
38
|
role = p.xpath('role/text()').to_s
|
39
39
|
next nil if @roles.include?(role)
|
40
40
|
"puzzle #{p.xpath('file/text()')}:#{p.xpath('lines/text()')}" +
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
if role.empty?
|
42
|
+
" doesn't define any role"\
|
43
|
+
", while one of these roles is required: #{@roles}"
|
44
|
+
else
|
45
|
+
" defines role #{role}"\
|
46
|
+
", while only these roles are allowed: #{@roles}"
|
47
|
+
end
|
48
48
|
end.compact
|
49
49
|
end
|
50
50
|
end
|
data/lib/pdd/source.rb
CHANGED
@@ -38,7 +38,7 @@ module PDD
|
|
38
38
|
# Fetch all puzzles.
|
39
39
|
def puzzles
|
40
40
|
PDD.log.info "reading #{@path}..."
|
41
|
-
re =
|
41
|
+
re = %r{(.*(?:^|\s))@todo\s+#([\w\-\.:/]+)\s+(.+)}
|
42
42
|
puzzles = []
|
43
43
|
lines = File.readlines(@file)
|
44
44
|
lines.each_with_index do |line, idx|
|
@@ -51,8 +51,8 @@ module PDD
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
lines.each_with_index do |line, idx|
|
54
|
-
|
55
|
-
if /.*(^|\s)@todo\s+[^#]
|
54
|
+
raise Error, "@todo found, but puzzle can't be parsed in line ##{idx}" \
|
55
|
+
if line =~ /.*(^|\s)@todo\s+[^#]/
|
56
56
|
end
|
57
57
|
puzzles
|
58
58
|
end
|
@@ -76,9 +76,9 @@ module PDD
|
|
76
76
|
|
77
77
|
# Parse a marker.
|
78
78
|
def marker(text)
|
79
|
-
re =
|
79
|
+
re = %r{([\w\d\-\.]+)(?::(\d+)(?:(m|h)[a-z]*)?)?(?:/([A-Z]+))?}
|
80
80
|
match = re.match(text)
|
81
|
-
|
81
|
+
raise "invalid puzzle marker: #{text}" if match.nil?
|
82
82
|
{
|
83
83
|
ticket: match[1],
|
84
84
|
estimate: minutes(match[2], match[3]),
|
@@ -96,12 +96,12 @@ module PDD
|
|
96
96
|
# Fetch puzzle tail (all lines after the first one)
|
97
97
|
def tail(lines, prefix)
|
98
98
|
lines
|
99
|
-
.take_while { |
|
100
|
-
.map { |
|
101
|
-
.take_while { |
|
102
|
-
.each { |
|
103
|
-
.each { |
|
104
|
-
.map { |
|
99
|
+
.take_while { |t| t.start_with?(prefix) }
|
100
|
+
.map { |t| t[prefix.length, t.length] }
|
101
|
+
.take_while { |t| t =~ /^[ a-zA-Z0-9]/ }
|
102
|
+
.each { |t| raise Error, 'Space expected' unless t.start_with?(' ') }
|
103
|
+
.each { |t| raise Error, 'Too many spaces' if t =~ /^\s{2,}/ }
|
104
|
+
.map { |t| t[1, t.length] }
|
105
105
|
end
|
106
106
|
|
107
107
|
# Git information at the line
|
data/lib/pdd/sources.rb
CHANGED
data/lib/pdd/version.rb
CHANGED
data/pdd.gemspec
CHANGED
@@ -41,19 +41,19 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.email = 'yegor@teamed.io'
|
42
42
|
s.homepage = 'http://github.com/teamed/pdd'
|
43
43
|
s.files = `git ls-files`.split($RS)
|
44
|
-
s.executables = s.files.grep(
|
45
|
-
s.test_files = s.files.grep(
|
44
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
45
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
46
46
|
s.rdoc_options = ['--charset=UTF-8']
|
47
47
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
48
|
-
s.add_runtime_dependency 'nokogiri', '1.6
|
49
|
-
s.add_runtime_dependency 'ruby-filemagic', '0.7
|
50
|
-
s.add_runtime_dependency 'slop', '3.6
|
51
|
-
s.
|
48
|
+
s.add_runtime_dependency 'nokogiri', '~>1.6'
|
49
|
+
s.add_runtime_dependency 'ruby-filemagic', '~>0.7'
|
50
|
+
s.add_runtime_dependency 'slop', '~>3.6'
|
51
|
+
s.add_development_dependency 'rake', '10.5.0'
|
52
52
|
s.add_development_dependency 'coveralls', '0.7.2'
|
53
53
|
s.add_development_dependency 'rdoc', '4.2.0'
|
54
54
|
s.add_development_dependency 'cucumber', '1.3.17'
|
55
55
|
s.add_development_dependency 'minitest', '5.5.0'
|
56
|
-
s.add_development_dependency 'rubocop', '0.
|
57
|
-
s.add_development_dependency 'rubocop-rspec', '1.
|
56
|
+
s.add_development_dependency 'rubocop', '0.41.2'
|
57
|
+
s.add_development_dependency 'rubocop-rspec', '1.5.1'
|
58
58
|
s.add_development_dependency 'rspec-rails', '3.1.0'
|
59
59
|
end
|
data/test/test_pdd.rb
CHANGED
@@ -63,7 +63,7 @@ class TestPDD < Minitest::Test
|
|
63
63
|
skip if Gem.win_platform?
|
64
64
|
Dir.mktmpdir 'test' do |dir|
|
65
65
|
opts = opts(['-v', '-s', dir])
|
66
|
-
|
66
|
+
raise unless system("
|
67
67
|
set -e
|
68
68
|
cd '#{dir}'
|
69
69
|
git init .
|
@@ -100,7 +100,7 @@ class TestPDD < Minitest::Test
|
|
100
100
|
|
101
101
|
def matches(xml, xpaths)
|
102
102
|
xpaths.each do |xpath|
|
103
|
-
|
103
|
+
raise "doesn't match '#{xpath}': #{xml}" unless xml.xpath(xpath).size == 1
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
data/test/test_source.rb
CHANGED
@@ -90,7 +90,7 @@ class TestSource < Minitest::Test
|
|
90
90
|
skip if Gem.win_platform?
|
91
91
|
Dir.mktmpdir 'test' do |dir|
|
92
92
|
file = File.join(dir, 'xx.txt')
|
93
|
-
File.write(file,
|
93
|
+
File.write(file, ' * @todo #44 this is a broken unicode: ' + 0x92.chr)
|
94
94
|
assert_raises PDD::Error do
|
95
95
|
PDD::VerboseSource.new(file, PDD::Source.new(file, 'xx')).puzzles
|
96
96
|
end
|
@@ -117,7 +117,7 @@ class TestSource < Minitest::Test
|
|
117
117
|
def test_reads_git_author
|
118
118
|
skip if Gem.win_platform?
|
119
119
|
Dir.mktmpdir 'test' do |dir|
|
120
|
-
|
120
|
+
raise unless system("
|
121
121
|
set -e
|
122
122
|
cd '#{dir}'
|
123
123
|
git init .
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.16'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.6
|
19
|
+
version: '1.6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.6
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ruby-filemagic
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.7
|
33
|
+
version: '0.7'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.7
|
40
|
+
version: '0.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: slop
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.6
|
47
|
+
version: '3.6'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.6
|
54
|
+
version: '3.6'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 10.
|
62
|
-
type: :
|
61
|
+
version: 10.5.0
|
62
|
+
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 10.
|
68
|
+
version: 10.5.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: coveralls
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,28 +128,28 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
131
|
+
version: 0.41.2
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - '='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
138
|
+
version: 0.41.2
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: rubocop-rspec
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.
|
145
|
+
version: 1.5.1
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.
|
152
|
+
version: 1.5.1
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rspec-rails
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|