fast_ignore 0.14.0 → 0.16.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 +17 -0
- data/README.md +5 -3
- data/lib/fast_ignore/file_root.rb +39 -0
- data/lib/fast_ignore/gitconfig_parser.rb +207 -0
- data/lib/fast_ignore/gitignore_include_rule_builder.rb +102 -0
- data/lib/fast_ignore/gitignore_rule_builder.rb +125 -155
- data/lib/fast_ignore/gitignore_rule_regexp_builder.rb +76 -0
- data/lib/fast_ignore/gitignore_rule_scanner.rb +73 -0
- data/lib/fast_ignore/global_gitignore.rb +16 -8
- data/lib/fast_ignore/rule.rb +8 -3
- data/lib/fast_ignore/rule_builder.rb +19 -50
- data/lib/fast_ignore/rule_set.rb +16 -6
- data/lib/fast_ignore/rule_sets.rb +13 -12
- data/lib/fast_ignore/shebang_rule.rb +15 -5
- data/lib/fast_ignore/unmatchable_rule.rb +5 -1
- data/lib/fast_ignore/version.rb +1 -1
- data/lib/fast_ignore.rb +15 -9
- metadata +43 -18
data/lib/fast_ignore/rule_set.rb
CHANGED
@@ -6,9 +6,9 @@ class FastIgnore
|
|
6
6
|
alias_method :gitignore?, :gitignore
|
7
7
|
undef :gitignore
|
8
8
|
|
9
|
-
def initialize(rules, allow, gitignore)
|
10
|
-
@dir_rules = squash_rules(rules.reject(&:file_only?)).freeze
|
11
|
-
@file_rules = squash_rules(rules.reject(&:dir_only?)).freeze
|
9
|
+
def initialize(rules, allow, gitignore, squash = true)
|
10
|
+
@dir_rules = (squash ? squash_rules(rules.reject(&:file_only?)) : rules.reject(&:file_only?)).freeze
|
11
|
+
@file_rules = (squash ? squash_rules(rules.reject(&:dir_only?)) : rules.reject(&:dir_only?)).freeze
|
12
12
|
@has_shebang_rules = rules.any?(&:shebang?)
|
13
13
|
|
14
14
|
@allowed_recursive = { '.' => true }
|
@@ -42,8 +42,16 @@ class FastIgnore
|
|
42
42
|
not @allow
|
43
43
|
end
|
44
44
|
|
45
|
-
def squash_rules(rules)
|
46
|
-
|
45
|
+
def squash_rules(rules) # rubocop:disable Metrics/MethodLength
|
46
|
+
running_component_rule_size = rules.first&.component_rules_count || 0
|
47
|
+
rules.chunk_while do |a, b|
|
48
|
+
# a.squashable_type == b.squashable_type
|
49
|
+
next true if a.squashable_type == b.squashable_type &&
|
50
|
+
(running_component_rule_size + b.component_rules_count <= 40)
|
51
|
+
|
52
|
+
running_component_rule_size = b.component_rules_count
|
53
|
+
false
|
54
|
+
end.map do |chunk| # rubocop:disable Style/MultilineBlockChain
|
47
55
|
first = chunk.first
|
48
56
|
next first if chunk.length == 1
|
49
57
|
|
@@ -61,6 +69,8 @@ class FastIgnore
|
|
61
69
|
|
62
70
|
protected
|
63
71
|
|
64
|
-
attr_reader :dir_rules
|
72
|
+
attr_reader :dir_rules
|
73
|
+
attr_reader :file_rules
|
74
|
+
attr_reader :has_shebang_rules
|
65
75
|
end
|
66
76
|
end
|
@@ -35,13 +35,16 @@ class FastIgnore
|
|
35
35
|
@array.all? { |r| r.allowed_unrecursive?(relative_path, dir, full_path, filename, nil) }
|
36
36
|
end
|
37
37
|
|
38
|
-
def append_subdir_gitignore(relative_path:, check_exists: true)
|
39
|
-
new_gitignore = build_set_from_file(relative_path, gitignore: true, check_exists: check_exists)
|
40
|
-
return if !new_gitignore || new_gitignore.empty?
|
41
|
-
|
38
|
+
def append_subdir_gitignore(relative_path:, check_exists: true) # rubocop:disable Metrics/MethodLength
|
42
39
|
if @gitignore_rule_set
|
40
|
+
new_gitignore = build_set_from_file(relative_path, gitignore: true, check_exists: check_exists, squash: false)
|
41
|
+
return if !new_gitignore || new_gitignore.empty?
|
42
|
+
|
43
43
|
@gitignore_rule_set << new_gitignore
|
44
44
|
else
|
45
|
+
new_gitignore = build_set_from_file(relative_path, gitignore: true, check_exists: check_exists)
|
46
|
+
return if !new_gitignore || new_gitignore.empty?
|
47
|
+
|
45
48
|
@array << new_gitignore
|
46
49
|
@gitignore_rule_set = new_gitignore
|
47
50
|
@array.sort_by!(&:weight) && @array.freeze
|
@@ -75,23 +78,21 @@ class FastIgnore
|
|
75
78
|
build_rule_set(::File.readlines(path), false, gitignore: true)
|
76
79
|
end
|
77
80
|
|
78
|
-
def build_rule_set(rules, allow, expand_path_with: nil, file_root: nil, gitignore: false)
|
81
|
+
def build_rule_set(rules, allow, expand_path_with: nil, file_root: nil, gitignore: false, squash: true) # rubocop:disable Metrics/ParameterLists
|
79
82
|
rules = rules.flat_map do |rule|
|
80
83
|
::FastIgnore::RuleBuilder.build(rule, allow, expand_path_with, file_root)
|
81
84
|
end
|
82
85
|
|
83
|
-
::FastIgnore::RuleSet.new(rules, allow, gitignore)
|
86
|
+
::FastIgnore::RuleSet.new(rules, allow, gitignore, squash)
|
84
87
|
end
|
85
88
|
|
86
|
-
def build_set_from_file(filename, allow: false,
|
89
|
+
def build_set_from_file(filename, allow: false, gitignore: false, check_exists: false, squash: true)
|
87
90
|
filename = ::File.expand_path(filename, @project_root)
|
88
91
|
return if check_exists && !::File.exist?(filename)
|
89
|
-
|
90
|
-
raise ::FastIgnore::Error, "#{filename} is not within #{@project_root}"
|
91
|
-
end
|
92
|
+
raise ::FastIgnore::Error, "#{filename} is not within #{@project_root}" unless filename.start_with?(@project_root)
|
92
93
|
|
93
|
-
file_root
|
94
|
-
build_rule_set(::File.readlines(filename), allow, file_root: file_root, gitignore: gitignore)
|
94
|
+
file_root = ::FastIgnore::FileRoot.build(filename, @project_root)
|
95
|
+
build_rule_set(::File.readlines(filename), allow, file_root: file_root, gitignore: gitignore, squash: squash)
|
95
96
|
end
|
96
97
|
|
97
98
|
def append_sets_from_files(files, allow: false)
|
@@ -8,17 +8,24 @@ class FastIgnore
|
|
8
8
|
|
9
9
|
attr_reader :rule
|
10
10
|
|
11
|
+
attr_reader :file_path_pattern
|
12
|
+
|
11
13
|
attr_reader :squashable_type
|
12
14
|
|
13
15
|
def squash(rules)
|
14
|
-
::FastIgnore::ShebangRule.new(::Regexp.union(rules.map(&:rule)).freeze, negation
|
16
|
+
::FastIgnore::ShebangRule.new(::Regexp.union(rules.map(&:rule)).freeze, negation?, file_path_pattern)
|
17
|
+
end
|
18
|
+
|
19
|
+
def component_rules_count
|
20
|
+
1
|
15
21
|
end
|
16
22
|
|
17
|
-
def initialize(rule, negation)
|
23
|
+
def initialize(rule, negation, file_path_pattern)
|
18
24
|
@rule = rule
|
19
25
|
@negation = negation
|
26
|
+
@file_path_pattern = file_path_pattern
|
20
27
|
|
21
|
-
@squashable_type = negation ?
|
28
|
+
@squashable_type = (negation ? 13 : 12) + file_path_pattern.object_id
|
22
29
|
|
23
30
|
freeze
|
24
31
|
end
|
@@ -33,12 +40,15 @@ class FastIgnore
|
|
33
40
|
|
34
41
|
# :nocov:
|
35
42
|
def inspect
|
36
|
-
|
43
|
+
allow_fragment = 'allow ' if @negation
|
44
|
+
in_fragment = " in #{@file_path_pattern}" if @file_path_pattern
|
45
|
+
"#<ShebangRule #{allow_fragment}#!:#{@rule.to_s[15..-4]}#{in_fragment}>"
|
37
46
|
end
|
38
47
|
# :nocov:
|
39
48
|
|
40
|
-
def match?(
|
49
|
+
def match?(relative_path, full_path, filename, content)
|
41
50
|
return false if filename.include?('.')
|
51
|
+
return false unless (not @file_path_pattern) || @file_path_pattern.match?(relative_path)
|
42
52
|
|
43
53
|
(content || first_line(full_path))&.match?(@rule)
|
44
54
|
end
|
@@ -11,6 +11,10 @@ class FastIgnore
|
|
11
11
|
5
|
12
12
|
end
|
13
13
|
|
14
|
+
def component_rules_count
|
15
|
+
1
|
16
|
+
end
|
17
|
+
|
14
18
|
def dir_only?
|
15
19
|
false
|
16
20
|
end
|
@@ -29,7 +33,7 @@ class FastIgnore
|
|
29
33
|
end
|
30
34
|
# :nocov:
|
31
35
|
|
32
|
-
def match?(
|
36
|
+
def match?(_relative_path, _full_path, _filename, _content)
|
33
37
|
false
|
34
38
|
end
|
35
39
|
end
|
data/lib/fast_ignore/version.rb
CHANGED
data/lib/fast_ignore.rb
CHANGED
@@ -4,18 +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/rule'
|
13
|
-
require_relative './fast_ignore/unmatchable_rule'
|
14
|
-
require_relative './fast_ignore/shebang_rule'
|
15
7
|
|
16
8
|
class FastIgnore
|
17
9
|
class Error < StandardError; end
|
18
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
|
+
|
19
25
|
include ::Enumerable
|
20
26
|
|
21
27
|
# :nocov:
|
@@ -82,7 +88,7 @@ class FastIgnore
|
|
82
88
|
@loaded_gitignore_files << parent_path
|
83
89
|
end
|
84
90
|
|
85
|
-
def each_recursive(parent_full_path, parent_relative_path, &block) # rubocop:disable Metrics/MethodLength
|
91
|
+
def each_recursive(parent_full_path, parent_relative_path, &block) # rubocop:disable Metrics/MethodLength
|
86
92
|
children = ::Dir.children(parent_full_path)
|
87
93
|
load_gitignore(parent_relative_path, check_exists: false) if @gitignore_enabled && children.include?('.gitignore')
|
88
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.
|
4
|
+
version: 0.16.0
|
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:
|
11
|
+
date: 2021-12-09 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.
|
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.
|
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,34 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 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.
|
99
|
+
version: 0.93.1
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.12'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
104
|
name: rubocop-rspec
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
|
-
- - "
|
107
|
+
- - ">="
|
102
108
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
109
|
+
version: 1.44.1
|
104
110
|
type: :development
|
105
111
|
prerelease: false
|
106
112
|
version_requirements: !ruby/object:Gem::Requirement
|
107
113
|
requirements:
|
108
|
-
- - "
|
114
|
+
- - ">="
|
109
115
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
116
|
+
version: 1.44.1
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
118
|
name: simplecov
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +128,20 @@ dependencies:
|
|
122
128
|
- - "~>"
|
123
129
|
- !ruby/object:Gem::Version
|
124
130
|
version: 0.18.5
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: simplecov-console
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
125
145
|
- !ruby/object:Gem::Dependency
|
126
146
|
name: spellr
|
127
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,7 +156,7 @@ dependencies:
|
|
136
156
|
- - ">="
|
137
157
|
- !ruby/object:Gem::Version
|
138
158
|
version: 0.8.3
|
139
|
-
description:
|
159
|
+
description:
|
140
160
|
email:
|
141
161
|
- robot@dana.sh
|
142
162
|
executables: []
|
@@ -148,7 +168,12 @@ files:
|
|
148
168
|
- README.md
|
149
169
|
- lib/fast_ignore.rb
|
150
170
|
- lib/fast_ignore/backports.rb
|
171
|
+
- lib/fast_ignore/file_root.rb
|
172
|
+
- lib/fast_ignore/gitconfig_parser.rb
|
173
|
+
- lib/fast_ignore/gitignore_include_rule_builder.rb
|
151
174
|
- lib/fast_ignore/gitignore_rule_builder.rb
|
175
|
+
- lib/fast_ignore/gitignore_rule_regexp_builder.rb
|
176
|
+
- lib/fast_ignore/gitignore_rule_scanner.rb
|
152
177
|
- lib/fast_ignore/global_gitignore.rb
|
153
178
|
- lib/fast_ignore/rule.rb
|
154
179
|
- lib/fast_ignore/rule_builder.rb
|
@@ -163,24 +188,24 @@ licenses:
|
|
163
188
|
metadata:
|
164
189
|
homepage_uri: https://github.com/robotdana/fast_ignore
|
165
190
|
source_code_uri: https://github.com/robotdana/fast_ignore
|
166
|
-
changelog_uri: https://github.com/robotdana/fast_ignore/blob/
|
167
|
-
post_install_message:
|
191
|
+
changelog_uri: https://github.com/robotdana/fast_ignore/blob/main/CHANGELOG.md
|
192
|
+
post_install_message:
|
168
193
|
rdoc_options: []
|
169
194
|
require_paths:
|
170
195
|
- lib
|
171
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
172
197
|
requirements:
|
173
|
-
- - "
|
198
|
+
- - ">="
|
174
199
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
200
|
+
version: 2.4.0
|
176
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
202
|
requirements:
|
178
203
|
- - ">="
|
179
204
|
- !ruby/object:Gem::Version
|
180
205
|
version: '0'
|
181
206
|
requirements: []
|
182
|
-
rubygems_version: 3.
|
183
|
-
signing_key:
|
207
|
+
rubygems_version: 3.2.15
|
208
|
+
signing_key:
|
184
209
|
specification_version: 4
|
185
210
|
summary: Parse gitignore files, quickly
|
186
211
|
test_files: []
|