fast_ignore 0.15.0 → 0.16.1

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: f96030c8670a5d709139689212b3a78a0eb0b5266cbd0057954863ae89e11745
4
- data.tar.gz: a2815ec68f6c367a4450efce8799aa359adeee1ad1aaa971b589cd8612ddbb61
3
+ metadata.gz: 7952045a743c12fa1963ffba7aa81a8ca3cc81aec40b0bfc9c0e6bb6424e9433
4
+ data.tar.gz: dcacd0bdd1873638156c9b2323263cf1ee7fc349b012f40c28caa4fe10d82f91
5
5
  SHA512:
6
- metadata.gz: 5c22c6c79a6605473156a041d5ddb5b81f943605dc4360dd8577acd56718c928c106e044169b13bc73c7e884ffcc5516c7a6b5d6134fee9aaa4aa73d0178b791
7
- data.tar.gz: 1d165e44b50d9b1c301c5cad8ff3c443bfb2f9134be09e28a4e90539c960a269083485f6ff30bc6df6e2ec82347630187ebf0082cd2d06ba7416e9c70f37ea6f
6
+ metadata.gz: 35c9fedb895b3e30632b29aab2eba3369ec6512bd6c5b9cfa563156c4c0c291b5c7854877aa4c8da063b54ed97a6f132c5d903622d2a6e2fc69c57c708150c33
7
+ data.tar.gz: ca894c9a8e11471d3c1f81f959862cd16a60db784898ef0d0e4da880e063257334fdf6aad061d95c23850c726ffde781076e6c248ebecfa808701d0731fbb125
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # v0.16.1
2
+ - respect GIT_CONFIG_SYSTEM, GIT_CONFIG_NOSYSTEM and GIT_CONFIG_GLOBAL env vars the same way git does
3
+ - make the tests more resilient to whatever global config is going on.
4
+
5
+ # v0.16.0
6
+ - Entirely rewrite the way that git config files are read. previously it was just a regexp. now we actually parse git config files according to the same rules as git.
7
+ - Add ruby 3 to the test matrix
8
+
9
+ # v0.15.2
10
+ - Updated methods with multiple `_` arguments to have different names to make sorbet happy
11
+
12
+ # v0.15.1
13
+ - Updated dependencies to allow running on ruby 3.0.0.preview1
14
+
1
15
  # v0.15.0
2
16
  - fixed a handful of character class edge cases to match git behavior
3
17
  - mostly ranges with - or / as one end of the range
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # FastIgnore
2
2
 
