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.
@@ -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
- rules.chunk_while { |a, b| a.squashable_type == b.squashable_type }.map do |chunk|
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, :file_rules, :has_shebang_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, file_root: nil, gitignore: false, check_exists: 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
- unless file_root || filename.start_with?(@project_root)
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 ||= "#{::File.dirname(filename)}/".delete_prefix(@project_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 ? 3 : 2
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
- "#<ShebangRule #{'allow ' if @negation}#!:#{@rule.to_s[15..-4]}>"
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?(_, full_path, filename, content)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class FastIgnore
4
- VERSION = '0.14.0'
4
+ VERSION = '0.16.0'
5
5
  end
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, Metrics/AbcSize
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.14.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: 2020-06-28 00:00:00.000000000 Z
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.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,34 @@ 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'
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: '1'
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: '1'
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/master/CHANGELOG.md
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: '2.4'
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.1.2
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: []