path_mapper 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +0 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +103 -0
- data/lib/path_mapper.rb +63 -107
- data/lib/path_mapper/helper/debug.rb +20 -0
- data/lib/path_mapper/helper/logger.rb +21 -0
- data/lib/path_mapper/helper/storage.rb +36 -0
- data/lib/path_mapper/helpers.rb +22 -0
- data/lib/path_mapper/node/base.rb +32 -0
- data/lib/path_mapper/node/base/file.rb +132 -0
- data/lib/path_mapper/node/base/grep.rb +19 -0
- data/lib/path_mapper/node/base/representation.rb +73 -0
- data/lib/path_mapper/node/dir.rb +31 -0
- data/lib/path_mapper/node/dir/erb.rb +25 -0
- data/lib/path_mapper/node/dir/file.rb +41 -0
- data/lib/path_mapper/node/dir/grep.rb +38 -0
- data/lib/path_mapper/node/dir/inheritance.rb +10 -0
- data/lib/path_mapper/node/dir/inheritance/base.rb +54 -0
- data/lib/path_mapper/node/dir/inheritance/grep.rb +22 -0
- data/lib/path_mapper/node/dir/representation.rb +18 -0
- data/lib/path_mapper/node/file.rb +15 -0
- data/lib/path_mapper/node/file/erb.rb +27 -0
- data/lib/path_mapper/node/file/file.rb +60 -0
- data/lib/path_mapper/node/file/representation.rb +37 -0
- data/lib/path_mapper/node/null.rb +20 -0
- data/lib/path_mapper/node/null/file.rb +46 -0
- data/lib/path_mapper/node/null/representation.rb +23 -0
- data/lib/path_mapper/patch/pathname.rb +13 -0
- data/lib/path_mapper/reloader.rb +26 -0
- data/lib/path_mapper/version.rb +1 -1
- data/path_mapper.gemspec +4 -1
- data/spec/spec_helper.rb +4 -0
- metadata +84 -4
@@ -0,0 +1,132 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Base
|
4
|
+
module File
|
5
|
+
attr_accessor :changes_overlay
|
6
|
+
|
7
|
+
def method_missing(m, *args, &block)
|
8
|
+
kwargs = self.kwargs(args)
|
9
|
+
self.with_logger(logger: kwargs.delete(:logger)) do
|
10
|
+
self.changes_overlay = kwargs.delete(:change_overlay) if kwargs.key? :change_overlay
|
11
|
+
args << kwargs unless kwargs.empty?
|
12
|
+
self.changes_overlay.send("_#{m}", *args, &block)[:d][:result] if self.respond_to?("_#{m}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def changes_overlay
|
17
|
+
@changes_overlay || self
|
18
|
+
end
|
19
|
+
|
20
|
+
def _create!
|
21
|
+
{ d: { result: self }, code: :ok }
|
22
|
+
end
|
23
|
+
|
24
|
+
def _put!(content)
|
25
|
+
{ d: { result: self }, code: :ok }
|
26
|
+
end
|
27
|
+
|
28
|
+
def _safe_put!(content)
|
29
|
+
{ d: { result: self }, code: :ok }
|
30
|
+
end
|
31
|
+
|
32
|
+
def _append!(content)
|
33
|
+
{ d: { result: self }, code: :ok }
|
34
|
+
end
|
35
|
+
|
36
|
+
def _remove_line!(line)
|
37
|
+
{ d: { result: self }, code: :ok }
|
38
|
+
end
|
39
|
+
|
40
|
+
def _rename!(new_path)
|
41
|
+
self.with_dry_run do |dry_run|
|
42
|
+
if dry_run
|
43
|
+
self.storage[new_path] = self.storage_file_delete(@path)
|
44
|
+
else
|
45
|
+
::File.rename(@path, new_path)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
{ d: { result: self._create_node(new_path) }, code: :renamed }
|
49
|
+
end
|
50
|
+
|
51
|
+
def _delete!(full: false)
|
52
|
+
{ d: { result: self }, code: :ok }
|
53
|
+
end
|
54
|
+
|
55
|
+
def _override!(content)
|
56
|
+
if content.empty?
|
57
|
+
{ d: { result: self.delete!(logger: false) }, code: :deleted }
|
58
|
+
else
|
59
|
+
self.with_dry_run do |dry_run|
|
60
|
+
tmp_mapper = self._create_node(@path.dirname.join(".#{@name}.tmp")).put!(content, logger: false)
|
61
|
+
|
62
|
+
if self.nil? or !self.compare_with(tmp_mapper)
|
63
|
+
if dry_run
|
64
|
+
self.storage[@path] = tmp_mapper.raw_value
|
65
|
+
else
|
66
|
+
tmp_mapper.rename!(@path, logger: false)
|
67
|
+
end
|
68
|
+
code = :overrided
|
69
|
+
else
|
70
|
+
tmp_mapper.delete!(logger: false)
|
71
|
+
code = :ok
|
72
|
+
end
|
73
|
+
|
74
|
+
{ d: { result: self._create_node(@path) }, code: code }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def compare_with(obj)
|
80
|
+
return if obj.nil?
|
81
|
+
if obj.respond_to? :node? and obj.node?
|
82
|
+
self.md5 == obj.md5
|
83
|
+
else
|
84
|
+
self.md5 == Digest::MD5.new.digest(obj.to_s)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def check(line)
|
89
|
+
false
|
90
|
+
end
|
91
|
+
|
92
|
+
def md5
|
93
|
+
Digest::MD5.new.digest(self.value)
|
94
|
+
end
|
95
|
+
|
96
|
+
def diff(content)
|
97
|
+
content = with_line_separator(content.chomp) unless content.nil?
|
98
|
+
diff = Diffy::Diff.new(content, self.raw_value, diff: '-U 3').to_s
|
99
|
+
diff.empty? ? nil : diff
|
100
|
+
end
|
101
|
+
|
102
|
+
def custom_diff(a, b)
|
103
|
+
Diffy::Diff.new(a, b).to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
protected
|
107
|
+
|
108
|
+
def _file_puts(content, file_mode='w')
|
109
|
+
return self if content.to_s.empty?
|
110
|
+
self.parent.create!
|
111
|
+
|
112
|
+
with_dry_run do |dry_run|
|
113
|
+
if dry_run
|
114
|
+
self.storage[@path] = case file_mode
|
115
|
+
when 'w' then with_line_separator(content)
|
116
|
+
when 'a+' then self.storage[@path].to_s + with_line_separator(content)
|
117
|
+
end
|
118
|
+
else
|
119
|
+
::File.open(@path, file_mode) {|f| f.puts(content) }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
self._create_node(@path)
|
124
|
+
end
|
125
|
+
|
126
|
+
def _general_options
|
127
|
+
super[:changes_overlay] = @changes_overlay if @changes_overlay != self
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Base
|
4
|
+
module Grep
|
5
|
+
def grep(reg, recursive: false, path: @path, **kwargs)
|
6
|
+
[]
|
7
|
+
end
|
8
|
+
|
9
|
+
def grep_dirs(recursive: false, **kwargs)
|
10
|
+
[]
|
11
|
+
end
|
12
|
+
|
13
|
+
def grep_files(recursive: false, **kwargs)
|
14
|
+
[]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Base
|
4
|
+
module Representation
|
5
|
+
def dir?
|
6
|
+
@path.directory?
|
7
|
+
end
|
8
|
+
|
9
|
+
def file?
|
10
|
+
@path.file?
|
11
|
+
end
|
12
|
+
|
13
|
+
def empty?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def nil?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def any?
|
22
|
+
end
|
23
|
+
|
24
|
+
def node?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def value
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def raw_value
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def int
|
37
|
+
self.value.to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
def float
|
41
|
+
self.value.to_f
|
42
|
+
end
|
43
|
+
|
44
|
+
def bool
|
45
|
+
end
|
46
|
+
|
47
|
+
def lines
|
48
|
+
[]
|
49
|
+
end
|
50
|
+
|
51
|
+
def json
|
52
|
+
JSON.load(self.value)
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
@path.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_str
|
60
|
+
self.to_s
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_pathname
|
64
|
+
@path
|
65
|
+
end
|
66
|
+
|
67
|
+
def inspect
|
68
|
+
self.to_s
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
include Base
|
5
|
+
include File
|
6
|
+
include Grep
|
7
|
+
include Representation
|
8
|
+
include Inheritance
|
9
|
+
|
10
|
+
def method_missing(m, *args, &block)
|
11
|
+
resp = self.f(m, self.kwargs(args)) if (resp = super).is_a? NilClass # Base::File
|
12
|
+
resp
|
13
|
+
end
|
14
|
+
|
15
|
+
def f(m, **kwargs)
|
16
|
+
def with_file_node(fname, **kwargs)
|
17
|
+
if (obj = self._create_node(@path.join(fname))).file?
|
18
|
+
yield obj
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
res = case m.to_s
|
23
|
+
when /(.*)(?=\?)/ then with_file_node($1) {|node| node.bool } || false
|
24
|
+
when /(.*)(?=_val)/ then with_file_node($1) {|node| node.value }
|
25
|
+
when /(.*)(?=_lines)/ then with_file_node($1) {|node| node.lines }
|
26
|
+
end
|
27
|
+
res.nil? ? super : res
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
module Erb
|
5
|
+
attr_reader :erb_options
|
6
|
+
|
7
|
+
def initialize(path, erb_options={})
|
8
|
+
super(path)
|
9
|
+
@erb_options = erb_options
|
10
|
+
end
|
11
|
+
|
12
|
+
def erb_options=(options)
|
13
|
+
@erb_options = options
|
14
|
+
self.inheritance.each {|m| m.erb_options = options }
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def _general_options
|
20
|
+
super[:erb_options] = @erb_options
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
module File
|
5
|
+
def _create!
|
6
|
+
{ d: { result: self }, code: :ok }
|
7
|
+
end
|
8
|
+
|
9
|
+
def _override!(content)
|
10
|
+
{ d: { result: self }, code: :ok }
|
11
|
+
end
|
12
|
+
|
13
|
+
def _rename!(new_path)
|
14
|
+
mapper = PathMapper.new(new_path)
|
15
|
+
mapper.parent.create!(logger: false)
|
16
|
+
mapper.delete!(logger: false) unless mapper.empty?
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def _delete!(full: false)
|
21
|
+
self.with_dry_run do |dry_run|
|
22
|
+
if dry_run
|
23
|
+
self.delete_storage_branch(@path)
|
24
|
+
else
|
25
|
+
@path.rmtree
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
parent = self.parent
|
30
|
+
parent.delete!(full: full) if parent.empty? and full
|
31
|
+
|
32
|
+
{ d: { result: self._create_node(@path) }, code: :deleted }
|
33
|
+
end
|
34
|
+
|
35
|
+
def md5
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
module Grep
|
5
|
+
def grep(reg, recursive: false, path: @path, **kwargs)
|
6
|
+
path_ = "#{path}#{'/**' if recursive}/*"
|
7
|
+
files = ::Dir[path_].select {|f| f =~ reg }
|
8
|
+
files.map! {|f| Pathname.new(f) }
|
9
|
+
FilesIterator.new(files, self)
|
10
|
+
end
|
11
|
+
|
12
|
+
def grep_dirs(recursive: false, **kwargs)
|
13
|
+
self.grep(/.*/, recursive: recursive, **kwargs).select {|n| n.dir? }
|
14
|
+
end
|
15
|
+
|
16
|
+
def grep_files(recursive: false, **kwargs)
|
17
|
+
self.grep(/.*/, recursive: recursive, **kwargs).select {|n| n.file? }
|
18
|
+
end
|
19
|
+
|
20
|
+
class FilesIterator
|
21
|
+
include Enumerable
|
22
|
+
attr_accessor :files
|
23
|
+
|
24
|
+
def initialize(files=[], mapper)
|
25
|
+
self.files = files
|
26
|
+
@parent_mapper = mapper
|
27
|
+
end
|
28
|
+
|
29
|
+
def each
|
30
|
+
@files.each do |f|
|
31
|
+
yield @parent_mapper.f(f)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
module Inheritance
|
5
|
+
module Base
|
6
|
+
attr_writer :inheritance
|
7
|
+
|
8
|
+
def inheritance
|
9
|
+
@inheritance ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(mapper)
|
13
|
+
self.inheritance << mapper
|
14
|
+
end
|
15
|
+
|
16
|
+
def f(m, overlay: true, **kwargs)
|
17
|
+
def with_inheritance(obj, **kwargs)
|
18
|
+
if obj.respond_to? :dir? and obj.dir?
|
19
|
+
obj.inheritance = self.inheritance.map do |inheritor|
|
20
|
+
next if inheritor.path == obj.path.dirname
|
21
|
+
unless (resp = inheritor.f(obj.name, kwargs)).empty?
|
22
|
+
resp
|
23
|
+
end
|
24
|
+
end.compact
|
25
|
+
end
|
26
|
+
obj.changes_overlay = self._create_node(self.changes_overlay.path.join(obj.name))
|
27
|
+
obj
|
28
|
+
end
|
29
|
+
|
30
|
+
resp = []
|
31
|
+
base_resp = nil
|
32
|
+
["#{m.to_s}.erb", m.to_s].each {|fname| base_resp = with_inheritance(self._create_node(@path.join(fname)), kwargs) if base_resp.nil? }
|
33
|
+
resp << base_resp
|
34
|
+
self.inheritance.each do |inherit|
|
35
|
+
unless (resp_ = with_inheritance(inherit.f(m, kwargs), kwargs)).nil?
|
36
|
+
if overlay
|
37
|
+
return resp_
|
38
|
+
else
|
39
|
+
resp << resp_
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end if !overlay || (overlay and base_resp.empty?)
|
43
|
+
|
44
|
+
if base_resp.empty? and kwargs.key? :default
|
45
|
+
kwargs[:default]
|
46
|
+
else
|
47
|
+
overlay ? resp.first : resp.select {|node| !node.is_a? Null }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PathMapper
|
2
|
+
module Node
|
3
|
+
module Dir
|
4
|
+
module Inheritance
|
5
|
+
module Grep
|
6
|
+
def grep(reg, recursive: false, path: @path, overlay: true)
|
7
|
+
files_iterator = super
|
8
|
+
self.inheritance.each do |inheritor|
|
9
|
+
inheritor_files_iterator = super(reg, path: inheritor.path)
|
10
|
+
files_iterator.files += if overlay
|
11
|
+
inheritor_files_iterator.files.select {|f| !files_iterator.files.any? {|f_| f_.basename.to_s[/(.*(?=\.erb))|(.*)/] == f.basename.to_s[/(.*(?=\.erb))|(.*)/] } }
|
12
|
+
else
|
13
|
+
inheritor_files_iterator.files
|
14
|
+
end
|
15
|
+
end
|
16
|
+
files_iterator
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|