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.
@@ -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