fast_ignore 0.8.1 → 0.8.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02257f4f18a12cf4bae69ef8d4aa79c617f765726ae76a03bccf5391d920031e
4
- data.tar.gz: 79fc7d4960118dbff36a42a6fae04d69890011842a2bb94c35966e7b9b1f8651
3
+ metadata.gz: 03c81966a545152071086c49d90057bc1950731affd0abdaabfe622c1b357d78
4
+ data.tar.gz: 312e624e3a542e3ee179d02f11070fe2a78d43cf7304b92a8420071ffdde75aa
5
5
  SHA512:
6
- metadata.gz: be65dc38c204c7b1bfabd9cb61379a3516658c14bdbc242b396da79a247a1663e5d866194118f9da200410815f9888e946d9ac716e59ca9df9892cafede71da2
7
- data.tar.gz: a6a4178e53e44c46f952e38aa66e7d5b92b90d449bacf449638afded35c82549c543ccd9aeebe1e53f505d0847f585c9be9fd0c13fcfa3f1344990f2faeee57d
6
+ metadata.gz: 98af14403dd1ba3dd9ac4800077324ed21d00a0a57e9761e3e720fe81e723de589e016ae78696c8ce173ab60e027361a37181c61492fbd8240a85657612b13ad
7
+ data.tar.gz: df3f1d628a6f42b8630ee6c8aacc23722720e88e782001809bb4106da68853e365f573b4796b3e0fa828fc640428ac7e820ab6b0eade1a8eee1affbea605118d
data/.gitignore CHANGED
@@ -1,13 +1,6 @@
1
1
  /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
2
  /coverage/
5
- /doc/
6
3
  /pkg/
7
- /spec/reports/
8
- /tmp/
9
-
10
- # rspec failure tracking
11
4
  .rspec_status
12
5
  *.gem
13
6
  Gemfile.lock
data/.rubocop.yml CHANGED
@@ -7,6 +7,7 @@ require: rubocop-rspec
7
7
  # Each override should have a comment (even if it's just "default is bad")
8
8
 
9
9
  AllCops:
10
+ NewCops: enable
10
11
  Exclude:
11
12
  - db/schema*
12
13
  - .bundle/**/*
data/.spellr.yml ADDED
@@ -0,0 +1,5 @@
1
+ excludes:
2
+ - vendor
3
+ languages:
4
+ english:
5
+ locale: [US, AU]
@@ -0,0 +1,41 @@
1
+ argv
2
+ backports
3
+ baz
4
+ changelog
5
+ codebase
6
+ config
7
+ cov
8
+ cyclomatic
9
+ enoent
10
+ enumerables
11
+ errno
12
+ extensionless
13
+ fancyignore
14
+ gemfile
15
+ github
16
+ gitignore
17
+ gitkeep
18
+ hashbang
19
+ klass
20
+ nocov
21
+ noninfringement
22
+ params
23
+ pathspec
24
+ pwd
25
+ rdoc
26
+ regexp
27
+ rspec
28
+ rubo
29
+ rubocop
30
+ rubygems
31
+ rulesets
32
+ rvm
33
+ sherson
34
+ simplecov
35
+ stdin
36
+ sudo
37
+ tmp
38
+ toplevel
39
+ txt
40
+ unrecursive
41
+ zsh
@@ -0,0 +1 @@
1
+ rspec
@@ -0,0 +1,3 @@
1
+ env
2
+ euo
3
+ usr
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
+ # v0.8.2
2
+ - fix `include_rules` not matching filenames with no extension when using `include_shebangs:`
3
+
1
4
  # v0.8.1
2
- - `include_shebang:` can be given non array value
5
+ - `include_shebangs:` can be given non array value
3
6
 
4
7
  # v0.8.0
5
8
  - drop support for ruby 2.3. My plan is to only support supported ruby versions
@@ -7,7 +10,7 @@
7
10
  - deprecate using `gitignore: '/path/to/gitignore'`. please use `gitignore: false, ignore_files: '/path/to/gitignore'` instead.
8
11
 
9
12
  # v0.7.0
