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.
@@ -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,10 @@
1
+ module PathMapper
2
+ module Node
3
+ module Dir
4
+ module Inheritance
5
+ include Base
6
+ include Grep
7
+ end
8
+ end
9
+ end
10
+ 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