3
- [![travis](https://travis-ci.com/robotdana/fast_ignore.svg?branch=master)](https://travis-ci.com/robotdana/fast_ignore)
3
+ [![travis](https://travis-ci.com/robotdana/fast_ignore.svg?branch=main)](https://travis-ci.com/robotdana/fast_ignore)
4
4
  [![Gem Version](https://badge.fury.io/rb/fast_ignore.svg)](https://rubygems.org/gems/fast_ignore)
5
5
 
6
6
  This started as a way to quickly and natively ruby-ly parse gitignore files and find matching files.
@@ -15,7 +15,7 @@ FastIgnore.new(relative: true).sort == `git ls-files`.split("\n").sort
15
15
  ## Features
16
16
 
17
17
  - Fast (faster than using `` `git ls-files`.split("\n") `` for small repos (because it avoids the overhead of ``` `` ```))
18
- - Supports ruby 2.4-2.7 & jruby
18
+ - Supports ruby 2.4-3.0.x & jruby
19
19
  - supports all [gitignore rule patterns](https://git-scm.com/docs/gitignore#_pattern_format)
20
20
  - doesn't require git to be installed
21
21
  - supports a gitignore-esque "include" patterns. ([`include_rules:`](#include_rules)/[`include_files:`](#include_files))
@@ -309,6 +309,7 @@ This is not required, and if FastIgnore does have to go to the filesystem for th
309
309
  (It does handle changing the current working directory between [`FastIgnore#allowed?`](#allowed) calls)
310
310
  - FastIgnore always matches patterns case-insensitively. (git varies by filesystem).
311
311
  - FastIgnore always outputs paths as literal UTF-8 characters. (git depends on your core.quotepath setting but by default outputs non ascii paths with octal escapes surrounded by quotes).
312
+ - git has a system-wide config file installed at `$(prefix)/etc/gitconfig`, where `prefix` is defined for git at install time. FastIgnore assumes that it will always be `/usr/local/etc/gitconfig`. if it's important your system config file is looked at, as that's where you have the core.excludesfile defined, use git's built-in way to override this by adding `export GIT_CONFIG_SYSTEM='/the/actual/location'` to your shell profile.
312
313
  - Because git looks at its own index objects and FastIgnore looks at the file system there may be some differences between FastIgnore and `git ls-files`. To avoid these differences you may want to use the [`git_ls`](https://github.com/robotdana/git_ls) gem instead
313
314
  - Tracked files that were committed before the matching ignore rule was committed will be returned by `git ls-files`, but not by FastIgnore.
314
315
  - Untracked files will be returned by FastIgnore, but not by `git ls-files`
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'strscan'
4
+ class FastIgnore
5
+ class GitconfigParseError < FastIgnore::Error; end
6
+
7
+ class GitconfigParser # rubocop:disable Metrics/ClassLength
8
+ def self.parse(file, root: Dir.pwd, nesting: 1)
9
+ new(file, root: root, nesting: nesting).parse
10
+ end
11
+
12
+ def initialize(path, root: Dir.pwd, nesting: 1)
13
+ @path = path
14
+ @root = root
15
+ @nesting = nesting
16
+ end
17
+
18
+ def parse
19
+ raise ::FastIgnore::GitconfigParseError if nesting >= 10
20
+
21
+ read_file(path)
22
+ return unless value
23
+
24
+ value
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :nesting
30
+ attr_reader :path
31
+ attr_reader :root
32
+ attr_accessor :value
33
+ attr_accessor :within_quotes
34
+ attr_accessor :section
35
+
36
+ def read_file(path) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
37
+ return unless ::File.readable?(path)
38
+
39
+ file = StringScanner.new(::File.read(path))
40
+
41
+ until file.eos?
42
+ if file.skip(/(\s+|[#;].*\n)/)
43
+ # skip
44
+ elsif file.skip(/\[core\]/i)
45
+ self.section = :core
46
+ elsif file.skip(/\[include\]/i)
47
+ self.section = :include
48
+ elsif file.skip(/\[(?i:includeif) +"/)
49
+ self.section = include_if(file) ? :include : :not_include
50
+ elsif file.skip(/\[[\w.]+( "([^\0\\"]|\\(\\{2})*"|\\{2}*)+")?\]/)
51
+ self.section = :other
52
+ elsif section == :core && file.skip(/excludesfile\s*=(\s|\\\n)*/i)
53
+ self.value = scan_value(file)
54
+ elsif section == :include && file.skip(/path\s*=(\s|\\\n)*/)
55
+ include_path = scan_value(file)
56
+
57
+ value = ::FastIgnore::GitconfigParser.parse(
58
+ ::File.expand_path(include_path, ::File.dirname(path)),
59
+ root: root,
60
+ nesting: nesting + 1
61
+ )
62
+ self.value = value if value
63
+ self.section = :include
64
+ elsif file.skip(/[a-zA-Z0-9]\w*\s*([#;].*)?\n/)
65
+ nil
66
+ elsif file.skip(/[a-zA-Z0-9]\w*\s*=(\s|\\\n)*/)
67
+ skip_value(file)
68
+ else
69
+ raise ::FastIgnore::GitconfigParseError
70
+ end
71
+ end
72
+ end
73
+
74
+ def scan_condition_value(file)
75
+ if file.scan(/([^\0\\\n"]|\\(\\{2})*"|\\{2}*)+(?="\])/)
76
+ value = file.matched
77
+ file.skip(/"\]/)
78
+ value
79
+ else
80
+ raise ::FastIgnore::GitconfigParseError
81
+ end
82
+ end
83
+
84
+ def skip_condition_value(file)
85
+ raise ::FastIgnore::GitconfigParseError unless file.skip(/([^\0\\\n"]|\\(\\{2})*"|\\{2}*)+"\]/)
86
+ end
87
+
88
+ def include_if(file)
89
+ if file.skip(/onbranch:/)
90
+ on_branch?(scan_condition_value(file))
91
+ elsif file.skip(/gitdir:/)
92
+ gitdir?(scan_condition_value(file), path: path)
93
+ elsif file.skip(%r{gitdir/i:})
94
+ gitdir?(scan_condition_value(file), case_insensitive: true, path: path)
95
+ else
96
+ skip_condition_value(file)
97
+ false
98
+ end
99
+ end
100
+
101
+ def on_branch?(branch_pattern)
102
+ branch_pattern += '**' if branch_pattern.end_with?('/')
103
+ current_branch = ::File.readable?("#{root}/.git/HEAD") && ::File.read("#{root}/.git/HEAD").sub!(
104
+ %r{\Aref: refs/heads/}, ''
105
+ )
106
+ return unless current_branch
107
+
108
+ # goddamit git what does 'a pattern with standard globbing wildcards' mean
109
+ ::File.fnmatch(branch_pattern, current_branch, ::File::FNM_PATHNAME | ::File::FNM_DOTMATCH)
110
+ end
111
+
112
+ def gitdir?(gitdir, path:, case_insensitive: false)
113
+ gitdir += '**' if gitdir.end_with?('/')
114
+ gitdir.sub!(%r{\A~/}, ENV['HOME'] + '/')
115
+ gitdir.sub!(/\A\./, path + '/')
116
+ gitdir = "**/#{gitdir}" unless gitdir.start_with?('/')
117
+ options = ::File::FNM_PATHNAME | ::File::FNM_DOTMATCH
118
+ options |= ::File::FNM_CASEFOLD if case_insensitive
119
+ ::File.fnmatch(gitdir, ::File.join(root, '.git'), options)
120
+ end
121
+
122
+ def scan_value(file) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
123
+ value = +''
124
+ until file.eos?
125
+ if file.skip(/\\\n/)
126
+ # continue
127
+ elsif file.skip(/\\\\/)
128
+ value << '\\'
129
+ elsif file.skip(/\\n/)
130
+ value << "\n"
131
+ elsif file.skip(/\\t/)
132
+ value << "\t"
133
+ elsif file.skip(/\\b/)
134
+ value.chop!
135
+ elsif file.skip(/\\"/)
136
+ value << '"'
137
+ elsif file.skip(/\\/)
138
+ raise ::FastIgnore::GitconfigParseError
139
+ elsif within_quotes
140
+ if file.skip(/"/)
141
+ self.within_quotes = false
142
+ elsif file.scan(/[^"\\\n]+/)
143
+ value << file.matched
144
+ elsif file.skip(/\n/)
145
+ raise ::FastIgnore::GitconfigParseError
146
+ # :nocov:
147
+ else
148
+ raise "Unmatched #{file.rest}"
149
+ # :nocov:
150
+ end
151
+ elsif file.skip(/"/)
152
+ self.within_quotes = true
153
+ elsif file.scan(/[^;#"\s\\]+/)
154
+ value << file.matched
155
+ elsif file.skip(/\s*[;#\n]/)
156
+ break
157
+ elsif file.scan(/\s+/) # rubocop:disable Lint/DuplicateBranch
158
+ value << file.matched
159
+ # :nocov:
160
+ else
161
+ raise "Unmatched #{file.rest}"
162
+ # :nocov:
163
+ end
164
+ end
165
+
166
+ raise ::FastIgnore::GitconfigParseError if within_quotes
167
+
168
+ value
169
+ end
170
+
171
+ def skip_value(file) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
172
+ until file.eos?
173
+ if file.skip(/\\(?:\n|\\|n|t|b|")/)
174
+ nil
175
+ elsif file.skip(/\\/)
176
+ raise ::FastIgnore::GitconfigParseError
177
+ elsif within_quotes
178
+ if file.skip(/"/)
179
+ self.within_quotes = false
180
+ elsif file.skip(/[^"\\\n]+/)
181
+ nil
182
+ elsif file.scan(/\n/)
183
+ raise ::FastIgnore::GitconfigParseError
184
+ # :nocov:
185
+ else
186
+ raise "Unmatched #{file.rest}"
187
+ # :nocov:
188
+ end
189
+ elsif file.skip(/"/)
190
+ self.within_quotes = true
191
+ elsif file.skip(/[^;#"\s\\]+/) # rubocop:disable Lint/DuplicateBranch
192
+ nil
193
+ elsif file.skip(/\s*[;#\n]/)
194
+ break
195
+ elsif file.skip(/\s+/) # rubocop:disable Lint/DuplicateBranch
196
+ nil
197
+ # :nocov:
198
+ else
199
+ raise "Unmatched #{file.rest}"
200
+ # :nocov:
201
+ end
202
+ end
203
+
204
+ raise ::FastIgnore::GitconfigParseError if within_quotes
205
+ end
206
+ end
207
+ end
@@ -100,7 +100,7 @@ class FastIgnore
100
100
  end
101
101
  end
102
102
 
103
- def process_character_class # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
103
+ def process_character_class # rubocop:disable Metrics/MethodLength
104
104
  return unless @s.character_class_start?
105
105
 
106
106
  @re.append_character_class_open
@@ -4,46 +4,84 @@ class FastIgnore
4
4
  module GlobalGitignore
5
5
  class << self
6
6
  def path(root:)
7
- gitconfig_gitignore_path(::File.expand_path('.git/config', root)) ||
8
- gitconfig_gitignore_path(::File.expand_path('~/.gitconfig')) ||
9
- gitconfig_gitignore_path(xdg_config_path) ||
10
- gitconfig_gitignore_path('/etc/gitconfig') ||
7
+ ignore_path = gitconfigs_gitignore_path(root) ||
11
8
  default_global_gitignore_path
9
+
10
+ ignore_path unless ignore_path.empty?
12
11
  end
13
12
 
14
13
  private
15
14
 
15
+ def gitconfigs_gitignore_path(root)
16
+ gitconfig_gitignore_path(repo_config_path(root)) ||
17
+ gitconfig_gitignore_path(global_config_path) ||
18
+ gitconfig_gitignore_path(default_user_config_path) ||
19
+ gitconfig_gitignore_path(system_config_path)
20
+ rescue ::FastIgnore::GitconfigParseError
21
+ ''
22
+ end
23
+
16
24
  def gitconfig_gitignore_path(config_path)
17
25
  return unless config_path
18
- return unless ::File.exist?(config_path)
26
+ return unless ::File.readable?(config_path)
19
27
 
20
- ignore_path = ::File.readlines(config_path).find { |l| l.sub!(/\A\s*excludesfile\s*=/, '') }
28
+ ignore_path = ::FastIgnore::GitconfigParser.parse(config_path)
21
29
  return unless ignore_path
22
30
 
23
31
  ignore_path.strip!
24
- return ignore_path if ignore_path.empty? # don't expand path in this case
32
+ return '' if ignore_path.empty? # don't expand path in this case
25
33
 
26
34
  ::File.expand_path(ignore_path)
27
35
  end
28
36
 
29
- def xdg_config_path
30
- xdg_config_home? && ::File.expand_path('git/config', xdg_config_home)
37
+ def default_user_config_path
38
+ return if env('GIT_CONFIG_GLOBAL')
39
+
40
+ ::File.expand_path('git/config', default_config_home)
31
41
  end
32
42
 
33
43
  def default_global_gitignore_path
34
- if xdg_config_home?
35
- ::File.expand_path('git/ignore', xdg_config_home)
44
+ ::File.expand_path('git/ignore', default_config_home)
45
+ end
46
+
47
+ def repo_config_path(root)
48
+ ::File.expand_path('.git/config', root)
49
+ end
50
+
51
+ def global_config_path
52
+ ::File.expand_path(env('GIT_CONFIG_GLOBAL', '~/.gitconfig'))
53
+ end
54
+
55
+ def system_config_path
56
+ return if env?('GIT_CONFIG_NOSYSTEM')
57
+
58
+ ::File.expand_path(env('GIT_CONFIG_SYSTEM', '/usr/local/etc/gitconfig'))
59
+ end
60
+
61
+ def default_config_home
62
+ env('XDG_CONFIG_HOME', '~/.config')
63
+ end
64
+
65
+ def env(env_var, default = nil)
66
+ value = ::ENV[env_var]
67
+
68
+ if value && (not value.empty?)
69
+ value
36
70
  else
37
- ::File.expand_path('~/.config/git/ignore')
71
+ default
38
72
  end
39
73
  end
40
74
 
41
- def xdg_config_home
42
- ::ENV['XDG_CONFIG_HOME']
43
- end
75
+ def env?(env_var)
76
+ value = ::ENV[env_var]
44
77
 
45
- def xdg_config_home?
46
- xdg_config_home && (not xdg_config_home.empty?)
78
+ if value&.match?(/\A(yes|on|true|1)\z/i)
79
+ true
80
+ elsif !value || value.match?(/\A(no|off|false|0|)\z/i)
81
+ false
82
+ else
83
+ raise ::FastIgnore::GitconfigParseError
84
+ end
47
85
  end
48
86
  end
49
87
  end
@@ -58,7 +58,7 @@ class FastIgnore
58
58
  end
59
59
  # :nocov:
60
60
 
61
- def match?(relative_path, _, _, _)
61
+ def match?(relative_path, _full_path, _filename, _content)
62
62
  @rule.match?(relative_path)
63
63
  end
64
64
  end
@@ -73,7 +73,7 @@ class FastIgnore
73
73
  end
74
74
 
75
75
  def build_from_root_gitignore_file(path)
76
- return unless ::File.exist?(path)
76
+ return unless path && ::File.exist?(path)
77
77
 
78
78
  build_rule_set(::File.readlines(path), false, gitignore: true)
79
79
  end
@@ -46,9 +46,9 @@ class FastIgnore
46
46
  end
47
47
  # :nocov:
48
48
 
49
- def match?(path, full_path, filename, content)
49
+ def match?(relative_path, full_path, filename, content)
50
50
  return false if filename.include?('.')
51
- return false unless (not @file_path_pattern) || @file_path_pattern.match?(path)
51
+ return false unless (not @file_path_pattern) || @file_path_pattern.match?(relative_path)
52
52
 
53
53
  (content || first_line(full_path))&.match?(@rule)
54
54
  end
@@ -33,7 +33,7 @@ class FastIgnore
33
33
  end
34
34
  # :nocov:
35
35
 
36
- def match?(_, _, _, _)
36
+ def match?(_relative_path, _full_path, _filename, _content)
37
37
  false
38
38
  end
39
39
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class FastIgnore
4
- VERSION = '0.15.0'
4
+ VERSION = '0.16.1'
5
5
  end
data/lib/fast_ignore.rb CHANGED
@@ -4,22 +4,24 @@ require_relative './fast_ignore/backports'
4
4
 
5
5
  require 'set'
6
6
  require 'strscan'
7
- require_relative './fast_ignore/rule_sets'
8
- require_relative './fast_ignore/rule_set'
9
- require_relative './fast_ignore/global_gitignore'
10
- require_relative './fast_ignore/rule_builder'
11
- require_relative './fast_ignore/gitignore_rule_builder'
12
- require_relative './fast_ignore/gitignore_include_rule_builder'
13
- require_relative './fast_ignore/gitignore_rule_regexp_builder'
14
- require_relative './fast_ignore/gitignore_rule_scanner'
15
- require_relative './fast_ignore/file_root'
16
- require_relative './fast_ignore/rule'
17
- require_relative './fast_ignore/unmatchable_rule'
18
- require_relative './fast_ignore/shebang_rule'
19
7
 
20
8
  class FastIgnore
21
9
  class Error < StandardError; end
22
10
 
11
+ require_relative './fast_ignore/rule_sets'
12
+ require_relative './fast_ignore/rule_set'
13
+ require_relative './fast_ignore/global_gitignore'
14
+ require_relative './fast_ignore/rule_builder'
15
+ require_relative './fast_ignore/gitignore_rule_builder'
16
+ require_relative './fast_ignore/gitignore_include_rule_builder'
17
+ require_relative './fast_ignore/gitignore_rule_regexp_builder'
18
+ require_relative './fast_ignore/gitignore_rule_scanner'
19
+ require_relative './fast_ignore/file_root'
20
+ require_relative './fast_ignore/rule'
21
+ require_relative './fast_ignore/unmatchable_rule'
22
+ require_relative './fast_ignore/shebang_rule'
23
+ require_relative './fast_ignore/gitconfig_parser'
24
+
23
25
  include ::Enumerable
24
26
 
25
27
  # :nocov:
@@ -86,7 +88,7 @@ class FastIgnore
86
88
  @loaded_gitignore_files << parent_path
87
89
  end
88
90
 
89
- def each_recursive(parent_full_path, parent_relative_path, &block) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
91
+ def each_recursive(parent_full_path, parent_relative_path, &block) # rubocop:disable Metrics/MethodLength
90
92
  children = ::Dir.children(parent_full_path)
91
93
  load_gitignore(parent_relative_path, check_exists: false) if @gitignore_enabled && children.include?('.gitignore')
92
94
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_ignore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-18 00:00:00.000000000 Z
11
+ date: 2021-12-11 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: 0.2.2
33
+ version: 0.4.0
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: 0.2.2
40
+ version: 0.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,48 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 0.74.0
89
+ version: 0.93.1
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.12'
90
93
  type: :development
91
94
  prerelease: false
92
95
  version_requirements: !ruby/object:Gem::Requirement
93
96
  requirements:
94
97
  - - ">="
95
98
  - !ruby/object:Gem::Version
96
- version: 0.74.0
99
+ version: 0.93.1
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.12'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
97
117
  - !ruby/object:Gem::Dependency
98
118
  name: rubocop-rspec
99
119
  requirement: !ruby/object:Gem::Requirement
100
120
  requirements:
101
- - - "~>"
121
+ - - ">="
102
122
  - !ruby/object:Gem::Version
103
- version: '1'
123
+ version: 1.44.1
104
124
  type: :development
105
125
  prerelease: false
106
126
  version_requirements: !ruby/object:Gem::Requirement
107
127
  requirements:
108
- - - "~>"
128
+ - - ">="
109
129
  - !ruby/object:Gem::Version
110
- version: '1'
130
+ version: 1.44.1
111
131
  - !ruby/object:Gem::Dependency
112
132
  name: simplecov
113
133
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +142,20 @@ dependencies:
122
142
  - - "~>"
123
143
  - !ruby/object:Gem::Version
124
144
  version: 0.18.5
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov-console
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
125
159
  - !ruby/object:Gem::Dependency
126
160
  name: spellr
127
161
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +170,7 @@ dependencies:
136
170
  - - ">="
137
171
  - !ruby/object:Gem::Version
138
172
  version: 0.8.3
139
- description:
173
+ description:
140
174
  email:
141
175
  - robot@dana.sh
142
176
  executables: []
@@ -149,6 +183,7 @@ files:
149
183
  - lib/fast_ignore.rb
150
184
  - lib/fast_ignore/backports.rb
151
185
  - lib/fast_ignore/file_root.rb
186
+ - lib/fast_ignore/gitconfig_parser.rb
152
187
  - lib/fast_ignore/gitignore_include_rule_builder.rb
153
188
  - lib/fast_ignore/gitignore_rule_builder.rb
154
189
  - lib/fast_ignore/gitignore_rule_regexp_builder.rb
@@ -167,24 +202,24 @@ licenses:
167
202
  metadata:
168
203
  homepage_uri: https://github.com/robotdana/fast_ignore
169
204
  source_code_uri: https://github.com/robotdana/fast_ignore
170
- changelog_uri: https://github.com/robotdana/fast_ignore/blob/master/CHANGELOG.md
171
- post_install_message:
205
+ changelog_uri: https://github.com/robotdana/fast_ignore/blob/main/CHANGELOG.md
206
+ post_install_message:
172
207
  rdoc_options: []
173
208
  require_paths:
174
209
  - lib
175
210
  required_ruby_version: !ruby/object:Gem::Requirement
176
211
  requirements:
177
- - - "~>"
212
+ - - ">="
178
213
  - !ruby/object:Gem::Version
179
- version: '2.4'
214
+ version: 2.4.0
180
215
  required_rubygems_version: !ruby/object:Gem::Requirement
181
216
  requirements:
182
217
  - - ">="
183
218
  - !ruby/object:Gem::Version
184
219
  version: '0'
185
220
  requirements: []
186
- rubygems_version: 3.1.2
187
- signing_key:
221
+ rubygems_version: 3.2.15
222
+ signing_key:
188
223
  specification_version: 4
189
224
  summary: Parse gitignore files, quickly
190
225
  test_files: []