10
- - add `include_shebang:` which filters by shebangs
13
+ - add `include_shebangs:` which filters by shebangs
11
14
 
12
15
  # v0.6.0
13
16
  - nicer argv handling
data/README.md CHANGED
@@ -77,6 +77,7 @@ FastIgnore.new(gitignore: true).to_a
77
77
  To filter by extensionless files shebang/hashbang/etc:
78
78
  ```ruby
79
79
  FastIgnore.new(include_rules: '*.rb', include_shebangs: 'ruby').to_a
80
+ FastIgnore.new(include_rules: '*.sh', include_shebangs: ['sh', 'bash', 'zsh']).to_a
80
81
  ```
81
82
 
82
83
  To check if a single file is allowed, use
data/Rakefile CHANGED
@@ -3,8 +3,10 @@
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'rubocop/rake_task'
6
+ require 'spellr/rake_task'
6
7
 
7
8
  RuboCop::RakeTask.new
8
9
  RSpec::Core::RakeTask.new(:spec)
10
+ Spellr::RakeTask.generate_task
9
11
 
10
- task default: [:spec, :rubocop]
12
+ task default: [:spec, :rubocop, :spellr]
data/fast_ignore.gemspec CHANGED
@@ -36,4 +36,5 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency 'rubocop', '>= 0.74.0'
37
37
  spec.add_development_dependency 'rubocop-rspec', '~> 1'
38
38
  spec.add_development_dependency 'simplecov', '~> 0.18.5'
39
+ spec.add_development_dependency 'spellr', '>= 0.8.1'
39
40
  end
data/lib/fast_ignore.rb CHANGED
@@ -42,10 +42,11 @@ class FastIgnore
42
42
  gitignore: gitignore,
43
43
  include_rules: include_rules,
44
44
  include_files: include_files,
45
- argv_rules: argv_rules,
46
- and_no_ext: @shebang_pattern
45
+ argv_rules: argv_rules
47
46
  )
48
47
 
48
+ @include_rule_sets, @ignore_rule_sets = @rule_sets.partition(&:allow?)
49
+ @has_include_rule_sets = !@include_rule_sets.empty?
49
50
  @relative = relative
50
51
  end
51
52
 
@@ -59,13 +60,15 @@ class FastIgnore
59
60
 
60
61
  def allowed?(path)
61
62
  path = ::File.expand_path(path)
62
- stat = ::File.stat(path)
63
- dir = stat.directory?
64
- return false if dir
63
+ dir = ::File.stat(path).directory? # equivalent to directory? and exist?
65
64
 
66
- basename = ::File.basename(path)
65
+ return false if dir
66
+ return false unless @ignore_rule_sets.all? { |r| r.allowed_recursive?(path, dir) }
67
+ return @include_rule_sets.all? { |r| r.allowed_recursive?(path, dir) } unless @shebang_pattern
67
68
 
68
- @rule_sets.all? { |r| r.allowed_recursive?(path, dir, basename) } && match_shebang?(path, basename)
69
+ (@has_include_rule_sets &&
70
+ @include_rule_sets.all? { |r| r.allowed_unrecursive?(path, false) }) ||
71
+ match_shebang?(path, ::File.basename(path))
69
72
  rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
70
73
  false
71
74
  end
@@ -76,21 +79,27 @@ class FastIgnore
76
79
  @relative ? path.delete_prefix(@root_trailing_slash) : path
77
80
  end
78
81
 
79
- def each_allowed(path = @root_trailing_slash, &block) # rubocop:disable Metrics/MethodLength
82
+ def each_allowed(path = @root_trailing_slash, &block) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
80
83
  Dir.each_child(path) do |basename|
81
84
  begin
82
85
  child = path + basename
83
- stat = ::File.stat(child)
84
-
85
- dir = stat.directory?
86
+ dir = ::File.stat(child).directory? # equivalent to directory? and exist?
86
87
 
87
88
  if dir
88
- next unless @rule_sets.all? { |r| r.allowed_unrecursive?(child, dir, nil) }
89
+ next unless @shebang_pattern || @rule_sets.all? { |r| r.allowed_unrecursive?(child, dir) }
89
90
 
