yaml-vfs 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2528e2b145ef1734b823a7e4174e391d846f5c6773e19449048b04a38a0522b7
4
- data.tar.gz: 97a724b9fc2af1dce2cd0887af5620989643021249deb5bd68e52c8dfe460ea0
3
+ metadata.gz: 3e4890cc09e0ec81ac2207d17794117c63e5a75b11119df87560083c0affb2b6
4
+ data.tar.gz: c863931919a9d44647d17ce9612668f89aba9392c00cf515c4b5f5f97e7074c7
5
5
  SHA512:
6
- metadata.gz: c430b27aa060bc8ea91e0b762d9a54a44b3dfb826e791bef313017aa434dd2982730b967cdd3f28b0e3a7e64ab3e97baea9287c3d2113d79ad7c54a7a6026282
7
- data.tar.gz: 4d7db0450e0e45ac155329d845264ce261e6ef85c73fbbdef993b46b6ae0cadaa7e2eaa8aeafa6b9a16f71f610a7c09021f230bd6d92802a5e02f6f3353911ac
6
+ metadata.gz: 72ee57fdaff9d9a559a7af00fae9be99355f3cffbde3ea6d88580609f8298153fcc383352b3a15bc268694be005697abfad10b53ecd83a02bc881ff9096bab00
7
+ data.tar.gz: c5acbf1325db6cf85bdaea38c7950e00ff057d6e5fef90d836a4bd770842b63e61c895251a42cd29e0e1e94c7dc9e5087886237852b5c5fd15323a822e233572
@@ -5,7 +5,6 @@ require 'set'
5
5
  module VFS
6
6
  HEADER_FILES_EXTENSIONS = %w[.h .hh .hpp .ipp .tpp .hxx .def .inl .inc].freeze
7
7
  VFS_FILES_EXTENSIONS = %w[.yaml .yml .json].freeze
8
-
9
8
  # vfs file collector entry
10
9
  class FileCollectorEntry
11
10
  attr_reader :real_path, :virtual_path
@@ -18,31 +17,22 @@ module VFS
18
17
  end
19
18
 
20
19
  def self.entrys_from_framework(framework_path, public_headers, private_headers, real_modules)
21
- entrys = []
22
- unless public_headers.empty?
23
- entrys += public_headers.map do |header|
24
- v_p = File.join(framework_path, 'Headers', File.basename(header))
25
- new(header, v_p)
26
- end
27
- end
28
- unless private_headers.empty?
29
- entrys += private_headers.map do |header|
30
- v_p = File.join(framework_path, 'PrivateHeaders', File.basename(header))
31
- new(header, v_p)
32
- end
33
- end
34
- unless real_modules.empty?
35
- entrys += real_modules.map do |m|
36
- v_p = File.join(framework_path, 'Modules', File.basename(m))
37
- new(m, v_p)
20
+ entrys = {}
21
+ entrys['Headers'] = public_headers unless public_headers.empty?
22
+ entrys['PrivateHeaders'] = private_headers unless private_headers.empty?
23
+ entrys['Modules'] = real_modules unless real_modules.empty?
24
+
25
+ entrys.flat_map do |key, values|
26
+ values.map do |path|
27
+ v_p = File.join(framework_path, key, File.basename(path))
28
+ new(path, v_p)
38
29
  end
39
30
  end
40
- entrys
41
31
  end
42
32
 
43
33
  def self.entrys_from_framework_dir(framework_path, real_header_dir, real_modules_dir)
44
- raise ArgumentError, 'real_header must set and exist' if real_header_dir.nil? || !File.exist?(real_header_dir)
45
- raise ArgumentError, 'real_modules must set and exist' if real_header_dir.nil? || !File.exist?(real_header_dir)
34
+ raise ArgumentError, 'real_header must set and exist' unless File.exist?(real_header_dir || '')
35
+ raise ArgumentError, 'real_modules must set and exist' unless File.exist?(real_header_dir || '')
46
36
 
47
37
  real_header_dir = File.join(real_header_dir, '**', '*')
48
38
  real_headers = Pathname.glob(real_header_dir).select { |file| HEADER_FILES_EXTENSIONS.include?(file.extname) }
@@ -51,20 +41,16 @@ module VFS
51
41
  end
52
42
 
53
43
  def self.entrys_from_target(target_path, public_headers, private_headers)
