flist 0.1.30 → 0.1.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +5 -0
  3. data/.rubocop.yml +9 -0
  4. data/.rubocop_todo.yml +110 -0
  5. data/Gemfile +21 -0
  6. data/Rakefile +22 -3
  7. data/SECURITY.md +21 -0
  8. data/bin/console +4 -3
  9. data/config/.gitkeep +0 -0
  10. data/config/db_scheme.yml +71 -0
  11. data/config/db_scheme.yml.sample +48 -0
  12. data/config/dbsetup.rb +55 -0
  13. data/config/opts.rb +9 -0
  14. data/config/opts.rb.sample +7 -0
  15. data/config/setting.yml +2 -0
  16. data/config/sqlite3.yml +26 -0
  17. data/config/tmp/db_scheme.yml +71 -0
  18. data/db/migrate/010_create_countdatetime.rb +13 -0
  19. data/db/migrate/020_create_dirz.rb +12 -0
  20. data/db/migrate/020_create_flistz.rb +24 -0
  21. data/db/migrate/030_create_flistz.rb +22 -0
  22. data/db/migrate/030_create_invalidflistz.rb +14 -0
  23. data/db/migrate/040_create_currentflistz.rb +17 -0
  24. data/db/migrate/040_create_invalidflistz.rb +12 -0
  25. data/db/migrate/050_create_currentflistz.rb +15 -0
  26. data/db/migrate/050_create_dirz.rb +14 -0
  27. data/db/migrate/060_create_invaliddirz.rb +14 -0
  28. data/db/migrate/070_create_currentdirz.rb +17 -0
  29. data/exe/flist +36 -27
  30. data/flist.gemspec +33 -20
  31. data/lib/dbacrecord.rb +37 -0
  32. data/lib/flist/cli.rb +30 -0
  33. data/lib/flist/csvx.rb +26 -0
  34. data/lib/flist/dbutil/dbmgr.rb +17 -24
  35. data/lib/flist/dbutil/dirzmgr.rb +63 -12
  36. data/lib/flist/dbutil/flistzmgr.rb +69 -34
  37. data/lib/flist/dbutil.rb +4 -4
  38. data/lib/flist/flist/filelist.rb +217 -168
  39. data/lib/flist/flist/store.rb +29 -33
  40. data/lib/flist/flist.rb +239 -98
  41. data/lib/flist/version.rb +3 -1
  42. data/lib/flist.rb +16 -5
  43. metadata +126 -32
  44. data/exe/makemigrate +0 -52
data/lib/flist/flist.rb CHANGED
@@ -1,8 +1,13 @@
1
- # -*- coding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
- require 'flist/flist/filelist'
3
+ require 'forwardable'
4
4
  require 'encx'
5
- require 'ykutils/debugutils'
5
+ # require "ykutils/debugutils"
6
+ require 'ykutils/erubyx'
7
+ require 'ykxutils/yamlx'
8
+
9
+ require_relative 'flist/filelist'
10
+ require_relative 'flist/store'
6
11
 
7
12
  require 'date'
8
13
 
@@ -14,56 +19,77 @@ module Flist
14
19
 
15
20
  include Ykutils::DebugUtils
16
21
 
17
- def_delegators( :@store, :dirz_add )
18
- def_delegators( :@store, :output )
22
+ def_delegators(:@dbmgr, :dirz_add)
23
+ def_delegators(:@dbmgr, :output)
24
+ def_delegators(:@dbmgr, :post_process)
25
+ def_delegators(:@dbmgr, :post_process)
19
26
 
20
- def determine_filesystem(fname)
21
- [
22
- {
23
- :home => "/home",
24
- :c => "/c",
25
- :v => "/v",
26
- },
27
-
28
- {
29
- :home => File.expand_path(ENV['HOME']),
30
- :c => "C:",
31
- :v => "V:",
32
- },
33
- ].find{|x|
34
- File.exist?( File.expand_path( File.join( File.expand_path(x[:home]) , fname ) ) )
35
- }
36
-
27
+ # ディレクトリハス、またはファイルパスを表すStructクラスのサブクラス
28
+ @item_class = Struct.new(:level, :kind, :re, :path)
29
+
30
+ def self.make_instance_of_item_class(level, key, regexp, path)
31
+ @item_class.new(level, key, regexp, path)
37
32
  end
38
-
39
- def initialize( kind, hs )
40
- @topx_keys = [:kind, :level, :all]
41
- opts={}
42
- argv=[]
43
- debug = false
44
-
45
- yamlfname = "env-a.yaml"
46
- @dir = determine_filesystem( yamlfname )
47
- fname = File.expand_path( File.join( @dir[:home] , yamlfname ) )
48
- contents = File.open( fname ).read
49
- erb = ERB.new(contents)
50
- yaml = YAML.load( erb.result(binding) )
51
33
 
34
+ def initialize(_kind, hash, _opts)
35
+ debug_utils_init
36
+ # set_debug(true)
37
+ set_debug(false)
38
+
39
+ @flielists = []
40
+ # yamlfname = "env-a1.yaml"
41
+ # 設定ファイル
42
+ yamlfname = 'env-a2.yaml'
43
+ # determine_filesystemメソッドの返値であるハッシュには、
44
+ # ホームディレクトリ(キー:home)、ドライブ(キー:Cや:d)を表す、UNIX式パスまたは
45
+ # WINDOWS式パスが含まれる。
46
+ # ホームディレクトリまたはドライブのトップディレクトリの直下に引数で指定した
47
+ # ファイルが存在し、かつ返値に含まれる絶対パスを用いてアクセス可能
48
+ @dir = determine_filesystem(yamlfname)
49
+ d_puts "0 @dir=#{@dir}"
50
+ # @dir[:home]は絶対パスなので、@dir[:home]の直下に変数yamlfnameが存在する
51
+ fname = File.expand_path(File.join(@dir[:home], yamlfname))
52
+ scope = self
53
+ value_hash = {}
54
+ # 変数fnameは、Eruby形式のファイルのパスを表す
55
+ # Erbuy形式のファイルをselfのコンテキストで展開されたものをYAML形式とみなして
56
+ # 解釈して、ハッシュに変換する
57
+ content = Ykutils::Erubyx.erubi_render_with_template_file(fname, scope, value_hash)
58
+ yaml = Ykxutils.yaml_load_compati(content)
59
+ # x_get_debug = get_debug
60
+ d_puts "yaml=#{yaml}"
61
+
62
+ # 指定エンコードディングに基づいてパスを扱うEncxクラスのインスタンス生成
52
63
  Encx::Encx.init('UTF-8')
53
64
  @encx = Encx::Encx.encx
54
-
55
- @store = Store.new( kind, hs )
56
65
 
57
- @topdirhs = yaml["flist"]["topdirhs"]
58
- @logdir = yaml["flist"]["logdir"]
66
+ # 引数hashとして渡されたハッシュで指定された設定うぃを用いてDB接続
67
+ db_dir = hash['db_dir']
68
+ config_dir = hash['config_dir']
69
+ env = hash['env']
70
+ dbconfig = hash['dbconfig']
71
+ @output_dir = hash['output_dir']
72
+ @pstore_dir = hash['pstore_dir']
59
73
 
60
- @tops = yaml["flist"]["tops"]
61
- @topx = {}
62
- @topx[:all] = []
63
- @topx_keys.map do |x| @topx[x] ||= {} end
74
+ dbconfig_path = Arxutils_Sqlite3::Util.make_dbconfig_path(config_dir, dbconfig)
75
+ log_path = Arxutils_Sqlite3::Util.make_log_path(db_dir, dbconfig)
76
+ dbconnect = Arxutils_Sqlite3::Dbutil::Dbconnect.new(
77
+ dbconfig_path,
78
+ env,
79
+ log_path
80
+ )
81
+ # DB接続
82
+ register_time = dbconnect.connect
83
+ # 接続したDBに対し、ActiveRecordのサブクラスを介してアクセスするFlistMgr
84
+ @dbmgr = Dbutil::DbMgr.new(register_time)
64
85
 
65
- @@item_class ||= Struct.new("Item" , :level , :kind, :re , :path )
86
+ # 検索時のトップディレクトリのハッシュ
87
+ # キーは、トップディレクトリをまとめるグループを表す文字列
88
+ @topdirhs = yaml['flist']['topdirhs']
89
+ # ログディレクトリへのパス
90
+ @logdir = yaml['flist']['logdir']
66
91
 
92
+ # システムのトップディレクトリの設定
67
93
  init_topx(yaml)
68
94
 
69
95
  init_skip_dirs(yaml)
@@ -71,115 +97,230 @@ module Flist
71
97
  regist_dirz
72
98
  end
73
99
 
