pathspec 1.1.3 → 2.1.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: f4a1cfa48aaf8c4d91ccb2aff3b5c937f453309e77077e4fd3300dcc7d82aba1
4
- data.tar.gz: 8b8a4d02f71b140bbbc6a88571e67d1fd04e2f5840361ee0b65d3a41ab87117b
3
+ metadata.gz: c8cbc90066974f8467fb62548b62bc51b00c56623b98c6fdf99897ab170378c3
4
+ data.tar.gz: 649ab494204ab19fd65086ea8f01efb16ee523b9ccf107f7b06234cff031aefb
5
5
  SHA512:
6
- metadata.gz: e08a0a2db398cd63b0033dfe32bd8da04bd5dbca8ef23a07273f3b9c773ce46e9e65f8fcb83680609171722cfaaad029008011ee8519f7fcf39080c35fc88073
7
- data.tar.gz: 2834ced5a39cf995df9e21f3c0afbece56ae5a1eff03438d6ae0e1db42e20805dce9a1dfa9198cd1048d4c84454252b62e164ca385225f2e6abfc64f0a0aaedd
6
+ metadata.gz: 67698a0b54e5cc851d86347a1929feaaf2c8967c75010f92fd1087f30e56cb39278b7d78c6fae3c8f034a52dc52d56aa23208279b5e4a3006244e65ebdc86b10
7
+ data.tar.gz: c17cdce06ee08bbddce5b92239e79f9bf76d3d5fba9684584ae1e3c13f2891f5ba3aa369be5a2f755f60ad3ffb5bde50d4672cd2ad826ef89567ac09eb356683
data/CHANGELOG.md CHANGED
@@ -1,13 +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
+
18
+ ## 2.0.0
19
+
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.
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
+
3
32
  ## 1.1.0 (Minor Release)
4
33
 
34
+ :alert: This release was mis-tagged. Use 1.1.1 instead. :alert:
35
+
5
36
  - (Maint) Updated Supported Ruby Versions
6
37
  - (Maint) Linting corrections
7
38
 
8
- ## Undocumented Releases (Sorry!)
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
9
47
 
10
48
  ## 0.2.0 (Minor Release)
49
+
11
50
  - (Feature) A CLI tool, pathspec-rb, is now provided with the gem.
12
51
  - (API Change) New namespace for gem: `PathSpec`: Everything is now namespaced under `PathSpec`, to prevent naming collisions with other libraries. Thanks @tenderlove!
13
52
  - (License) License version updated to Apache 2. Thanks @kytrinyx!
@@ -16,20 +55,24 @@
16
55
  - (Maint) Added Rubocop and made some corrections
17
56
 
18
57
  ## 0.1.2 (Patch/Bug Fix Release)
58
+
19
59
  - Fix for regexp matching Thanks @incase! #16
20
60
  - File handling cleanup Thanks @martinandert! #13
21
61
  - `from_filename` actually works now! Thanks @martinandert! #12
22
62
 
23
63
  ## 0.1.0 (Minor Release)
64
+
24
65
  - Port new edgecase handling from [python-path-specification](https://github.com/cpburnz/python-path-specification/pull/8). Many thanks to @jdpace! :)
25
66
  - Removed EOL Ruby support
26
67
  - Added current Ruby stable to Travis testing
27
68
 
28
69
  ## 0.0.2 (Patch/Bug Fix Release)
70
+
29
71
  - Fixed issues with Ruby 1.8.7/2.1.1
30
72
  - Added more testing scripts
31
73
  - Fixed Windows path related issues
32
74
  - Cleanup unnecessary things in gem
33
75
 
34
76
  ## 0.0.1
77
+
35
78
  - Initial version.
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # pathspec-ruby
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/pathspec.svg)](https://badge.fury.io/rb/pathspec) [![Ruby](https://github.com/highb/pathspec-ruby/actions/workflows/ruby.yml/badge.svg)](https://github.com/highb/pathspec-ruby/actions/workflows/ruby.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/4f3b5917e01fb34f790d/maintainability)](https://codeclimate.com/github/highb/pathspec-ruby/maintainability) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=highb_pathspec-ruby&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=highb_pathspec-ruby)
3
+ [![Gem Version](https://badge.fury.io/rb/pathspec.svg)](https://badge.fury.io/rb/pathspec) [![Ruby](https://github.com/highb/pathspec-ruby/actions/workflows/ruby.yml/badge.svg)](https://github.com/highb/pathspec-ruby/actions/workflows/ruby.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/4f3b5917e01fb34f790d/maintainability)](https://codeclimate.com/github/highb/pathspec-ruby/maintainability)
4
4
 
5
5
  [man Page as HTML](http://highb.github.io/pathspec-ruby/)
6
6
 
7
7
  [Supported Rubies](https://www.ruby-lang.org/en/downloads/):
8
8
 
9
- - 2.6 (Security Maintenance)
10
- - 2.7 (Stable, Tested)
11
- - 3.0 (Stable, Tested)
9
+ - 3.1 (Stable, Tested)
10
+ - 3.2 (Stable, Tested)
11
+ - 3.3 (Stable, Tested)
12
12
 
13
13
  Match Path Specifications, such as .gitignore, in Ruby!
14
14
 
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathspec/spec'
2
4
 
3
5
  class PathSpec
data/lib/pathspec/spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PathSpec
2
4
  # Abstract spec
3
5
  class Spec
data/lib/pathspec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathspec/gitignorespec'
2
4
  require 'pathspec/regexspec'
3
5
  require 'find'
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: 1.1.3
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: 2022-01-30 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: '1.7'
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: '1.7'
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
@@ -148,23 +140,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
140
  requirements:
149
141
  - - ">="
150
142
  - !ruby/object:Gem::Version
151
- version: 2.6.9
143
+ version: 3.1.0
152
144
  required_rubygems_version: !ruby/object:Gem::Requirement
153
145
  requirements:
154
146
  - - ">="
155
147
  - !ruby/object:Gem::Version
156
148
  version: '0'
157
149
  requirements: []
158
- rubygems_version: 3.1.4
150
+ 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: []
@@ -1,2 +0,0 @@
1
- !**/important.txt
2
- abc/**
@@ -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
@@ -1 +0,0 @@
1
- *.md
@@ -1 +0,0 @@
1
- .*\.md
data/spec/spec_helper.rb DELETED
@@ -1,6 +0,0 @@
1
- begin
2
- require 'simplecov'
3
- SimpleCov.start
4
- rescue StandardError
5
- puts 'SimpleCov failed to start, most likely this due to running Ruby 1.8.7'
6
- end
@@ -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
@@ -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