pathspec 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -1
- data/lib/pathspec/gitignorespec.rb +4 -2
- data/lib/pathspec/regexspec.rb +2 -0
- data/lib/pathspec/spec.rb +2 -0
- data/lib/pathspec.rb +2 -0
- metadata +7 -23
- data/spec/files/gitignore_readme +0 -2
- data/spec/files/gitignore_ruby +0 -51
- data/spec/files/gitignore_simple +0 -1
- data/spec/files/regex_simple +0 -1
- data/spec/spec_helper.rb +0 -6
- data/spec/unit/pathspec/gitignorespec_spec.rb +0 -303
- data/spec/unit/pathspec/spec_spec.rb +0 -12
- data/spec/unit/pathspec_spec.rb +0 -386
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8cbc90066974f8467fb62548b62bc51b00c56623b98c6fdf99897ab170378c3
|
4
|
+
data.tar.gz: 649ab494204ab19fd65086ea8f01efb16ee523b9ccf107f7b06234cff031aefb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67698a0b54e5cc851d86347a1929feaaf2c8967c75010f92fd1087f30e56cb39278b7d78c6fae3c8f034a52dc52d56aa23208279b5e4a3006244e65ebdc86b10
|
7
|
+
data.tar.gz: c17cdce06ee08bbddce5b92239e79f9bf76d3d5fba9684584ae1e3c13f2891f5ba3aa369be5a2f755f60ad3ffb5bde50d4672cd2ad826ef89567ac09eb356683
|
data/CHANGELOG.md
CHANGED
@@ -1,17 +1,52 @@
|
|
1
1
|
# pathspec-ruby CHANGELOG
|
2
2
|
|
3
|
+
## 2.1.0
|
4
|
+
|
5
|
+
## refactor/perf
|
6
|
+
|
7
|
+
- Add missing frozen_string_literal comments to reduce object allocations
|
8
|
+
|
9
|
+
## build
|
10
|
+
|
11
|
+
- Updated Rubocop to 1.18.3
|
12
|
+
- Fixed/re-enabled Rubocop
|
13
|
+
- Updated fakefs to 1.3
|
14
|
+
- Cleaned up unnecessary spec files from the Gem
|
15
|
+
|
16
|
+
Thanks for the above contributions @ericproulx! #50
|
17
|
+
|
3
18
|
## 2.0.0
|
4
19
|
|
5
20
|
- (Maint) Remove deprecated/security release versions of Ruby. The Gem will now only support and be tested against >= 3.1.0 e.g. 3.1, 3.2, and 3.3.
|
6
21
|
|
22
|
+
## 1.1.3 (Patch/Bug Fix Release)
|
23
|
+
|
24
|
+
- Fixed Man page generation bug in GH Actions
|
25
|
+
|
26
|
+
## 1.1.1 (Patch/Bug Fix Release)
|
27
|
+
|
28
|
+
- (Maint) Updated Supported Ruby Versions (>= 2.6.9 is the earliest supported now)
|
29
|
+
- (Maint) Linting corrections
|
30
|
+
- Setup a CI system with GH Actions to do better validation of the gem before release.
|
31
|
+
|
7
32
|
## 1.1.0 (Minor Release)
|
8
33
|
|
34
|
+
:alert: This release was mis-tagged. Use 1.1.1 instead. :alert:
|
35
|
+
|
9
36
|
- (Maint) Updated Supported Ruby Versions
|
10
37
|
- (Maint) Linting corrections
|
11
38
|
|
12
|
-
##
|
39
|
+
## 1.0.0 (Major Release)
|
40
|
+
|
41
|
+
- Adds a required ruby version of 2.6 (reason for major version bump)
|
42
|
+
- Adds man/html docs
|
43
|
+
|
44
|
+
## 0.2.1 (Patch/Bug Fix Release)
|
45
|
+
|
46
|
+
- Fixes incorrectly pushed gem on Rubygems.org
|
13
47
|
|
14
48
|
## 0.2.0 (Minor Release)
|
49
|
+
|
15
50
|
- (Feature) A CLI tool, pathspec-rb, is now provided with the gem.
|
16
51
|
- (API Change) New namespace for gem: `PathSpec`: Everything is now namespaced under `PathSpec`, to prevent naming collisions with other libraries. Thanks @tenderlove!
|
17
52
|
- (License) License version updated to Apache 2. Thanks @kytrinyx!
|
@@ -20,20 +55,24 @@
|
|
20
55
|
- (Maint) Added Rubocop and made some corrections
|
21
56
|
|
22
57
|
## 0.1.2 (Patch/Bug Fix Release)
|
58
|
+
|
23
59
|
- Fix for regexp matching Thanks @incase! #16
|
24
60
|
- File handling cleanup Thanks @martinandert! #13
|
25
61
|
- `from_filename` actually works now! Thanks @martinandert! #12
|
26
62
|
|
27
63
|
## 0.1.0 (Minor Release)
|
64
|
+
|
28
65
|
- Port new edgecase handling from [python-path-specification](https://github.com/cpburnz/python-path-specification/pull/8). Many thanks to @jdpace! :)
|
29
66
|
- Removed EOL Ruby support
|
30
67
|
- Added current Ruby stable to Travis testing
|
31
68
|
|
32
69
|
## 0.0.2 (Patch/Bug Fix Release)
|
70
|
+
|
33
71
|
- Fixed issues with Ruby 1.8.7/2.1.1
|
34
72
|
- Added more testing scripts
|
35
73
|
- Fixed Windows path related issues
|
36
74
|
- Cleanup unnecessary things in gem
|
37
75
|
|
38
76
|
## 0.0.1
|
77
|
+
|
39
78
|
- Initial version.
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'pathspec/regexspec'
|
2
4
|
|
3
5
|
class PathSpec
|
@@ -87,7 +89,7 @@ class PathSpec
|
|
87
89
|
end
|
88
90
|
|
89
91
|
# Build regular expression from pattern.
|
90
|
-
regex = '^'
|
92
|
+
regex = +'^'
|
91
93
|
need_slash = false
|
92
94
|
regex_end = pattern_segs.size - 1
|
93
95
|
pattern_segs.each_index do |i|
|
@@ -165,7 +167,7 @@ class PathSpec
|
|
165
167
|
# the POSIX function `fnmatch()` with the `FNM_PATHNAME` flag set.
|
166
168
|
|
167
169
|
escape = false
|
168
|
-
regex = ''
|
170
|
+
regex = +''
|
169
171
|
i = 0
|
170
172
|
|
171
173
|
while i < pattern.size
|
data/lib/pathspec/regexspec.rb
CHANGED
data/lib/pathspec/spec.rb
CHANGED
data/lib/pathspec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pathspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon High
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.5'
|
34
34
|
type: :development
|
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: '
|
40
|
+
version: '2.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: kramdown
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 1.63.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 1.63.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,14 +126,6 @@ files:
|
|
126
126
|
- lib/pathspec/gitignorespec.rb
|
127
127
|
- lib/pathspec/regexspec.rb
|
128
128
|
- lib/pathspec/spec.rb
|
129
|
-
- spec/files/gitignore_readme
|
130
|
-
- spec/files/gitignore_ruby
|
131
|
-
- spec/files/gitignore_simple
|
132
|
-
- spec/files/regex_simple
|
133
|
-
- spec/spec_helper.rb
|
134
|
-
- spec/unit/pathspec/gitignorespec_spec.rb
|
135
|
-
- spec/unit/pathspec/spec_spec.rb
|
136
|
-
- spec/unit/pathspec_spec.rb
|
137
129
|
homepage: https://github.com/highb/pathspec-ruby
|
138
130
|
licenses:
|
139
131
|
- Apache-2.0
|
@@ -159,12 +151,4 @@ rubygems_version: 3.3.26
|
|
159
151
|
signing_key:
|
160
152
|
specification_version: 4
|
161
153
|
summary: 'PathSpec: for matching path patterns'
|
162
|
-
test_files:
|
163
|
-
- spec/files/gitignore_readme
|
164
|
-
- spec/files/gitignore_ruby
|
165
|
-
- spec/files/gitignore_simple
|
166
|
-
- spec/files/regex_simple
|
167
|
-
- spec/spec_helper.rb
|
168
|
-
- spec/unit/pathspec/gitignorespec_spec.rb
|
169
|
-
- spec/unit/pathspec/spec_spec.rb
|
170
|
-
- spec/unit/pathspec_spec.rb
|
154
|
+
test_files: []
|
data/spec/files/gitignore_readme
DELETED
data/spec/files/gitignore_ruby
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
# Source: https://github.com/github/gitignore/blob/master/Ruby.gitignore
|
2
|
-
*.gem
|
3
|
-
*.rbc
|
4
|
-
/.config
|
5
|
-
/coverage/
|
6
|
-
/InstalledFiles
|
7
|
-
/pkg/
|
8
|
-
/spec/reports/
|
9
|
-
/spec/examples.txt
|
10
|
-
/test/tmp/
|
11
|
-
/test/version_tmp/
|
12
|
-
/tmp/
|
13
|
-
|
14
|
-
# Used by dotenv library to load environment variables.
|
15
|
-
# .env
|
16
|
-
|
17
|
-
## Specific to RubyMotion:
|
18
|
-
.dat*
|
19
|
-
.repl_history
|
20
|
-
build/
|
21
|
-
*.bridgesupport
|
22
|
-
build-iPhoneOS/
|
23
|
-
build-iPhoneSimulator/
|
24
|
-
|
25
|
-
## Specific to RubyMotion (use of CocoaPods):
|
26
|
-
#
|
27
|
-
# We recommend against adding the Pods directory to your .gitignore. However
|
28
|
-
# you should judge for yourself, the pros and cons are mentioned at:
|
29
|
-
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
30
|
-
#
|
31
|
-
# vendor/Pods/
|
32
|
-
|
33
|
-
## Documentation cache and generated files:
|
34
|
-
/.yardoc/
|
35
|
-
/_yardoc/
|
36
|
-
/doc/
|
37
|
-
/rdoc/
|
38
|
-
|
39
|
-
## Environment normalization:
|
40
|
-
/.bundle/
|
41
|
-
/vendor/bundle
|
42
|
-
/lib/bundler/man/
|
43
|
-
|
44
|
-
# for a library or gem, you might want to ignore these files since the code is
|
45
|
-
# intended to run in multiple environments; otherwise, check them in:
|
46
|
-
# Gemfile.lock
|
47
|
-
# .ruby-version
|
48
|
-
# .ruby-gemset
|
49
|
-
|
50
|
-
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
51
|
-
.rvmrc
|
data/spec/files/gitignore_simple
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
*.md
|
data/spec/files/regex_simple
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
.*\.md
|
data/spec/spec_helper.rb
DELETED
@@ -1,303 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'pathspec/gitignorespec'
|
3
|
-
|
4
|
-
describe PathSpec::GitIgnoreSpec do
|
5
|
-
# Original specification by http://git-scm.com/docs/gitignore
|
6
|
-
|
7
|
-
# A blank line matches no files, so it can serve as a separator for
|
8
|
-
# readability.
|
9
|
-
describe 'does nothing for newlines' do
|
10
|
-
subject { PathSpec::GitIgnoreSpec.new "\n" }
|
11
|
-
it { is_expected.to_not match('foo.tmp') }
|
12
|
-
it { is_expected.to_not match(' ') }
|
13
|
-
it { is_expected.to_not be_inclusive }
|
14
|
-
end
|
15
|
-
|
16
|
-
describe 'does nothing for blank strings' do
|
17
|
-
subject { PathSpec::GitIgnoreSpec.new '' }
|
18
|
-
it { is_expected.to_not match 'foo.tmp' }
|
19
|
-
it { is_expected.to_not match ' ' }
|
20
|
-
it { is_expected.to_not be_inclusive }
|
21
|
-
end
|
22
|
-
|
23
|
-
# A line starting with # serves as a comment. Put a backslash ("\") in front
|
24
|
-
# of the first hash for patterns that begin with a hash.
|
25
|
-
describe 'does nothing for comments' do
|
26
|
-
subject { PathSpec::GitIgnoreSpec.new '# this is a gitignore style comment' }
|
27
|
-
it { is_expected.to_not match('foo.tmp') }
|
28
|
-
it { is_expected.to_not match(' ') }
|
29
|
-
it { is_expected.to_not be_inclusive }
|
30
|
-
end
|
31
|
-
|
32
|
-
describe 'ignores comment char with a slash' do
|
33
|
-
subject { PathSpec::GitIgnoreSpec.new '\#averystrangefile' }
|
34
|
-
it { is_expected.to match('#averystrangefile') }
|
35
|
-
it { is_expected.to_not match('foobar') }
|
36
|
-
it { is_expected.to be_inclusive }
|
37
|
-
end
|
38
|
-
|
39
|
-
describe 'escapes characters with slashes' do
|
40
|
-
subject { PathSpec::GitIgnoreSpec.new 'twinkletwinkle\*' }
|
41
|
-
it { is_expected.to match('twinkletwinkle*') }
|
42
|
-
it { is_expected.to_not match('twinkletwinkletwinkle') }
|
43
|
-
it { is_expected.to be_inclusive }
|
44
|
-
end
|
45
|
-
|
46
|
-
# Trailing spaces are ignored unless they are quoted with backlash ("\").
|
47
|
-
describe 'ignores trailing spaces' do
|
48
|
-
subject { PathSpec::GitIgnoreSpec.new 'foo ' }
|
49
|
-
it { is_expected.to match('foo') }
|
50
|
-
it { is_expected.to_not match('foo ') }
|
51
|
-
it { is_expected.to be_inclusive }
|
52
|
-
end
|
53
|
-
|
54
|
-
# This is not handled properly yet
|
55
|
-
describe 'does not ignore escaped trailing spaces'
|
56
|
-
|
57
|
-
# An optional prefix "!" which negates the pattern; any matching file excluded
|
58
|
-
# by a previous pattern will become included again. It is not possible to
|
59
|
-
# re-include a file if a parent directory of that file is excluded. Git
|
60
|
-
# doesn't list excluded directories for performance reasons, so any patterns
|
61
|
-
# on contained files have no effect, no matter where they are defined. Put a
|
62
|
-
# backslash ("\") in front of the first "!" for patterns that begin with a
|
63
|
-
# literal "!", for example, "\!important!.txt".
|
64
|
-
describe 'is exclusive of !' do
|
65
|
-
subject { PathSpec::GitIgnoreSpec.new '!important.txt' }
|
66
|
-
it { is_expected.to match('important.txt') }
|
67
|
-
it { is_expected.to_not be_inclusive }
|
68
|
-
it { is_expected.to_not match('!important.txt') }
|
69
|
-
end
|
70
|
-
|
71
|
-
# If the pattern ends with a slash, it is removed for the purpose of the
|
72
|
-
# following description, but it would only find a match with a directory. In
|
73
|
-
# other words, foo/ will match a directory foo and paths underneath it, but
|
74
|
-
# will not match a regular file or a symbolic link foo (this is consistent
|
75
|
-
# with the way how pathspec works in general in Git).
|
76
|
-
describe 'trailing slashes match directories and their contents but not regular files or symlinks' do
|
77
|
-
subject { PathSpec::GitIgnoreSpec.new 'foo/' }
|
78
|
-
it { is_expected.to match('foo/') }
|
79
|
-
it { is_expected.to match('foo/bar') }
|
80
|
-
it { is_expected.to match('baz/foo/bar') }
|
81
|
-
it { is_expected.to_not match('foo') }
|
82
|
-
it { is_expected.to be_inclusive }
|
83
|
-
end
|
84
|
-
|
85
|
-
# If the pattern does not contain a slash '/', Git treats it as a shell glob
|
86
|
-
# pattern and checks for a match against the pathname relative to the location
|
87
|
-
# of the .gitignore file (relative to the toplevel of the work tree if not
|
88
|
-
# from a .gitignore file).
|
89
|
-
describe 'handles basic globbing' do
|
90
|
-
subject { PathSpec::GitIgnoreSpec.new '*.tmp' }
|
91
|
-
it { is_expected.to match('foo.tmp') }
|
92
|
-
it { is_expected.to match('foo/bar.tmp') }
|
93
|
-
it { is_expected.to match('foo/bar.tmp/baz') }
|
94
|
-
it { is_expected.to_not match('foo.rb') }
|
95
|
-
it { is_expected.to be_inclusive }
|
96
|
-
end
|
97
|
-
|
98
|
-
describe 'handles inner globs' do
|
99
|
-
subject { PathSpec::GitIgnoreSpec.new 'foo-*-bar' }
|
100
|
-
it { is_expected.to match('foo--bar') }
|
101
|
-
it { is_expected.to match('foo-hello-bar') }
|
102
|
-
it { is_expected.to match('a/foo-hello-bar') }
|
103
|
-
it { is_expected.to match('foo-hello-bar/b') }
|
104
|
-
it { is_expected.to match('a/foo-hello-bar/b') }
|
105
|
-
it { is_expected.to_not match('foo.tmp') }
|
106
|
-
end
|
107
|
-
|
108
|
-
describe 'handles postfix globs' do
|
109
|
-
subject { PathSpec::GitIgnoreSpec.new '~temp-*' }
|
110
|
-
it { is_expected.to match('~temp-') }
|
111
|
-
it { is_expected.to match('~temp-foo') }
|
112
|
-
it { is_expected.to match('foo/~temp-bar') }
|
113
|
-
it { is_expected.to match('foo/~temp-bar/baz') }
|
114
|
-
it { is_expected.to_not match('~temp') }
|
115
|
-
end
|
116
|
-
|
117
|
-
describe 'handles multiple globs' do
|
118
|
-
subject { PathSpec::GitIgnoreSpec.new '*.middle.*' }
|
119
|
-
it { is_expected.to match('hello.middle.rb') }
|
120
|
-
it { is_expected.to_not match('foo.rb') }
|
121
|
-
it { is_expected.to be_inclusive }
|
122
|
-
end
|
123
|
-
|
124
|
-
describe 'handles dir globs' do
|
125
|
-
subject { PathSpec::GitIgnoreSpec.new 'dir/*' }
|
126
|
-
it { is_expected.to match('dir/foo') }
|
127
|
-
it { is_expected.to_not match('foo/') }
|
128
|
-
it { is_expected.to be_inclusive }
|
129
|
-
end
|
130
|
-
|
131
|
-
# Otherwise, Git treats the pattern as a shell glob suitable for consumption
|
132
|
-
# by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will not
|
133
|
-
# match a / in the pathname. For example, "Documentation/*.html" matches
|
134
|
-
# "Documentation/git.html" but not "Documentation/ppc/ppc.html" or
|
135
|
-
# "tools/perf/Documentation/perf.html".
|
136
|
-
describe 'handles dir globs' do
|
137
|
-
subject { PathSpec::GitIgnoreSpec.new 'dir/*' }
|
138
|
-
it { is_expected.to match('dir/foo') }
|
139
|
-
it { is_expected.to_not match('foo/') }
|
140
|
-
it { is_expected.to be_inclusive }
|
141
|
-
end
|
142
|
-
|
143
|
-
describe 'handles globs inside of dirs' do
|
144
|
-
subject { PathSpec::GitIgnoreSpec.new 'Documentation/*.html' }
|
145
|
-
it { is_expected.to match('Documentation/git.html') }
|
146
|
-
it { is_expected.to_not match('Documentation/ppc/ppc.html') }
|
147
|
-
it { is_expected.to_not match('tools/perf/Documentation/perf.html') } # TODO: Or is it? Git 2 weirdness?
|
148
|
-
it { is_expected.to be_inclusive }
|
149
|
-
end
|
150
|
-
|
151
|
-
describe 'handles wildcards' do
|
152
|
-
subject { PathSpec::GitIgnoreSpec.new 'jokeris????' }
|
153
|
-
it { is_expected.to match('jokeriswild') }
|
154
|
-
it { is_expected.to_not match('jokerisfat') }
|
155
|
-
it { is_expected.to be_inclusive }
|
156
|
-
end
|
157
|
-
|
158
|
-
describe 'handles brackets' do
|
159
|
-
subject { PathSpec::GitIgnoreSpec.new '*[eu][xl]*' }
|
160
|
-
it { is_expected.to match('youknowregex') }
|
161
|
-
it { is_expected.to match('youknowregularexpressions') }
|
162
|
-
it { is_expected.to_not match('youknownothing') }
|
163
|
-
it { is_expected.to be_inclusive }
|
164
|
-
end
|
165
|
-
|
166
|
-
describe 'handles unmatched brackets' do
|
167
|
-
subject { PathSpec::GitIgnoreSpec.new '*[*[*' }
|
168
|
-
it { is_expected.to match('bracket[oh[wow') }
|
169
|
-
it { is_expected.to be_inclusive }
|
170
|
-
end
|
171
|
-
|
172
|
-
describe 'handles brackets with carats' do
|
173
|
-
subject { PathSpec::GitIgnoreSpec.new '*[^]' }
|
174
|
-
it { is_expected.to match('myfavorite^') }
|
175
|
-
it { is_expected.to be_inclusive }
|
176
|
-
end
|
177
|
-
|
178
|
-
describe 'handles brackets for brackets' do
|
179
|
-
subject { PathSpec::GitIgnoreSpec.new '*[]]' }
|
180
|
-
it { is_expected.to match('yodawg[]]') }
|
181
|
-
it { is_expected.to be_inclusive }
|
182
|
-
end
|
183
|
-
|
184
|
-
describe 'handles brackets with escaped characters' do
|
185
|
-
# subject { GitIgnoreSpec.new 'back[\\]slash' }
|
186
|
-
# it { is_expected.to match('back\\slash') }
|
187
|
-
# it { is_expected.to_not match('back\\\\slash') }
|
188
|
-
# it { is_expected.to be_inclusive }
|
189
|
-
end
|
190
|
-
|
191
|
-
describe 'handles negated brackets' do
|
192
|
-
subject { PathSpec::GitIgnoreSpec.new 'ab[!cd]ef' }
|
193
|
-
it { is_expected.to_not match('abcef') }
|
194
|
-
it { is_expected.to match('abzef') }
|
195
|
-
it { is_expected.to be_inclusive }
|
196
|
-
end
|
197
|
-
|
198
|
-
# A leading slash matches the beginning of the pathname. For example, "/*.c"
|
199
|
-
# matches "cat-file.c" but not "mozilla-sha1/sha1.c".
|
200
|
-
describe 'handles leading / as relative to base directory' do
|
201
|
-
subject { PathSpec::GitIgnoreSpec.new '/*.c' }
|
202
|
-
it { is_expected.to match('cat-file.c') }
|
203
|
-
it { is_expected.to_not match('mozilla-sha1/sha1.c') }
|
204
|
-
it { is_expected.to be_inclusive }
|
205
|
-
end
|
206
|
-
|
207
|
-
describe 'handles simple single paths' do
|
208
|
-
subject { PathSpec::GitIgnoreSpec.new 'spam' }
|
209
|
-
it { is_expected.to match('spam') }
|
210
|
-
it { is_expected.to match('spam/') }
|
211
|
-
it { is_expected.to match('foo/spam') }
|
212
|
-
it { is_expected.to match('spam/foo') }
|
213
|
-
it { is_expected.to match('foo/spam/bar') }
|
214
|
-
it { is_expected.to_not match('foo') }
|
215
|
-
end
|
216
|
-
|
217
|
-
# Two consecutive asterisks ("**") in patterns matched against full pathname
|
218
|
-
# may have special meaning:
|
219
|
-
|
220
|
-
# A leading "**" followed by a slash means match in all directories. For
|
221
|
-
# example, "**/foo" matches file or directory "foo" anywhere, the same as
|
222
|
-
# pattern "foo". "**/foo/bar" matches file or directory "bar" anywhere that is
|
223
|
-
# directly under directory "foo".
|
224
|
-
describe 'handles prefixed ** as searching any location' do
|
225
|
-
subject { PathSpec::GitIgnoreSpec.new '**/foo' }
|
226
|
-
it { is_expected.to match('foo') }
|
227
|
-
it { is_expected.to match('bar/foo') }
|
228
|
-
it { is_expected.to match('baz/bar/foo') }
|
229
|
-
it { is_expected.to_not match('baz/bar/foo.rb') }
|
230
|
-
it { is_expected.to be_inclusive }
|
231
|
-
end
|
232
|
-
|
233
|
-
describe 'handles prefixed ** with a directory as searching a file under a directory in any location' do
|
234
|
-
subject { PathSpec::GitIgnoreSpec.new '**/foo/bar' }
|
235
|
-
it { is_expected.to_not match('foo') }
|
236
|
-
it { is_expected.to match('foo/bar') }
|
237
|
-
it { is_expected.to match('baz/foo/bar') }
|
238
|
-
it { is_expected.to match('baz/foo/bar/sub') }
|
239
|
-
it { is_expected.to_not match('baz/foo/bar.rb') }
|
240
|
-
it { is_expected.to_not match('baz/bananafoo/bar') }
|
241
|
-
it { is_expected.to be_inclusive }
|
242
|
-
end
|
243
|
-
|
244
|
-
# A trailing "/**" matches everything inside. For example, "abc/**" matches
|
245
|
-
# all files inside directory "abc", relative to the location of the .gitignore
|
246
|
-
# file, with infinite depth.
|
247
|
-
describe 'handles leading /** as all files inside a directory' do
|
248
|
-
subject { PathSpec::GitIgnoreSpec.new 'abc/**' }
|
249
|
-
it { is_expected.to match('abc/') }
|
250
|
-
it { is_expected.to match('abc/def') }
|
251
|
-
it { is_expected.to_not match('123/abc/def') }
|
252
|
-
it { is_expected.to_not match('123/456/abc/') }
|
253
|
-
it { is_expected.to be_inclusive }
|
254
|
-
end
|
255
|
-
|
256
|
-
# A slash followed by two consecutive asterisks then a slash matches zero or
|
257
|
-
# more directories. For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b"
|
258
|
-
# and so on.
|
259
|
-
describe 'handles /** in the middle of a path' do
|
260
|
-
subject { PathSpec::GitIgnoreSpec.new 'a/**/b' }
|
261
|
-
it { is_expected.to match('a/b') }
|
262
|
-
it { is_expected.to match('a/x/b') }
|
263
|
-
it { is_expected.to match('a/x/y/b') }
|
264
|
-
it { is_expected.to_not match('123/a/b') }
|
265
|
-
it { is_expected.to_not match('123/a/x/b') }
|
266
|
-
it { is_expected.to be_inclusive }
|
267
|
-
end
|
268
|
-
|
269
|
-
describe 'matches all paths when given **' do
|
270
|
-
subject { PathSpec::GitIgnoreSpec.new '**' }
|
271
|
-
|
272
|
-
it { is_expected.to match('a/b') }
|
273
|
-
it { is_expected.to match('a/x/b') }
|
274
|
-
it { is_expected.to match('a/x/y/b') }
|
275
|
-
it { is_expected.to match('123/a/b') }
|
276
|
-
it { is_expected.to match('123/a/x/b') }
|
277
|
-
end
|
278
|
-
|
279
|
-
# Other consecutive asterisks are considered invalid.
|
280
|
-
describe 'considers other consecutive asterisks invalid' do
|
281
|
-
subject { PathSpec::GitIgnoreSpec.new 'a/***/b' }
|
282
|
-
it { is_expected.to_not match('a/b') }
|
283
|
-
it { is_expected.to_not match('a/x/b') }
|
284
|
-
it { is_expected.to_not match('a/x/y/b') }
|
285
|
-
it { is_expected.to_not match('123/a/b') }
|
286
|
-
it { is_expected.to_not match('123/a/x/b') }
|
287
|
-
it { is_expected.to_not be_inclusive }
|
288
|
-
end
|
289
|
-
|
290
|
-
describe 'does not match single absolute paths' do
|
291
|
-
subject { PathSpec::GitIgnoreSpec.new '/' }
|
292
|
-
it { is_expected.to_not match('foo.tmp') }
|
293
|
-
it { is_expected.to_not match(' ') }
|
294
|
-
it { is_expected.to_not match('a/b') }
|
295
|
-
end
|
296
|
-
|
297
|
-
describe 'nested paths are relative to the file' do
|
298
|
-
subject { PathSpec::GitIgnoreSpec.new 'foo/spam' }
|
299
|
-
it { is_expected.to match('foo/spam') }
|
300
|
-
it { is_expected.to match('foo/spam/bar') }
|
301
|
-
it { is_expected.to_not match('bar/foo/spam') }
|
302
|
-
end
|
303
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'pathspec/spec'
|
3
|
-
|
4
|
-
describe PathSpec::Spec do
|
5
|
-
subject { PathSpec::Spec.new }
|
6
|
-
|
7
|
-
it 'does not allow matching' do
|
8
|
-
expect { subject.match 'anything' }.to raise_error(/Unimplemented/)
|
9
|
-
end
|
10
|
-
|
11
|
-
it { is_expected.to be_inclusive }
|
12
|
-
end
|
data/spec/unit/pathspec_spec.rb
DELETED
@@ -1,386 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fakefs/safe'
|
3
|
-
require 'pathspec'
|
4
|
-
require 'fakefs/spec_helpers'
|
5
|
-
|
6
|
-
describe PathSpec do
|
7
|
-
shared_examples 'standard gitignore negation' do
|
8
|
-
it { is_expected.not_to match('important.txt') }
|
9
|
-
it { is_expected.not_to match('abc/important.txt') }
|
10
|
-
it { is_expected.to match('bar/baz/') }
|
11
|
-
it { is_expected.to match('foo/file') }
|
12
|
-
it { is_expected.not_to match('foo/important.txt') }
|
13
|
-
it { is_expected.to match('foo/subdir/file') }
|
14
|
-
end
|
15
|
-
|
16
|
-
# Specs that should be kept up to date with the README
|
17
|
-
context 'README.md' do
|
18
|
-
subject { PathSpec.from_filename 'spec/files/gitignore_readme' }
|
19
|
-
|
20
|
-
it { is_expected.to match('abc/def.rb') }
|
21
|
-
it { is_expected.not_to match('abc/important.txt') }
|
22
|
-
it do
|
23
|
-
expect(subject.match_paths(['/abc/123', '/abc/important.txt', '/abc/'])).to contain_exactly(
|
24
|
-
'/abc/123',
|
25
|
-
'/abc/'
|
26
|
-
)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'initialization' do
|
31
|
-
context 'from multilines' do
|
32
|
-
context '#new' do
|
33
|
-
subject {
|
34
|
-
PathSpec.new <<-IGNORELINES
|
35
|
-
!important.txt
|
36
|
-
foo/**
|
37
|
-
/bar/baz
|
38
|
-
IGNORELINES
|
39
|
-
}
|
40
|
-
|
41
|
-
it_behaves_like 'standard gitignore negation'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'from a string with no newlines' do
|
46
|
-
let(:str) { 'foo/**' }
|
47
|
-
|
48
|
-
context '#new' do
|
49
|
-
subject { PathSpec.new str }
|
50
|
-
|
51
|
-
it { is_expected.to match('foo/important.txt') }
|
52
|
-
it { is_expected.to match('foo/bar/') }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'from a non-string/non-enumerable' do
|
57
|
-
it 'throws an exception' do
|
58
|
-
expect { PathSpec.new Object.new }.to raise_error(/Cannot make Pathspec/)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'from array of gitignore strings' do
|
63
|
-
let(:arr) { ['!important.txt', 'foo/**', '/bar/baz'] }
|
64
|
-
|
65
|
-
context '#new' do
|
66
|
-
subject { PathSpec.new arr }
|
67
|
-
|
68
|
-
it_behaves_like 'standard gitignore negation'
|
69
|
-
end
|
70
|
-
|
71
|
-
context '#from_lines' do
|
72
|
-
subject {
|
73
|
-
PathSpec.from_lines(arr)
|
74
|
-
}
|
75
|
-
|
76
|
-
it_behaves_like 'standard gitignore negation'
|
77
|
-
end
|
78
|
-
|
79
|
-
context '#add array' do
|
80
|
-
subject {
|
81
|
-
ps = PathSpec.new []
|
82
|
-
ps.add arr
|
83
|
-
}
|
84
|
-
|
85
|
-
it_behaves_like 'standard gitignore negation'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'from linedelimited gitignore string' do
|
90
|
-
let(:line) { "!important.txt\nfoo/**\n/bar/baz\n" }
|
91
|
-
|
92
|
-
context '#new' do
|
93
|
-
subject { PathSpec.new line }
|
94
|
-
|
95
|
-
it_behaves_like 'standard gitignore negation'
|
96
|
-
end
|
97
|
-
|
98
|
-
context '#from_lines' do
|
99
|
-
subject {
|
100
|
-
PathSpec.from_lines(line)
|
101
|
-
}
|
102
|
-
|
103
|
-
it_behaves_like 'standard gitignore negation'
|
104
|
-
end
|
105
|
-
|
106
|
-
context '#add' do
|
107
|
-
subject {
|
108
|
-
ps = PathSpec.new
|
109
|
-
ps.add line
|
110
|
-
}
|
111
|
-
|
112
|
-
it_behaves_like 'standard gitignore negation'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context 'from a gitignore file' do
|
117
|
-
include FakeFS::SpecHelpers
|
118
|
-
|
119
|
-
let(:filename) { '.gitignore' }
|
120
|
-
before(:each) do
|
121
|
-
file = File.open(filename, 'w') { |f|
|
122
|
-
f << "!important.txt\n"
|
123
|
-
f << "foo/**\n"
|
124
|
-
f << "/bar/baz\n"
|
125
|
-
}
|
126
|
-
end
|
127
|
-
|
128
|
-
context '#new' do
|
129
|
-
subject {
|
130
|
-
PathSpec.new File.open(filename, 'r')
|
131
|
-
}
|
132
|
-
|
133
|
-
it_behaves_like 'standard gitignore negation'
|
134
|
-
end
|
135
|
-
|
136
|
-
context '#from_filename' do
|
137
|
-
subject {
|
138
|
-
PathSpec.from_filename(filename)
|
139
|
-
}
|
140
|
-
|
141
|
-
it_behaves_like 'standard gitignore negation'
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
context 'from multiple gitignore files' do
|
146
|
-
include FakeFS::SpecHelpers
|
147
|
-
|
148
|
-
let(:filenames) { ['.gitignore', '.otherignore'] }
|
149
|
-
before(:each) do
|
150
|
-
file = File.open('.gitignore', 'w') { |f|
|
151
|
-
f << "!important.txt\n"
|
152
|
-
f << "foo/**\n"
|
153
|
-
f << "/bar/baz\n"
|
154
|
-
}
|
155
|
-
|
156
|
-
file = File.open('.otherignore', 'w') { |f|
|
157
|
-
f << "ban*na\n"
|
158
|
-
f << "!banana\n"
|
159
|
-
}
|
160
|
-
end
|
161
|
-
|
162
|
-
context '#new' do
|
163
|
-
subject {
|
164
|
-
arr = filenames.collect { |f| File.open(f, 'r') }
|
165
|
-
PathSpec.new arr
|
166
|
-
}
|
167
|
-
|
168
|
-
it_behaves_like 'standard gitignore negation'
|
169
|
-
|
170
|
-
it { is_expected.to_not match('banana') }
|
171
|
-
it { is_expected.to match('banananananana') }
|
172
|
-
end
|
173
|
-
|
174
|
-
context '#add' do
|
175
|
-
subject {
|
176
|
-
arr = filenames.collect { |f| File.open(f, 'r') }
|
177
|
-
ps = PathSpec.new
|
178
|
-
ps.add arr
|
179
|
-
}
|
180
|
-
|
181
|
-
it_behaves_like 'standard gitignore negation'
|
182
|
-
|
183
|
-
it { is_expected.to_not match('banana') }
|
184
|
-
it { is_expected.to match('banananananana') }
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
context '#match_tree' do
|
190
|
-
include FakeFS::SpecHelpers
|
191
|
-
|
192
|
-
context 'unix' do
|
193
|
-
let(:root) {'/tmp/project'}
|
194
|
-
let(:gitignore) {
|
195
|
-
<<-GITIGNORE
|
196
|
-
!**/important.txt
|
197
|
-
abc/**
|
198
|
-
GITIGNORE
|
199
|
-
}
|
200
|
-
|
201
|
-
before(:each) {
|
202
|
-
FileUtils.mkdir_p root
|
203
|
-
FileUtils.mkdir_p "#{root}/abc"
|
204
|
-
FileUtils.touch "#{root}/abc/1"
|
205
|
-
FileUtils.touch "#{root}/abc/2"
|
206
|
-
FileUtils.touch "#{root}/abc/important.txt"
|
207
|
-
}
|
208
|
-
|
209
|
-
subject {
|
210
|
-
PathSpec.new(gitignore).match_tree(root)
|
211
|
-
}
|
212
|
-
|
213
|
-
it { is_expected.to include "#{root}/abc".to_s }
|
214
|
-
it { is_expected.to include "#{root}/abc/1".to_s }
|
215
|
-
it { is_expected.not_to include "#{root}/abc/important.txt".to_s }
|
216
|
-
it { is_expected.not_to include root.to_s.to_s }
|
217
|
-
end
|
218
|
-
|
219
|
-
context 'windows' do
|
220
|
-
let(:root) {'C:/project'}
|
221
|
-
let(:gitignore) {
|
222
|
-
<<-GITIGNORE
|
223
|
-
!**/important.txt
|
224
|
-
abc/**
|
225
|
-
GITIGNORE
|
226
|
-
}
|
227
|
-
|
228
|
-
before(:each) {
|
229
|
-
FileUtils.mkdir_p root
|
230
|
-
FileUtils.mkdir_p "#{root}/abc"
|
231
|
-
FileUtils.touch "#{root}/abc/1"
|
232
|
-
FileUtils.touch "#{root}/abc/2"
|
233
|
-
FileUtils.touch "#{root}/abc/important.txt"
|
234
|
-
}
|
235
|
-
|
236
|
-
subject {
|
237
|
-
PathSpec.new(gitignore).match_tree(root)
|
238
|
-
}
|
239
|
-
|
240
|
-
it { is_expected.to include "#{root}/abc".to_s }
|
241
|
-
it { is_expected.to include "#{root}/abc/1".to_s }
|
242
|
-
it { is_expected.not_to include "#{root}/abc/important.txt".to_s }
|
243
|
-
it { is_expected.not_to include root.to_s.to_s }
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
context '#match_paths' do
|
248
|
-
let(:gitignore) {
|
249
|
-
<<-GITIGNORE
|
250
|
-
!**/important.txt
|
251
|
-
/abc/**
|
252
|
-
GITIGNORE
|
253
|
-
}
|
254
|
-
|
255
|
-
context 'with no root arg' do
|
256
|
-
subject { PathSpec.new(gitignore).match_paths(['/abc/important.txt', '/abc/', '/abc/1']) }
|
257
|
-
|
258
|
-
it { is_expected.to include '/abc/' }
|
259
|
-
it { is_expected.to include '/abc/1' }
|
260
|
-
it { is_expected.not_to include '/abc/important.txt' }
|
261
|
-
end
|
262
|
-
|
263
|
-
context 'relative to non-root dir' do
|
264
|
-
subject {
|
265
|
-
PathSpec.new(gitignore).match_paths([
|
266
|
-
'/def/abc/important.txt',
|
267
|
-
'/def/abc/',
|
268
|
-
'/def/abc/1'
|
269
|
-
], '/def') }
|
270
|
-
|
271
|
-
it { is_expected.to include '/def/abc/' }
|
272
|
-
it { is_expected.to include '/def/abc/1' }
|
273
|
-
it { is_expected.not_to include '/def/abc/important.txt' }
|
274
|
-
end
|
275
|
-
|
276
|
-
context 'relative to windows drive letter' do
|
277
|
-
subject {
|
278
|
-
PathSpec.new(gitignore).match_paths([
|
279
|
-
'C:/def/abc/important.txt',
|
280
|
-
'C:/def/abc/',
|
281
|
-
'C:/def/abc/1'
|
282
|
-
], 'C:/def/') }
|
283
|
-
|
284
|
-
it { is_expected.to include 'C:/def/abc/' }
|
285
|
-
it { is_expected.to include 'C:/def/abc/1' }
|
286
|
-
it { is_expected.not_to include 'C:/def/abc/important.txt' }
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
# Example to exclude everything except a specific directory foo/bar (note
|
291
|
-
# the /* - without the slash, the wildcard would also exclude everything
|
292
|
-
# within foo/bar): (from git-scm.com)
|
293
|
-
context 'very specific gitignore' do
|
294
|
-
let(:gitignore) {
|
295
|
-
<<-GITIGNORE
|
296
|
-
# exclude everything except directory foo/bar
|
297
|
-
/*
|
298
|
-
!/foo
|
299
|
-
/foo/*
|
300
|
-
!/foo/bar
|
301
|
-
GITIGNORE
|
302
|
-
}
|
303
|
-
|
304
|
-
subject { PathSpec.new(gitignore) }
|
305
|
-
|
306
|
-
it { is_expected.not_to match('foo/bar') }
|
307
|
-
it { is_expected.to match('anything') }
|
308
|
-
it { is_expected.to match('foo/otherthing') }
|
309
|
-
end
|
310
|
-
|
311
|
-
context '#empty' do
|
312
|
-
let(:gitignore) {
|
313
|
-
<<-GITIGNORE
|
314
|
-
# A comment
|
315
|
-
GITIGNORE
|
316
|
-
}
|
317
|
-
|
318
|
-
subject { PathSpec.new gitignore }
|
319
|
-
|
320
|
-
it 'is empty when there are no valid lines' do
|
321
|
-
expect(subject.empty?).to be true
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
context 'regex file' do
|
326
|
-
let(:regexfile) {
|
327
|
-
<<-REGEX
|
328
|
-
ab*a
|
329
|
-
REGEX
|
330
|
-
}
|
331
|
-
|
332
|
-
subject { PathSpec.new regexfile, :regex}
|
333
|
-
|
334
|
-
it 'matches the regex' do
|
335
|
-
expect(subject.match('anna')).to be false
|
336
|
-
expect(subject.match('abba')).to be true
|
337
|
-
end
|
338
|
-
|
339
|
-
context '#from_filename' do
|
340
|
-
it 'forwards the type argument' do
|
341
|
-
io = double
|
342
|
-
|
343
|
-
expect(File).to receive(:open).and_yield(io)
|
344
|
-
expect(PathSpec).to receive(:from_lines).with(io, :regex)
|
345
|
-
|
346
|
-
PathSpec.from_filename '/some/file', :regex
|
347
|
-
end
|
348
|
-
|
349
|
-
it 'reads a simple regex file' do
|
350
|
-
spec = PathSpec.from_filename 'spec/files/regex_simple', :regex
|
351
|
-
|
352
|
-
expect(spec.match('artifact.md')).to be true
|
353
|
-
expect(spec.match('code.rb')).to be false
|
354
|
-
end
|
355
|
-
|
356
|
-
it 'reads a simple gitignore file' do
|
357
|
-
spec = PathSpec.from_filename 'spec/files/gitignore_simple', :git
|
358
|
-
|
359
|
-
expect(spec.match('artifact.md')).to be true
|
360
|
-
expect(spec.match('code.rb')).to be false
|
361
|
-
end
|
362
|
-
|
363
|
-
it 'reads an example ruby gitignore file' do
|
364
|
-
spec = PathSpec.from_filename 'spec/files/gitignore_ruby', :git
|
365
|
-
|
366
|
-
expect(spec.match('coverage/')).to be true
|
367
|
-
expect(spec.match('coverage/index.html')).to be true
|
368
|
-
expect(spec.match('pathspec-0.0.1.gem')).to be true
|
369
|
-
expect(spec.match('lib/pathspec')).to be false
|
370
|
-
expect(spec.match('Gemfile')).to be false
|
371
|
-
end
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
|
-
context 'unsuppored spec type' do
|
376
|
-
let(:file) {
|
377
|
-
<<-REGEX
|
378
|
-
This is some kind of nonsense.
|
379
|
-
REGEX
|
380
|
-
}
|
381
|
-
|
382
|
-
it 'does not allow an unknown spec type' do
|
383
|
-
expect { PathSpec.new file, :foo}.to raise_error(/Unknown/)
|
384
|
-
end
|
385
|
-
end
|
386
|
-
end
|