fast_ignore 0.14.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []