fast_ignore 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6ccc7e9492f4e3b32cca4bbf1a758df089bfb1f3ae0f9a1f869b4aee8ce0666
4
- data.tar.gz: fb760076616b071c946750ba77016e147c593fd9fc830eef4cb498cccbad6042
3
+ metadata.gz: a4c51ea85828e7c8659e7e67c6b4f72a577e463439412da55842d2ccdc8cb2be
4
+ data.tar.gz: c9cfdfcfa66b2df5b927ce0a53f094cf72c1a9db33f09cf992e7d1337fc9a37a
5
5
  SHA512:
6
- metadata.gz: 1a96702300507bf80cc670011226ac905395e38115bf437ef8a6a46d13dea655022f9ea80e3ff02b206e12c3f8d2a9f3b174c8f29e3f8da6a2423d003c19c380
7
- data.tar.gz: 56c3ce89f07434317bd45123a8dff81d66c1bf55652b0531ac4f17a96e3fd4428d1410b1a67a9a75573201c7f5ea30d7c0a543ae15a536df1f05883fd037ff5b
6
+ metadata.gz: f25671f6eff33fdd7a56cdda01941413b0de30fa35eca7aee5f495414335fb5b48eff2ed67c19a7c2638483c7e7ba10069e42e41ae099da577af9772b3c66680
7
+ data.tar.gz: 6b64940f041f0ce7edeb913ea01d030f92925fdae4ad454e4ca84ccd373e02779ac2b234d2645a9bab823547a9775c1f41547001077557c90fa33d83b5dc7a0c
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # v0.2.0
2
+ - Considers rules relative to the location of the gitignore file instead of just relative to PWD
3
+ - Can override the path to the gitignore file, using `FastIgnore.new(gitignore: path)`
4
+ - Mention FastIgnore#allowed? in the documentation.
5
+
6
+ # v0.1.0
7
+ Initial Release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fast_ignore (0.1.0)
4
+ fast_ignore (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -52,11 +52,11 @@ PLATFORMS
52
52
  DEPENDENCIES
53
53
  bundler (~> 1.17)
54
54
  fast_ignore!
55
- pry
55
+ pry (~> 0)
56
56
  rake (~> 10.0)
57
57
  rspec (~> 3.0)
58
- rubocop
59
- rubocop-rspec
58
+ rubocop (~> 0)
59
+ rubocop-rspec (~> 1)
60
60
 
61
61
  BUNDLED WITH
62
62
  1.17.1
data/README.md CHANGED
@@ -38,29 +38,39 @@ FastIgnore.new(relative: true).to_a
38
38
 
39
39
  You can specify other gitignore-style files to ignore as well. These rules will be appended after the gitignore file in order (order matters for negations)
40
40
  ```ruby
41
- FastIgnore.new(files: '/path/to/my/ignore/file').to_a
42
- FastIgnore.new(files: ['/path/to/my/ignore/file', '/and/another']).to_a
41
+ FastIgnore.new(files: '/absolute/path/to/my/ignore/file').to_a
42
+ FastIgnore.new(files: ['/absolute/path/to/my/ignore/file', '/and/another']).to_a
43
43
  ```
44
-
45
44
  You can also supply an array of rule lines. These rules will be appended after the gitignore and any other files in order (order matters for negations)
46
45
  ```ruby
47
46
  FastIgnore.new(rules: '.DS_Store').to_a
48
47
  FastIgnore.new(rules: ['.git', '.gitkeep']).to_a
49
48
  ```
50
49
 
51
- By default, FastIgnore will look in the directory the script is run in (PWD) for a gitignore file. If it's somewhere else,
50
+ To only use another ignore file or set of rules, and not try to load a gitignore file:
51
+ ```ruby
52
+ FastIgnore.new(files: 'absolute/path/to/my/ignore/file', gitignore: false)
53
+ FastIgnore.new(rules: %w{my*rule /and/another !rule}, gitignore: false)
54
+ ```
55
+
56
+ By default, FastIgnore will look in the directory the script is run in (PWD) for a gitignore file. If it's somewhere else:
52
57
  ```ruby
53
- FastIgnore.new(rules: '.git', files: '/path/to/.gitignore', gitignore: false).to_a
54
- FastIgnore.new(rules: '.git', files: ['/path/to/.gitignore', '/path/to/other/excludesfile'], gitignore: false).to_a
58
+ FastIgnore.new(gitignore: '/absolute/path/to/.gitignore').to_a
59
+ ```
60
+ Note that the location of the .gitignore file will affect things like rules beginning with `/` or ending in `/**`
61
+
62
+ To check if a single file is allowed, use
63
+ ```ruby
64
+ FastIgnore.new.allowed?('/absolute/path/to/file')
55
65
  ```
56
- (You need the rules: '.git' because we're excluding the normal gitignore file)
57
66
 
58
67
  ## Known issues/TODOs
59
- - Considers rules relative to the location of the gitignore file, to always be relative to PWD instead
60
- - Can't override path to gitignore file nicley, Ideally it would be `FastIgnore.new(gitignore: path)`
61
68
  - Doesn't take into account ignored project excludes in `.git/info/exclude`
62
69
  - Doesn't take into account globally ignored files in `git config core.excludesFile`
63
-
70
+ This is probably a wontfix, as you need git to read the config, and may as well just
71
+ ```ruby
72
+ `git ls-files`.split("\n")
73
+ ```
64
74
  ## Development
65
75
 
66
76
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/fast_ignore.gemspec CHANGED
@@ -10,14 +10,14 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['Dana Sherson']
11
11
  spec.email = ['robot@dana.sh']
12
12
 
13
- spec.summary = 'Parse gitignore files'
13
+ spec.summary = 'Parse gitignore files, quickly'
14
14
  spec.homepage = 'https://github.com/robotdana/fast_ignore'
15
15
  spec.license = 'MIT'
16
16
 
17
17
  if spec.respond_to?(:metadata)
18
18
  spec.metadata['homepage_uri'] = spec.homepage
19
19
  spec.metadata['source_code_uri'] = 'https://github.com/robotdana/fast_ignore'
20
- spec.metadata['changelog_uri'] = 'https://github.com/robotdana/fast_ignore/CHANGELOG'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/robotdana/fast_ignore/blob/master/CHANGELOG.md'
21
21
  end
22
22
 
23
23
  # Specify which files should be added to the gem when it is released.
@@ -4,8 +4,9 @@ require_relative './rule'
4
4
 
5
5
  class FastIgnore
6
6
  class FileRuleList < FastIgnore::RuleList
7
- def initialize(file)
7
+ def initialize(file, root: File.dirname(file))
8
8
  @lines = IO.foreach(file)
9
+ @root = root
9
10
  end
10
11
  end
11
12
  end
@@ -4,9 +4,17 @@ class FastIgnore
4
4
  class GitignoreRuleList
5
5
  include Enumerable
6
6
 
7
+ def initialize(file)
8
+ @file = file
9
+ end
10
+
7
11
  def each(&block)
8
12
  FastIgnore::RuleList.new('.git').each(&block)
9
- FastIgnore::FileRuleList.new(File.join(Dir.pwd, '.gitignore')).each(&block)
13
+ FastIgnore::FileRuleList.new(file).each(&block)
10
14
  end
15
+
16
+ private
17
+
18
+ attr_reader :file
11
19
  end
12
20
  end
@@ -2,7 +2,8 @@
2
2
 
3
3
  class FastIgnore
4
4
  class Rule
5
- def initialize(rule)
5
+ def initialize(rule, root: Dir.pwd)
6
+ @root = root
6
7
  @rule = rule
7
8
  strip!
8
9
  return if skip?
@@ -20,9 +21,11 @@ class FastIgnore
20
21
  @dir_only ||= @rule.end_with?('/')
21
22
  end
22
23
 
23
- def match?(path, dir)
24
+ def match?(path, dir: File.directory?(path))
24
25
  return false if !dir && dir_only?
25
26
 
27
+ path = path.delete_prefix(root)
28
+
26
29
  File.fnmatch?(@rule, path, File::FNM_DOTMATCH | File::FNM_PATHNAME)
27
30
  end
28
31
 
@@ -40,6 +43,8 @@ class FastIgnore
40
43
 
41
44
  private
42
45
 
46
+ attr_reader :root
47
+
43
48
  def prefix
44
49
  @prefix ||= if @rule.start_with?('/')
45
50
  ''
@@ -4,8 +4,9 @@ class FastIgnore
4
4
  class RuleList
5
5
  include Enumerable
6
6
 
7
- def initialize(*lines)
7
+ def initialize(*lines, root: Dir.pwd)
8
8
  @lines = lines
9
+ @root = root
9
10
  end
10
11
 
11
12
  def each(&block)
@@ -16,12 +17,12 @@ class FastIgnore
16
17
 
17
18
  private
18
19
 
19
- attr_reader :lines
20
+ attr_reader :lines, :root
20
21
 
21
22
  def enumerator
22
23
  Enumerator.new do |yielder|
23
24
  lines.reverse_each do |rule|
24
- rule = FastIgnore::Rule.new(rule)
25
+ rule = FastIgnore::Rule.new(rule, root: root)
25
26
  yielder << rule unless rule.skip?
26
27
  end
27
28
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class FastIgnore
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/fast_ignore.rb CHANGED
@@ -10,19 +10,44 @@ require 'find'
10
10
  class FastIgnore
11
11
  include Enumerable
12
12
 
13
- attr_reader :rules, :relative
13
+ attr_reader :rules
14
+ attr_reader :relative
14
15
  alias_method :relative?, :relative
16
+ attr_reader :root
15
17
 
16
- def initialize(rules: nil, files: nil, gitignore: true, relative: false)
17
- @relative = relative
18
+ def initialize(
19
+ rules: nil,
20
+ files: nil,
21
+ relative: false,
22
+ root: Dir.pwd,
23
+ gitignore: File.join(root, '.gitignore')
24
+ )
18
25
  @rules = []
19
26
  @rules += FastIgnore::RuleList.new(*Array(rules)).to_a
20
27
  Array(files).reverse_each do |file|
21
28
  @rules += FastIgnore::FileRuleList.new(file).to_a
22
29
  end
23
- @rules += FastIgnore::GitignoreRuleList.new.to_a if gitignore
30
+ @rules += FastIgnore::GitignoreRuleList.new(gitignore).to_a if gitignore
31
+ @relative = relative
32
+ @root = root
33
+ end
34
+
35
+ def each(&block)
36
+ if block_given?
37
+ enumerator.each(&block)
38
+ else
39
+ enumerator
40
+ end
24
41
  end
25
42
 
43
+ def allowed?(path, dir: File.directory?(path))
44
+ return true if path == root
45
+
46
+ allowed?(File.dirname(path), dir: true) && pruned_allowed?(path, dir: dir)
47
+ end
48
+
49
+ private
50
+
26
51
  def enumerator
27
52
  Enumerator.new do |yielder|
28
53
  Find.find(root) do |path|
@@ -38,33 +63,9 @@ class FastIgnore
38
63
  end
39
64
  end
40
65
 
41
- def root
42
- @root ||= Dir.pwd
43
- end
44
-
45
- def allowed?(path, dir: File.directory?(path))
46
- return true if path == root
47
-
48
- allowed?(File.dirname(path), dir: true) && pruned_allowed?(path, dir: dir)
49
- end
50
-
51
66
  def pruned_allowed?(path, dir: File.directory?(path))
52
- path = path.delete_prefix(root)
53
-
54
67
  rules.each do |rule|
55
- return rule.negation? if rule.match?(path, dir)
56
- end
57
- end
58
-
59
- def each(&block)
60
- if block_given?
61
- enumerator.each(&block)
62
- else
63
- enumerator
68
+ return rule.negation? if rule.match?(path, dir: dir)
64
69
  end
65
70
  end
66
-
67
- def files
68
- to_a
69
- end
70
71
  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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-06 00:00:00.000000000 Z
11
+ date: 2019-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -106,6 +106,7 @@ files:
106
106
  - ".rubocop.yml"
107
107
  - ".ruby-version"
108
108
  - ".travis.yml"
109
+ - CHANGELOG.md
109
110
  - Gemfile
110
111
  - Gemfile.lock
111
112
  - LICENSE.txt
@@ -126,7 +127,7 @@ licenses:
126
127
  metadata:
127
128
  homepage_uri: https://github.com/robotdana/fast_ignore
128
129
  source_code_uri: https://github.com/robotdana/fast_ignore
129
- changelog_uri: https://github.com/robotdana/fast_ignore/CHANGELOG
130
+ changelog_uri: https://github.com/robotdana/fast_ignore/blob/master/CHANGELOG.md
130
131
  post_install_message:
131
132
  rdoc_options: []
132
133
  require_paths:
@@ -146,5 +147,5 @@ rubyforge_project:
146
147
  rubygems_version: 2.7.6
147
148
  signing_key:
148
149
  specification_version: 4
149
- summary: Parse gitignore files
150
+ summary: Parse gitignore files, quickly
150
151
  test_files: []