54
- entrys = []
55
- unless private_headers.empty?
56
- entrys += private_headers.map do |header|
57
- v_p = File.join(target_path, 'PrivateHeaders', File.basename(header))
58
- new(header, v_p)
59
- end
60
- end
61
- unless public_headers.empty?
62
- entrys += public_headers.map do |header|
63
- v_p = File.join(target_path, 'Headers', File.basename(header))
64
- new(header, v_p)
44
+ entrys = {}
45
+ entrys['Headers'] = public_headers unless public_headers.empty?
46
+ entrys['PrivateHeaders'] = private_headers unless private_headers.empty?
47
+
48
+ entrys.flat_map do |key, values|
49
+ values.map do |path|
50
+ v_p = File.join(target_path, key, File.basename(path))
51
+ new(path, v_p)
65
52
  end
66
53
  end
67
- entrys
68
54
  end
69
55
 
70
56
  def self.entrys_from_target_dir(target_path, public_dir, private_dir)
@@ -83,29 +69,41 @@ module VFS
83
69
 
84
70
  # vfs gen
85
71
  class FileCollector
72
+ EMPTY_VFS_FILE = '{"case-sensitive":"false","roots":[],"version":0}'
73
+ private_constant :EMPTY_VFS_FILE
86
74
  def initialize(entrys)
87
75
  @entrys = entrys || []
88
76
  @vfs_writer = YAMLVFSWriter.new
89
77
  end
90
78
 
91
79
  def write_mapping(name)
92
- add_write_file
93
- @vfs_writer.case_sensitive = false
80
+ stream = add_write_file
94
81
  path = Pathname(name).expand_path
95
82
  unless VFS_FILES_EXTENSIONS.include?(File.extname(path))
96
83
  path.mkpath unless path.exist?
97
84
  path = path.join('all-product-headers.yaml')
98
85
  end
99
- stream = @vfs_writer.write
100
- File.open(path, 'w') { |f| f.write(stream) }
86
+ update_changed_file(path, stream)
101
87
  end
102
88
 
103
89
  private
104
90
 
105
- def add_write_file
106
- @entrys.each do |entry|
107
- @vfs_writer.add_file_mapping(entry.virtual_path, entry.real_path)
91
+ def update_changed_file(path, contents)
92
+ if path.exist?
93
+ content_stream = StringIO.new(contents)
94
+ identical = File.open(path, 'rb') { |f| FileUtils.compare_stream(f, content_stream) }
95
+ return if identical
108
96
  end
97
+ path.dirname.mkpath
98
+ File.open(path, 'w') { |f| f.write(contents) }
99
+ end
100
+
101
+ def add_write_file
102
+ return EMPTY_VFS_FILE if @entrys.empty?
103
+
104
+ @entrys.each { |entry| @vfs_writer.add_file_mapping(entry.virtual_path, entry.real_path) }
105
+ @vfs_writer.case_sensitive = false
106
+ @vfs_writer.write
109
107
  end
110
108
  end
111
109
  end
@@ -12,11 +12,11 @@ end
12
12
  String.class_eval do
13
13
  def indent(count, char = ' ')
14
14
  gsub(/([^\n]*)(\n|$)/) do
15
- last_iteration = ($1 == '' && $2 == '')
15
+ last_iteration = (Regexp.last_match(1) == '' && Regexp.last_match(2) == '')
16
16
  line = ''
17
17
  line << (char * count) unless last_iteration
18
- line << $1
19
- line << $2
18
+ line << Regexp.last_match(1)
19
+ line << Regexp.last_match(2)
20
20
  line
21
21
  end
22
22
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VFS
4
- VERSION = '0.0.4'
4
+ VERSION = '0.0.5'
5
5
  end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: false
2
2
 
3
3
  require 'pathname'
4
4
  require 'json'
@@ -82,14 +82,6 @@ module VFS
82
82
 
83
83
  private
84
84
 
85
- def dir_indent
86
- @dir_stack.length * 4
87
- end
88
-
89
- def file_indent
90
- (@dir_stack.length + 1) * 4
91
- end
92
-
93
85
  def contained_in?(parent, path)
94
86
  path.ascend { |p| break true if parent == p } || false
95
87
  end
@@ -104,27 +96,24 @@ module VFS
104
96
  def start_directory(path)
105
97
  name = @dir_stack.empty? ? path : contained_part(@dir_stack.last, path)
106
98
  @dir_stack << path
107
- indent = dir_indent
108
- @stream += "{\n".indent(indent)
109
- @stream += "'type': 'directory',\n".indent(indent + 2)
110
- @stream += "'name': \"#{name}\",\n".indent(indent + 2)
111
- @stream += "'contents': [\n".indent(indent + 2)
99
+ @stream << '{'
100
+ @stream << "'type':'directory',"
101
+ @stream << "'name':\"#{name}\","
102
+ @stream << "'contents':["
112
103
  end
113
104
 
114
105
  def end_directory
115
- indent = dir_indent
116
- @stream += "]\n".indent(indent + 2)
117
- @stream += '}'.indent(indent)
106
+ @stream << ']'
107
+ @stream << '}'
118
108
  @dir_stack.pop
119
109
  end
120
110
 
121
111
  def write_entry(v_path, r_path)
122
- indent = file_indent
123
- @stream += "{\n".indent(indent)
124
- @stream += "'type': 'file',\n".indent(indent + 2)
125
- @stream += "'name': \"#{v_path}\",\n".indent(indent + 2)
126
- @stream += "'external-contents': \"#{r_path}\"\n".indent(indent + 2)
127
- @stream += '}'.indent(file_indent)
112
+ @stream << '{'
113
+ @stream << "'type':'file',"
114
+ @stream << "'name':\"#{v_path}\","
115
+ @stream << "'external-contents':\"#{r_path}\""
116
+ @stream << '}'
128
117
  end
129
118
 
130
119
  def overlay_dir_sub_rpath(use, overlay_dir, rpath)
@@ -137,24 +126,18 @@ module VFS
137
126
  end
138
127
 
139
128
  def write_yaml_header(use_external_names, case_sensitive, overlay_relative, _overlay_dir)
140
- @stream = "{\n 'version': 0,\n"
141
- @stream += " 'case-sensitive': '#{case_sensitive}',\n" unless case_sensitive.nil?
142
- @stream += " 'use-external-names': '#{use_external_names}',\n" unless use_external_names.nil?
129
+ @stream = "{'version':0,"
130
+ @stream << "'case-sensitive':'#{case_sensitive}'," unless case_sensitive.nil?
131
+ @stream << "'use-external-names':'#{use_external_names}'," unless use_external_names.nil?
143
132
  use_overlay_relative = !overlay_relative.nil?
144
- @stream += " 'overlay_relative': '#{overlay_relative}',\n" if use_overlay_relative
145
- @stream += " 'roots': [\n"
133
+ @stream << "'overlay_relative':'#{overlay_relative}'," if use_overlay_relative
134
+ @stream << "'roots':["
146
135
  use_overlay_relative
147
136
  end
148
137
 
149
138
  def write_yaml_footer(entries)
150
- unless entries.empty?
151
- until @dir_stack.empty?
152
- @stream += "\n"
153
- end_directory
154
- end
155
- @stream += "\n"
156
- end
157
- @stream += " ]\n}\n"
139
+ end_directory until @dir_stack.empty? unless entries.empty?
140
+ @stream << ']}'
158
141
  @stream
159
142
  end
160
143
 
@@ -170,7 +153,6 @@ module VFS
170
153
  def until_end_directory(dir)
171
154
  dir_popped_from_stack = false
172
155
  until @dir_stack.empty? || contained_in?(@dir_stack.last, dir)
173
- @stream += "\n"
174
156
  end_directory
175
157
  dir_popped_from_stack = true
176
158
  end
@@ -188,13 +170,149 @@ module VFS
188
170
 
189
171
  def start_directory_or_return(dir, current_dir_empty, use_overlay_relative, overlay_dir, entry)
190
172
  if dir == @dir_stack.last
191
- @stream += ",\n" unless current_dir_empty
173
+ @stream << ',' unless current_dir_empty
192
174
  else
193
- @stream += ",\n" if until_end_directory(dir) || !current_dir_empty
175
+ @stream << ',' if until_end_directory(dir) || !current_dir_empty
194
176
  start_directory(dir)
195
177
  current_dir_empty = true
196
178
  end
197
179
  use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry)
198
180
  end
199
181
  end