100
+ # ホームディレクトリ、ドライブのトップディレクトリを表すUNIX式のパス、Windows式のパス
101
+ # を用意し、
102
+ def determine_filesystem(fname)
103
+ [
104
+ {
105
+ home: '/mnt/z/BACKUP/ykomi-202008/home',
106
+ c: '/mnt/c',
107
+ v: '/mnt/v',
108
+ x: '/mnt/x',
109
+ z: '/mnt/z'
110
+ },
111
+
112
+ {
113
+ home: File.expand_path(Dir.home),
114
+ c: 'C:',
115
+ v: 'V:',
116
+ x: 'X:',
117
+ z: 'Z:'
118
+ }
119
+ ].find do |x|
120
+ path = File.expand_path(File.join(File.expand_path(x[:home]), fname))
121
+ d_puts("path=#{path}")
122
+ File.exist?(path)
123
+ end
124
+ end
125
+
74
126
  def init_skip_dirs(yaml)
127
+ # スキップディレクトリを表すハッシュ
128
+ # キーはスキップディレクトリスキップディレクトリのパスの配列
75
129
  @skip_dirs = {}
76
- skip_dirs_array = yaml["flist"]["skip_dirs_array"]
130
+ skip_dirs_array = yaml['flist']['skip_dirs_array']
77
131
  skip_dirs_array.each do |x|
78
132
  x_str = File.expand_path(x)
79
133
  re_esc = Regexp.escape(x_str)
80
- @skip_dirs[x] = @encx.make_regexp( "^#{re_esc}" )
134
+ # スキップディレクトリ判定用正規表現配列に追加
135
+ @skip_dirs[x] = @encx.make_regexp("^#{re_esc}")
81
136
  end
82
137
  end
83
138
 
84
- def init_topx( yaml )
85
- @tops = yaml["flist"]["tops"]
86
- @tops.each do |k,v|
87
- v.each do |path|
139
+ def init_topx(yaml)
140
+ # このシステムのトップディレクトリを表すハッシュ
141
+ # キーは番号、値はトップディレクトリのパスの配列
142
+ @tops = yaml['flist']['tops']
143
+ # yaml['flist']['tops']の内容を用途別に設定し直したハッシュ
144
+ @topx = {}
145
+ @topx_keys = %i[kind level all]
146
+ @topx_keys.map { |x| @topx[x] ||= {} }
147
+ # :allの場合は{}ではなく[]にする
148
+ @topx[:all] = []
149
+
150
+ @tops.each do |no, path_array|
151
+ d_puts "no=#{no}"
152
+ d_puts "path_array=#{path_array}"
153
+ next unless path_array
154
+
155
+ path_array.each do |path|
88
156
  ary = path.split('/')
89
- if ary[0] == ""
90
- ary.shift
91
- end
157
+ # 絶対パスは先頭が"/"で始まるため、配列の先頭が空文字列の場合は捨てて、ディレクトリ名、ファイル名のみを含むようにする
158
+ ary.shift if ary[0] == ''
159
+ # 絶対パスの階層の深さ
92
160
  level = ary.size
93
- re = @encx.make_regexp( "^#{path}" )
94
- itemx = @@item_class.new( level , k , re , path )
95
- @topx[:kind][k] ||= []
96
- @topx[:kind][k] << itemx
161
+ # サブディレクトリであるかの判定に用いる
162
+ re = @encx.make_regexp("^#{path}")
163
+ # 検索時のトップディレクトリを表す
164
+ itemx = self.class.make_instance_of_item_class(level, no, re, path)
165
+ # 設定ファイルでの["flist"]["tops"]に対応するハッシュ
166
+ # ここでは、["flist"]["tops"]のキー(番号)を表す
167
+ # :kindは、次のキー(番号)に対応する絶対パスの配列を持つ
168
+ @topx[:kind][no] ||= []
169
+ @topx[:kind][no] << itemx
170
+ # :levelは、次のキー(れ部ス数)に対応する絶対パスの配列を持つ
97
171
  @topx[:level][level] ||= []
98
172
  @topx[:level][level] << itemx
173
+ # :allは、設定ファイルでの["flist"]["tops"]に対応するハッシ
174
+ # に含まれる全ての絶対パスについて、それらに対応するStruct
175
+ # クラスのサブクラスのインスタンスを含む
99
176
  @topx[:all] ||= []
100
177
  @topx[:all] << itemx
101
178
  end
102
179
  end
103
180
  end
104
181
 
182
+ # 設定ファイルの["topdirhs"]で定義された全グループで指定された全ディレクトリ登録
105
183
  def regist_dirz