90
91
  each_allowed("#{child}/", &block)
91
92
  else
92
- unless @rule_sets.all? { |r| r.allowed_unrecursive?(child, dir, basename) } && match_shebang?(child, basename)
93
- next
93
+ next unless @ignore_rule_sets.all? { |r| r.allowed_unrecursive?(child, dir) }
94
+
95
+ if @shebang_pattern
96
+ unless (@has_include_rule_sets &&
97
+ @include_rule_sets.all? { |r| r.allowed_unrecursive?(child, dir) }) ||
98
+ match_shebang?(child, basename)
99
+ next
100
+ end
101
+ else
102
+ next unless @include_rule_sets.all? { |r| r.allowed_unrecursive?(child, dir) }
94
103
  end
95
104
 
96
105
  yield prepare_path(child)
@@ -102,8 +111,7 @@ class FastIgnore
102
111
  end
103
112
 
104
113
  def match_shebang?(path, basename)
105
- return true unless @shebang_pattern
106
- return true if basename.include?('.')
114
+ return false if basename.include?('.')
107
115
 
108
116
  begin
109
117
  f = ::File.new(path)
@@ -111,7 +119,7 @@ class FastIgnore
111
119
  fragment = f.sysread(256)
112
120
  f.close
113
121
  rescue SystemCallError, EOFError
114
- return
122
+ return false
115
123
  end
116
124
 
117
125
  @shebang_pattern.match?(fragment)
@@ -120,6 +128,9 @@ class FastIgnore
120
128
  def prepare_shebang_pattern(rules)
121
129
  return if !rules || (rules = Array(rules)).empty?
122
130
 
123
- /\A#!.*\b(?:#{rules.flat_map { |s| s.to_s.split("\n") }.map { |s| Regexp.escape(s.to_s) }.join('|')})\b/.freeze
131
+ rules = rules.flat_map { |s| s.to_s.split("\n") }
132
+ rules_re = rules.map { |s| Regexp.escape(s.to_s) }.join('|')
133
+
134
+ /\A#!.*\b(?:#{rules_re})\b/.freeze
124
135
  end
125
136
  end
@@ -6,31 +6,25 @@ class FastIgnore
6
6
  attr_reader :allow
7
7
  alias_method :allow?, :allow
8
8
 
9
- def initialize(project_root: Dir.pwd, allow: false, and_no_ext: false)
9
+ def initialize(project_root: Dir.pwd, allow: false)
10
10
  @dir_rules = []
11
11
  @file_rules = []
12
12
  @project_root = project_root
13
- @and_no_ext = and_no_ext
14
13
 
15
14
  @any_not_anchored = false
16
15
  @allow = allow
17
16
  @default = true unless allow
18
17
  end
19
18
 
20
- def allowed_recursive?(path, dir, basename)
19
+ def allowed_recursive?(path, dir)
21
20
  @allowed_recursive ||= { @project_root => true }
22
21
  @allowed_recursive.fetch(path) do
23
22
  @allowed_recursive[path] =
24
- allowed_recursive?(::File.dirname(path), true, nil) && allowed_unrecursive?(path, dir, basename)
23
+ allowed_recursive?(::File.dirname(path), true) && allowed_unrecursive?(path, dir)
25
24
  end
26
25
  end
27
26
 
28
- def allowed_unrecursive?(path, dir, basename)
29
- if @and_no_ext
30
- return true if dir
31
- return true unless basename&.include?('.')
32
- end
33
-
27
+ def allowed_unrecursive?(path, dir)
34
28
  (dir ? @dir_rules : @file_rules).reverse_each do |rule|
35
29
  # 14 = Rule::FNMATCH_OPTIONS
36
30
  return rule.negation? if ::File.fnmatch?(rule.rule, path, 14)
@@ -9,32 +9,28 @@ class FastIgnore
9
9
  gitignore: :auto,
10
10
  include_rules: nil,
11
11
  include_files: nil,