182
+ # class JSONWriter
183
+ # attr_reader :dir_stack
184
+
185
+ # def write(entries, use_external_names, case_sensitive, overlay_relative, overlay_dir)
186
+ # use_overlay_relative = write_yaml_header(use_external_names, case_sensitive, overlay_relative, overlay_dir)
187
+ # unless entries.empty?
188
+ # current_dir_empty = write_root_entry(entries, use_overlay_relative, overlay_dir)
189
+ # entries.drop(1).reduce(current_dir_empty) do |empty, entry|
190
+ # dir = entry.directory? ? entry.v_path : entry.v_path.dirname
191
+ # start_directory_or_return(dir, empty, use_overlay_relative, overlay_dir, entry)
192
+ # end
193
+ # end
194
+ # write_yaml_footer(entries)
195
+ # end
196
+
197
+ # def initialize
198
+ # @dir_stack = []
199
+ # end
200
+
201
+ # private
202
+
203
+ # def dir_indent
204
+ # @dir_stack.length * 4
205
+ # end
206
+
207
+ # def file_indent
208
+ # (@dir_stack.length + 1) * 4
209
+ # end
210
+
211
+ # def contained_in?(parent, path)
212
+ # path.ascend { |p| break true if parent == p } || false
213
+ # end
214
+
215
+ # def contained_part(parent, path)
216
+ # raise ArgumentError if parent.nil?
217
+ # raise ArgumentError unless contained_in?(parent, path)
218
+
219
+ # path.relative_path_from(parent)
220
+ # end
221
+
222
+ # def start_directory(path)
223
+ # name = @dir_stack.empty? ? path : contained_part(@dir_stack.last, path)
224
+ # @dir_stack << path
225
+ # indent = dir_indent
226
+ # @stream += "{\n"
227
+ # @stream += "'type': 'directory',\n".indent(indent + 2)
228
+ # @stream += "'name': \"#{name}\",\n".indent(indent + 2)
229
+ # @stream += "'contents': [\n".indent(indent + 2)
230
+ # end
231
+
232
+ # def end_directory
233
+ # indent = dir_indent
234
+ # @stream += "]\n".indent(indent + 2)
235
+ # @stream += '}'
236
+ # @dir_stack.pop
237
+ # end
238
+
239
+ # def write_entry(v_path, r_path)
240
+ # indent = file_indent
241
+ # @stream += "{\n"
242
+ # @stream += "'type': 'file',\n".indent(indent + 2)
243
+ # @stream += "'name': \"#{v_path}\",\n".indent(indent + 2)
244
+ # @stream += "'external-contents': \"#{r_path}\"\n".indent(indent + 2)
245
+ # @stream += '}'.indent(file_indent)
246
+ # end
247
+
248
+ # def overlay_dir_sub_rpath(use, overlay_dir, rpath)
249
+ # if use
250
+ # raise ArgumentError, 'Overlay dir must be contained in RPath' unless rpath.fnmatch?("#{overlay_dir}*")
251
+
252
+ # rpath = rpath.relative_path_from(overlay_dir).expand_path
253
+ # end
254
+ # rpath
255
+ # end
256
+
257
+ # def write_yaml_header(use_external_names, case_sensitive, overlay_relative, _overlay_dir)
258
+ # @stream = "{\n 'version': 0,\n"
259
+ # @stream += " 'case-sensitive': '#{case_sensitive}',\n" unless case_sensitive.nil?
260
+ # @stream += " 'use-external-names': '#{use_external_names}',\n" unless use_external_names.nil?
261
+ # use_overlay_relative = !overlay_relative.nil?
262
+ # @stream += " 'overlay_relative': '#{overlay_relative}',\n" if use_overlay_relative
263
+ # @stream += " 'roots': [\n"
264
+ # use_overlay_relative
265
+ # end
266
+
267
+ # def write_yaml_footer(entries)
268
+ # unless entries.empty?
269
+ # until @dir_stack.empty?
270
+ # @stream += "\n"
271
+ # end_directory
272
+ # end
273
+ # @stream += "\n"
274
+ # end
275
+ # @stream += " ]\n}\n"
276
+ # @stream
277
+ # end
278
+
279
+ # def write_root_entry(entries, use_overlay_relative, overlay_dir)
280
+ # return true if entries.empty?
281
+
282
+ # f_entry = entries.first
283
+ # start_directory(f_entry.directory? ? f_entry.v_path : f_entry.v_path.dirname)
284
+ # current_dir_empty = f_entry.directory?
285
+ # use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, f_entry)
286
+ # end
287
+
288
+ # def until_end_directory(dir)
289
+ # dir_popped_from_stack = false
290
+ # until @dir_stack.empty? || contained_in?(@dir_stack.last, dir)
291
+ # @stream += "\n"
292
+ # end_directory
293
+ # dir_popped_from_stack = true
294
+ # end
295
+ # dir_popped_from_stack
296
+ # end
297
+
298
+ # def use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry)
299
+ # rpath = overlay_dir_sub_rpath(use_overlay_relative, overlay_dir, entry.r_path)
300
+ # unless entry.directory?
301
+ # write_entry(entry.v_path.basename, rpath)
302
+ # current_dir_empty = false
303
+ # end
304
+ # current_dir_empty
305
+ # end
306
+
307
+ # def start_directory_or_return(dir, current_dir_empty, use_overlay_relative, overlay_dir, entry)
308
+ # if dir == @dir_stack.last
309
+ # @stream += ",\n" unless current_dir_empty
310
+ # else
311
+ # @stream += ",\n" if until_end_directory(dir) || !current_dir_empty
312
+ # start_directory(dir)
313
+ # current_dir_empty = true
314
+ # end
315
+ # use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry)
316
+ # end
317
+ # end
200
318
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml-vfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cat1237
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-06 00:00:00.000000000 Z
11
+ date: 2022-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler