trick_bag 0.65.1 → 0.66.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/RELEASE_NOTES.md +16 -0
- data/lib/trick_bag/enumerables/file_line_reader.rb +1 -1
- data/lib/trick_bag/io/gitignore.rb +41 -0
- data/lib/trick_bag/io/temp_files.rb +2 -0
- data/lib/trick_bag/version.rb +2 -2
- data/spec/trick_bag/io/gitignore_spec.rb +138 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d232e6acd5101ddede4f818540a495f8cb9a454
|
4
|
+
data.tar.gz: b8b773b9d5b40ec1e7e8fe2d61888d59d9a35be0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d90de4a2b882180737bc7ac377b75521e173b1796be0c1204a37a617c3221dfd3140fd391e3da8e9de2c19dff4c16c2b9b05011dc06fabd76a9324cf924aba75
|
7
|
+
data.tar.gz: e9d782a5aebcd295387481e6551600747f36539b3ae20a31f4f6db69ec659efd04ac2ee35f3643781ddffa45fcbcbbbad49adbf32a0c1efaaa9d3fa252b29f8f
|
data/RELEASE_NOTES.md
CHANGED
@@ -1,8 +1,24 @@
|
|
1
|
+
## v0.66.0
|
2
|
+
|
3
|
+
* Add TrickBag::Io::Gitignore.list_ignored_files.
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
## v0.65.1
|
8
|
+
|
9
|
+
* Fix bug in TrickBag::Validations when raise_on_missing_keys was passed an array.
|
10
|
+
|
11
|
+
|
12
|
+
## v0.65.0
|
13
|
+
* Add ability to pass values through print() to TextModeStatusUpdater's text generator. Version 0.65.0.
|
14
|
+
|
15
|
+
|
1
16
|
## v0.64.5
|
2
17
|
|
3
18
|
* Modified .travis.yml. as per suggestion on web to fix bundler problem:
|
4
19
|
NoMethodError: undefined method `spec' for nil:NilClass
|
5
20
|
|
21
|
+
|
6
22
|
## v0.64.4
|
7
23
|
|
8
24
|
* Fix net-ssh version error on Ruby versions < 2. v0.64.2 did not work.
|
@@ -22,7 +22,7 @@ class FileLineReader
|
|
22
22
|
|
23
23
|
attr_reader :filespec, :start_and_max
|
24
24
|
|
25
|
-
# @param filespec - the file from which to read
|
25
|
+
# @param filespec - the file from which to read lines; blank/empty lines and lines
|
26
26
|
# with the first nonblank character == '#' will be ignored.
|
27
27
|
# @param start_pos - the record number, zero offset, at which to begin each() processing
|
28
28
|
# @param max_count - the maximum number of records to be served by each()
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module TrickBag
|
2
|
+
module Io
|
3
|
+
|
4
|
+
# This module implements in Ruby the behavior of git's handling of the .gitignore file.
|
5
|
+
# It assumes that the current working directory is the directory of the .gitignore file.
|
6
|
+
|
7
|
+
module Gitignore
|
8
|
+
|
9
|
+
module_function
|
10
|
+
|
11
|
+
# Lists files that exist that would be ignored by git based on the .gitignore file
|
12
|
+
# You may provide an Enumerable with the values that would normally be in the .gitignore file.
|
13
|
+
def list_ignored_files(ignore_spec = File.readlines('.gitignore'))
|
14
|
+
ignore_list = ignore_spec.each_with_object([]) do |exclude_mask, ignore_list|
|
15
|
+
exclude_mask << '**/*' if exclude_mask[-1] == '/'
|
16
|
+
exclude_files = Dir.glob(exclude_mask, File::FNM_DOTMATCH)
|
17
|
+
ignore_list.concat(exclude_files)
|
18
|
+
end
|
19
|
+
|
20
|
+
ignore_list.sort!
|
21
|
+
ignore_list.uniq!
|
22
|
+
ignore_list.delete('.')
|
23
|
+
ignore_list.delete('..')
|
24
|
+
ignore_list.reject! { |filespec| File.directory?(filespec) }
|
25
|
+
ignore_list
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Lists files that exist that would *NOT* be ignored by git based on the .gitignore file
|
30
|
+
# You may provide an Enumerable with the values that would normally be in the .gitignore file.
|
31
|
+
def list_included_files(ignore_spec = File.readlines('.gitignore'))
|
32
|
+
all_files = Dir.glob('**/*', File::FNM_DOTMATCH).reject do |filespec|
|
33
|
+
File.directory?(filespec)
|
34
|
+
end
|
35
|
+
all_files - list_ignored_files(ignore_spec)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
data/lib/trick_bag/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module TrickBag
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
2
|
+
VERSION = '0.66.0'
|
3
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
require_relative '../../spec_helper'
|
5
|
+
require_relative '../../../lib/trick_bag/io/gitignore'
|
6
|
+
|
7
|
+
GI=TrickBag::Io::Gitignore
|
8
|
+
|
9
|
+
describe TrickBag::Io::Gitignore do
|
10
|
+
shared_examples_for 'testing a pair' do |ignore_spec, expected_result, filename|
|
11
|
+
let(:ignored_files) { GI.list_ignored_files }
|
12
|
+
let(:in_ignore_list) { ignored_files.include?(filename) }
|
13
|
+
let(:error_message) do
|
14
|
+
"filename: '#{filename}', ignore_spec: #{ignore_spec}, expected result: #{expected_result}, got: #{in_ignore_list}, ignored files: #{ignored_files}"
|
15
|
+
end
|
16
|
+
|
17
|
+
around do |example|
|
18
|
+
Dir.mktmpdir do |tmpdir|
|
19
|
+
Dir.chdir(tmpdir) do
|
20
|
+
File.write('.gitignore', ignore_spec.join("\n"))
|
21
|
+
Dir.mkdir('a_dir') # for some but not all tests
|
22
|
+
Dir.mkdir('.hidden_dir') # for some but not all tests
|
23
|
+
FileUtils.touch(filename) # for some but not all tests
|
24
|
+
example.run
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it { expect(in_ignore_list).to eq(expected_result), error_message }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'handling a nonhidden file in the root directory', :aggregate_failures do
|
33
|
+
test_inputs = [
|
34
|
+
[[], false],
|
35
|
+
[['target'], true],
|
36
|
+
[['**/*arge*'], true],
|
37
|
+
[['*'], true],
|
38
|
+
[['*arge*'], true],
|
39
|
+
]
|
40
|
+
|
41
|
+
test_inputs.each do |(ignore_spec, expected_result)|
|
42
|
+
context do # without a context block the way that rspec expands the examples causes the parameters to overwrite each other
|
43
|
+
include_examples 'testing a pair', ignore_spec, expected_result, 'target'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'handling a hidden file in the root directory', :aggregate_failures do
|
49
|
+
test_inputs = [
|
50
|
+
[[], false],
|
51
|
+
[['.target'], true],
|
52
|
+
[['**/*arge*'], true],
|
53
|
+
[['**/.targe*'], true],
|
54
|
+
[['*'], true],
|
55
|
+
[['*arge*'], true],
|
56
|
+
]
|
57
|
+
|
58
|
+
test_inputs.each do |(ignore_spec, expected_result)|
|
59
|
+
context do # without a context block the way that rspec expands the examples causes the parameters to overwrite each other
|
60
|
+
include_examples 'testing a pair', ignore_spec, expected_result, '.target'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'handling hidden files in subdirectories of hidden directories', :aggregate_failures do
|
66
|
+
test_inputs = [
|
67
|
+
[[], false],
|
68
|
+
[['.hidden_dir'], false],
|
69
|
+
[['.hidden_dir/'], true],
|
70
|
+
[['hidden_dir/'], false],
|
71
|
+
[['.hidden_dir/.*'], true],
|
72
|
+
[['.hidden_dir/.hidden_file'], true],
|
73
|
+
]
|
74
|
+
|
75
|
+
test_inputs.each do |(ignore_spec, expected_result)|
|
76
|
+
context do # without a context block the way that rspec expands the examples causes the parameters to overwrite each other
|
77
|
+
include_examples 'testing a pair', ignore_spec, expected_result, '.hidden_dir/.hidden_file'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should take an Enumerable that is not an Array' do
|
83
|
+
GI.list_ignored_files(Set.new(['target']))
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'directories should not be included', :aggregate_failures do
|
87
|
+
context { include_examples 'testing a pair', ['*'], false, 'a_dir' }
|
88
|
+
context { include_examples 'testing a pair', ['*'], false, '.hidden_dir' }
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'includes should be all files not in ignore list', :aggregate_failures do
|
92
|
+
test_inputs = [
|
93
|
+
[],
|
94
|
+
['*'],
|
95
|
+
['**/*'],
|
96
|
+
['x/y/z'],
|
97
|
+
['x/y/z/*'],
|
98
|
+
['x/y/z/**/*'],
|
99
|
+
['x/y/z/**/deep'],
|
100
|
+
['.hidden_dir'],
|
101
|
+
['.hidden_dir/'],
|
102
|
+
['hidden_dir/'],
|
103
|
+
['.hidden_dir/.*'],
|
104
|
+
['.hidden_dir/.hidden_file'],
|
105
|
+
]
|
106
|
+
|
107
|
+
around do |example|
|
108
|
+
Dir.mktmpdir do |tmpdir|
|
109
|
+
Dir.chdir(tmpdir) do
|
110
|
+
%w(a_dir .hidden_dir x/y/z).each { |dirspec| FileUtils.mkdir_p(dirspec) }
|
111
|
+
%w(root a_dir/sub .hidden_dir/.hidden_file x/y/z/deep).each { |f| FileUtils.touch(f) }
|
112
|
+
File.write('.gitignore', ignore_spec.join("\n"))
|
113
|
+
example.run
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
test_inputs.each do |ignore_spec|
|
119
|
+
context do
|
120
|
+
let(:ignore_spec) { ignore_spec }
|
121
|
+
let(:ignored_files) { GI.list_ignored_files(ignore_spec).sort }
|
122
|
+
let(:included_files) { GI.list_included_files(ignore_spec).sort }
|
123
|
+
let(:intersection) { included_files & ignored_files }
|
124
|
+
let(:union) { (included_files | ignored_files).sort }
|
125
|
+
let(:all_files) do
|
126
|
+
Dir.glob('**/*', File::FNM_DOTMATCH).reject do |filespec|
|
127
|
+
File.directory?(filespec)
|
128
|
+
end.sort
|
129
|
+
end
|
130
|
+
|
131
|
+
it { expect(intersection).to eq([]),
|
132
|
+
"expected no overlap between ignored and included for #{ignore_spec}, got #{intersection}" }
|
133
|
+
it { expect(union).to eq(all_files),
|
134
|
+
"expected ignored and included to contain all files for #{ignore_spec}, but neither contained: #{all_files - union}" }
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trick_bag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.66.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Bennett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: os
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- lib/trick_bag/formatters/erb_renderer.rb
|
151
151
|
- lib/trick_bag/formatters/formatters.rb
|
152
152
|
- lib/trick_bag/functional/functional.rb
|
153
|
+
- lib/trick_bag/io/gitignore.rb
|
153
154
|
- lib/trick_bag/io/temp_files.rb
|
154
155
|
- lib/trick_bag/io/text_mode_status_updater.rb
|
155
156
|
- lib/trick_bag/meta/classes.rb
|
@@ -183,6 +184,7 @@ files:
|
|
183
184
|
- spec/trick_bag/formatters/erb_renderer_spec.rb
|
184
185
|
- spec/trick_bag/formatters/formatters_spec.rb
|
185
186
|
- spec/trick_bag/functional/functional_spec.rb
|
187
|
+
- spec/trick_bag/io/gitignore_spec.rb
|
186
188
|
- spec/trick_bag/io/temp_files_spec.rb
|
187
189
|
- spec/trick_bag/io/text_mode_status_updater_spec.rb
|
188
190
|
- spec/trick_bag/meta/classes_spec.rb
|
@@ -221,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
223
|
version: '0'
|
222
224
|
requirements: []
|
223
225
|
rubyforge_project:
|
224
|
-
rubygems_version: 2.6.
|
226
|
+
rubygems_version: 2.6.13
|
225
227
|
signing_key:
|
226
228
|
specification_version: 4
|
227
229
|
summary: Miscellaneous general useful tools.
|
@@ -239,6 +241,7 @@ test_files:
|
|
239
241
|
- spec/trick_bag/formatters/erb_renderer_spec.rb
|
240
242
|
- spec/trick_bag/formatters/formatters_spec.rb
|
241
243
|
- spec/trick_bag/functional/functional_spec.rb
|
244
|
+
- spec/trick_bag/io/gitignore_spec.rb
|
242
245
|
- spec/trick_bag/io/temp_files_spec.rb
|
243
246
|
- spec/trick_bag/io/text_mode_status_updater_spec.rb
|
244
247
|
- spec/trick_bag/meta/classes_spec.rb
|