106
- @topdirhs.each do |k,v|
107
- v.each do |k0,v0|
108
- v0.each do |k1,v1|
109
- dir = File.expand_path( @encx.convert(k1) )
184
+ d_puts('########## regist_dirz S')
185
+ d_puts("@topdirhs.size=#{@topdirhs.size}")
186
+ dirz_array = []
187
+ # 検索時のトップディレクトリのハッシュ
188
+ # キーは、トップディレクトリをまとめるグループを表す文字列
189
+ @topdirhs.each do |group, v|
190
+ d_puts("regist_dirz group=#{group}")
191
+ d_puts("regist_dirz v=#{v}")
192
+ # キーはグループに対応するディレクトリ
193
+ v.each do |path, v0|
194
+ d_puts("regist_dirz path=#{path}")
195
+ d_puts("regist_dirz v0=#{v0}")
196
+ d_puts("v0.class=#{v0.class}")
197
+ # キーはグループのディレクトリの直下に存在するディレクトリ
198
+ # 値はハッシュ { "dir_id" => ディレクトリ番号, "fname" => ファイル名 }
199
+ v0.each do |dir, v1|
200
+ d_puts "dir=#{dir}"
201
+ d_puts "v1=#{v1}"
202
+ x_dir = @encx.convert(dir)
203
+ d_puts "v1['dir_id']=#{v1['dir_id']}"
110
204
  x_str = @encx.convert(v1['fname'])
111
- path = File.expand_path( File.join( dir , x_str ) )
112
- dir_id = v1["dir_id"]
113
- dirz = dirz_add( path )
205
+ full_path = File.expand_path(File.join(x_dir, x_str), path)
206
+ d_puts "regist_dirz path=#{full_path}"
207
+ dirz = dirz_add(full_path) if File.exist?(full_path)
208
+ dirz_array << dirz
209
+ d_puts '#~~~~~~'
114
210
  end
115
211
  end
116
212
  end
213
+ d_puts('########## regist_dirz E')
214
+ dirz_array
117
215
  end
118
216
 
119
- def listup_x( name )
120
- @topdirhs[name].each do |k0,v0|
121
- k0_str = @encx.convert(k0)
122
- v0.each do |k,v|
123
- k_str = @encx.convert(k)
124
- fname = v["fname"]
125
- dir = @encx.convert(@logdir)
126
- x_str = @encx.convert(fname)
127
- csvpath = File.expand_path( File.join( dir , x_str ) )
128
- dir_id = v["dir_id"]
129
- top_path = File.expand_path( File.join( k0_str , k_str ) )
130
- flist = Filelist.new( @encx, @skip_dirs, dir_id, top_path , 0 , name.to_sym )
131
- flist.scan
132
- flist.output
217
+ # 設定ファイルの["topdirhs"]で定義されたグループのうち、引数groupで指定されたグループに含まれる全ディレクトリ登録
218
+ def listup_x(group)
219
+ # キーはグループのディレクトリの直下に存在するディレクトリ
220
+ # 値はハッシュ { "dir_id" => ディレクトリ番号, "fname" => ファイル名 }
221
+ @topdirhs[group].each do |path, hash0|
222
+ x_path = @encx.convert(path)
223
+ # キーはグループのディレクトリの直下に存在するディレクトリ
224
+ hash0.each do |dir, hash1|
225
+ d_puts "hash1=#{hash1}"
226
+ fname = hash1['fname']
227
+ x_fname = @encx.convert(fname)
228
+ x_dir = @encx.convert(dir)
229
+ x_logdir = @encx.convert(@logdir)
230
+
231
+ csvpath = File.expand_path(File.join(x_logdir, x_fname))
232
+ csvx = Csvx.new(csvpath)
233
+
234
+ dir_id = hash1['dir_id']
235
+ d_puts "dir_id=#{dir_id}"
236
+ d_puts x_path
237
+ d_puts x_dir
238
+ top_path = File.expand_path(File.join(x_path, x_dir))
239
+ if File.exist?(top_path)
240
+ filelist = Filelist.new(@dbmgr, csvx, @encx, @skip_dirs, dir_id, top_path, 0, group.to_sym)
241
+ filelist.scan
242
+ filelist.output
243
+ @flielists << filelist
244
+ else
245
+ puts "Can't find #{top_path}"
246
+ end
247
+ csvx.finish
133
248
  end
134
249
  end
135
250
  end
136
251
 
137
252
  def listup_repo
138
- listup_x( "repo" )
253
+ listup_x('repo')
139
254
  end
140
255
 
141
256
  def listup_simple
142
- listup_x( "simple" )
257
+ listup_x('simple')
143
258
  end