12
- argv_rules: nil,
13
- and_no_ext: false
12
+ argv_rules: nil
14
13
  )
15
14
  rule_sets = [
16
15
  from_array(ignore_rules, root: root),
17
16
  *from_files(ignore_files, project_root: root),
18
17
  from_array('.git', root: root),
19
18
  from_gitignore_arg(gitignore, root: root),
20
- from_array(include_rules, root: root, allow: true, and_no_ext: and_no_ext),
21
- *from_files(include_files, allow: true, project_root: root, and_no_ext: and_no_ext),
22
- from_array(argv_rules, root: root, allow: true, expand_path: true, and_no_ext: and_no_ext)
19
+ from_array(include_rules, root: root, allow: true),
20
+ *from_files(include_files, allow: true, project_root: root),
21
+ from_array(argv_rules, root: root, allow: true, expand_path: true)
23
22
  ]
24
23
 
25
24
  rule_sets.compact!
26
25
  rule_sets.reject!(&:empty?)
27
- if and_no_ext && rule_sets.none?(&:allow?)
28
- rule_sets << ::FastIgnore::RuleSet.new(project_root: root, allow: true, and_no_ext: and_no_ext)
29
- end
30
26
  rule_sets.sort_by!(&:length)
31
27
  rule_sets
32
28
  end
33
29
 
34
- def self.from_file(filename, allow: false, project_root: Dir.pwd, and_no_ext: false)
30
+ def self.from_file(filename, allow: false, project_root: Dir.pwd)
35
31
  filename = ::File.expand_path(filename)
36
32
  root = ::File.dirname(filename)
37
- rule_set = ::FastIgnore::RuleSet.new(project_root: project_root, allow: allow, and_no_ext: and_no_ext)
33
+ rule_set = ::FastIgnore::RuleSet.new(project_root: project_root, allow: allow)
38
34
 
39
35
  ::IO.foreach(filename) do |rule_string|
40
36
  parse_rules(rule_string, allow: allow, rule_set: rule_set, root: root)
@@ -43,9 +39,9 @@ class FastIgnore
43
39
  rule_set
44
40
  end
45
41
 
46
- def self.from_files(files, allow: false, project_root: Dir.pwd, and_no_ext: false)
42
+ def self.from_files(files, allow: false, project_root: Dir.pwd)
47
43
  Array(files).map do |file|
48
- from_file(file, allow: allow, project_root: project_root, and_no_ext: and_no_ext)
44
+ from_file(file, allow: allow, project_root: project_root)
49
45
  end
50
46
  end
51
47
 
@@ -65,11 +61,11 @@ class FastIgnore
65
61
  end
66
62
  end
67
63
 
68
- def self.from_array(rules, allow: false, expand_path: false, root: Dir.pwd, and_no_ext: false)
64
+ def self.from_array(rules, allow: false, expand_path: false, root: Dir.pwd)
69
65
  rules = Array(rules)
70
66
  return if rules.empty?
71
67
 
72
- rule_set = ::FastIgnore::RuleSet.new(project_root: root, allow: allow, and_no_ext: and_no_ext)
68
+ rule_set = ::FastIgnore::RuleSet.new(project_root: root, allow: allow)
73
69
 
74
70
  rules.each do |rule_string|
75
71
  rule_string.to_s.each_line do |rule_line|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class FastIgnore
4
- VERSION = '0.8.1'
4
+ VERSION = '0.8.2'
5
5
  end
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.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2020-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.18.5
111
+ - !ruby/object:Gem::Dependency
112
+ name: spellr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.8.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 0.8.1
111
125
  description:
112
126
  email:
113
127
  - robot@dana.sh
@@ -119,6 +133,10 @@ files:
119
133
  - ".rspec"
120
134
  - ".rubocop.yml"
121
135
  - ".simplecov"
136
+ - ".spellr.yml"
137
+ - ".spellr_wordlists/english.txt"
138
+ - ".spellr_wordlists/ruby.txt"
139
+ - ".spellr_wordlists/shell.txt"
122
140
  - ".travis.yml"
123
141
  - CHANGELOG.md
124
142
  - Gemfile