path_mapper 0.0.2 → 0.0.3
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 +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
|