fast_ignore 0.8.1 → 0.8.2

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: 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