144
259
 
145
260
  def lx
146
- Flistz.where( dir_id: 1 ).select(:id)
261
+ Flistz.where(dir_id: 1).select(:id)
147
262
  end
148
263
 
149
264
  def get_directory_list(dir_path, level)
265
+ # 引数s
150
266
  ary = []
151
- Dir.chdir(dir_path)
152
- if level > 0
153
- level -= 1
154
- Dir.glob("*").each do |pa|
155
- ary += get_directory_list(pa , level) if File.directory?(pa)
267
+ Dir.chdir(dir_path) do
268
+ if level.positive?
269
+ level -= 1
270
+ Dir.glob('*').each do |pa|
271
+ ary += get_directory_list(pa, level) if File.directory?(pa)
272
+ end
273
+ else
274
+ ary << Dir.pwd
156
275
  end
157
- else
158
- ary << Dir.pwd
159
276
  end
160
- Dir.chdir("..")
161
277
  ary
162
278
  end
163
279
 
164
- def listx()
165
- @topx[:kind].map do |x|
166
- x[1].map do |item|
167
- get_directory_list( item.path , x[0] )
280
+ def listx
281
+ # 設定ファイルでの["flist"]["tops"]に対応するハッシュ
282
+ # ここでは、["flist"]["tops"]のキー(番号)を表す
283
+ # :kindは、次のキー(番号)に対応する絶対パスの配列を持つ
284
+
285
+ # @topx[:kind]に含まれるディレクトリの直下のサブディレクトリを一つの配列として返す
286
+ level = 1
287
+ @topx[:kind].map do |_no, path_array|
288
+ path_array.map do |item|
289
+ get_directory_list(item.path, level)
168
290
  end
169
291
  end.flatten
170
292
  end
171
293
 
294
+ def make_csvx
295
+ x_fname = 'all.csv'
296
+ x_logdir = @encx.convert(@logdir)
297
+ csvpath = File.expand_path(File.join(x_logdir, x_fname))
298
+ Csvx.new(csvpath)
299
+ end
300
+
172
301
  def list_a
173
- listx.each do |x|
302
+ d_puts '####### list_a'
303
+ list_x = listx
304
+ d_puts list_x.size
305
+
306
+ csvx = make_csvx
307
+ # 設定ファイルの['flist']['tops]に格納されたトップディレクトリ
308
+ # とその直下のサブディレクトリすべてのパス
309
+ list_x.each do |x|
310
+ # puts "####### list_a 1 x=#{x}|"
174
311
  top_path = @encx.convert(x)
175
- # top_path = x
176
- dirz = @store.dirz_add( top_path )
312
+ # dirzテーブルへ登録
313
+ dirz = @dbmgr.dirz_add(top_path)
177
314
  ary = top_path.split('/')
178
315
  ary.shift
179
316
  level = ary.size
180
- flist = Filelist.new( @encx, @skip_dirs, @store , dirz.id, top_path , level )
181
- flist.scanx( top_path , level )
317
+
318
+ filelist = Filelist.new(@dbmgr, csvx, @encx, @skip_dirs, dirz.id, top_path, level)
319
+ d_puts("list_a level=#{level} top_path=#{top_path}")
320
+ filelist.scanx(top_path, level)
182
321
  end
322
+ csvx.finish
323
+ nil
183
324
  end
184
325
  end
185
326
  end
data/lib/flist/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Flist
2
- VERSION = "0.1.30"
4
+ VERSION = '0.1.32'
3
5
  end
data/lib/flist.rb CHANGED
@@ -1,11 +1,22 @@
1
1
  #! -*- encoding : UTF-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
- require "flist/version"
4
+ require 'arxutils_sqlite3'
4
5
 
5
- require 'flist/flist'
6
- require 'flist/flist/store'
7
- require 'flist/flist/filelist'
8
- require 'flist/dbutil'
6
+ require_relative 'dbacrecord'
7
+ require_relative 'flist/version'
8
+
9
+ require_relative 'flist/flist'
10
+ require_relative 'flist/dbutil'
11
+ require_relative 'flist/cli'
12
+ require_relative 'flist/csvx'
13
+
14
+ require_relative 'flist/flist/store'
15
+ require_relative 'flist/flist/filelist'
9
16
 
10
17
  module Flist
18
+ OUTPUT_DIR = 'output'
19
+ # PSTORE_DIR = "pstore"
20
+ PSTORE_DIR = 'pstore'
21
+ PSTORE_KEY = :TOP
11
22
  end