ehbrs_ruby_utils 0.41.2 → 0.42.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 890a2f8eebfce6f021bcbbd8ba26651bac76439fde0ae3a94a69a1dee88a41e6
4
- data.tar.gz: ac80be08876fe8cb1c3cc26d0a4f18216b2fd1d9bb977e73c12f33377e0081bb
3
+ metadata.gz: d257573a9117902808e20c43bf002671f832d16cc40bf676cfb46282435b22f5
4
+ data.tar.gz: fa5b446750faae117f1902457683b1b46599f85e64d40b7402451433d007d861
5
5
  SHA512:
6
- metadata.gz: d0cb5b9f6782c2b21e7b63884e30f726f1b19b22f88da04e423a1c9a1a9777854fe92a7e07a2768255104ef234da00aba9ffbc69cca7a8fb4ccd30cc11a86001
7
- data.tar.gz: 792058f84adc1dcede5e9cdd597225018933dfc8dd6467975af8e40bab03996de818a72cd5482b42b83177e40521cef2087ec5ca55972ec99251607afc33a949
6
+ metadata.gz: 2f5dbbbcffc5213abb54303cc9272e3875f40ba4f80c759298c6ba4d6677e806862b5a221a26fd487f45c26c02f7075decbf1251b424dd15a28ab186c35d9d5c
7
+ data.tar.gz: dd456900169ed432a7c2b3aaef91ab93fff318b098eddcade488b5877df89b9babdeb45ec1336eadeb2ecde18d80a1c1b7011a5fa56952ed6427e60f3aab41ea
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/sort/files/scanner'
5
+
6
+ module EhbrsRubyUtils
7
+ module Music
8
+ module Sort
9
+ module Commands
10
+ class Base
11
+ enable_speaker
12
+ enable_simple_cache
13
+ common_constructor :root, :confirm do
14
+ self.root = root.to_pathname
15
+ run
16
+ end
17
+
18
+ private
19
+
20
+ def config_file
21
+ scanner.config_file
22
+ end
23
+
24
+ def scanner_uncached
25
+ ::EhbrsRubyUtils::Music::Sort::Files::Scanner.new(root)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/sort/commands/base'
5
+ require 'ehbrs_ruby_utils/music/sort/files/base'
6
+ require 'ehbrs_ruby_utils/music/sort/files/factory'
7
+
8
+ module EhbrsRubyUtils
9
+ module Music
10
+ module Sort
11
+ module Commands
12
+ class Dump < EhbrsRubyUtils::Music::Sort::Commands::Base
13
+ private
14
+
15
+ def run
16
+ if File.exist?(config_file)
17
+ @config = YAML.load_file(config_file)
18
+ to_rename.each { |sf| rename(sf) }
19
+ else
20
+ fatal_error("File \"#{config_file}\" does not exist")
21
+ end
22
+ end
23
+
24
+ def to_rename
25
+ r = []
26
+ ::EhbrsRubyUtils::Music::Sort::Files::Factory::SECTIONS.each do |section|
27
+ i = 1
28
+ (@config[section] || []).each do |name|
29
+ r << ::EhbrsRubyUtils::Music::Sort::Files::Base.new(section, i, name, nil)
30
+ i += 1
31
+ end
32
+ end
33
+ r
34
+ end
35
+
36
+ def rename(source_file)
37
+ o = scanner.search(source_file.name)
38
+ if o
39
+ rename_on_found(source_file, o)
40
+ else
41
+ warn("File not found for \"#{source_file}\"")
42
+ end
43
+ end
44
+
45
+ def rename_on_found(source_file, sorted_file)
46
+ o = sorted_file.reorder(source_file.section, source_file.order, order_padding)
47
+ info("\"#{o.source_basename}\" => \"#{o.target_basename}\"")
48
+ confirm_rename(o.source_basename, o.target_basename) if confirm
49
+ end
50
+
51
+ def confirm_rename(old_basename, new_basename)
52
+ op = File.expand_path(old_basename, root)
53
+ np = File.expand_path(new_basename, root)
54
+ return if np == op
55
+ raise "\"#{np}\" (From \"#{op}\") already exists" if File.exist?(np)
56
+
57
+ File.rename(op, np)
58
+ end
59
+
60
+ def order_padding_uncached
61
+ scanner.count.to_s.length
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/sort/commands/base'
5
+
6
+ module EhbrsRubyUtils
7
+ module Music
8
+ module Sort
9
+ module Commands
10
+ class Load < EhbrsRubyUtils::Music::Sort::Commands::Base
11
+ private
12
+
13
+ def run
14
+ info "Reading \"#{root}\"..."
15
+ config = build_config
16
+ s = config.to_yaml
17
+ puts s
18
+ if confirm
19
+ info("Writing to \"#{config_file}\"...")
20
+ File.write(config_file, s)
21
+ end
22
+ puts 'Done!'.green
23
+ end
24
+
25
+ def build_config
26
+ config = {}
27
+ scanner.by_section.each do |section, fs|
28
+ config[section] = fs.sort.map(&:name)
29
+ end
30
+ config
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/sort/commands/base'
5
+ require 'ehbrs_ruby_utils/music/sort/files/factory'
6
+
7
+ module EhbrsRubyUtils
8
+ module Music
9
+ module Sort
10
+ module Commands
11
+ class Shuffle < EhbrsRubyUtils::Music::Sort::Commands::Base
12
+ private
13
+
14
+ def run
15
+ if confirm
16
+ load_last_shuffle
17
+ else
18
+ dump_last_shuffle
19
+ end
20
+ end
21
+
22
+ def dump_last_shuffle
23
+ s = build_config.to_yaml
24
+ puts s
25
+ info("Writing to \"#{last_shuffle_file}\"...")
26
+ File.write(last_shuffle_file, s)
27
+ puts 'Done!'.green
28
+ end
29
+
30
+ def load_last_shuffle
31
+ if File.exist?(last_shuffle_file)
32
+ IO.copy_stream(last_shuffle_file, config_file)
33
+ File.unlink(last_shuffle_file)
34
+ puts 'Done!'.green
35
+ else
36
+ fatal_error "File \"#{last_shuffle_file}\" does not exist"
37
+ end
38
+ end
39
+
40
+ def last_shuffle_file
41
+ File.join(root, '.last_shuffle')
42
+ end
43
+
44
+ def build_config
45
+ config = {}
46
+ config[::EhbrsRubyUtils::Music::Sort::Files::Factory::SECTION_CURRENT] =
47
+ scanner.all.to_a.shuffle.map(&:name)
48
+ config[::EhbrsRubyUtils::Music::Sort::Files::Factory::SECTION_NEW] = []
49
+ config
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ module Sort
8
+ module Commands
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ module Sort
8
+ module Files
9
+ class Base
10
+ common_constructor :section, :order, :name, :original_path, :padding, default: [nil, 0] do
11
+ self.original_path = original_path.if_present { |v| v.to_pathname.expand_path }
12
+ end
13
+
14
+ def reorder(new_section, new_order, padding)
15
+ self.class.new(new_section, new_order, name, original_path, padding)
16
+ end
17
+
18
+ def target_basename
19
+ "#{section}#{order.to_s.rjust(padding, '0')} #{name}"
20
+ end
21
+
22
+ def source_basename
23
+ original_path.if_present(&:basename) || raise('Original path is blank')
24
+ end
25
+
26
+ def to_s
27
+ target_basename
28
+ end
29
+
30
+ private
31
+
32
+ def <=>(other)
33
+ %i[section order name].each do |a|
34
+ r = send(a) <=> other.send(a)
35
+ return r unless r.zero?
36
+ end
37
+ 0
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ module Sort
8
+ module Files
9
+ class Factory
10
+ SECTION_CURRENT = 'A'
11
+ SECTION_NEW = 'Z'
12
+ SECTIONS = [SECTION_CURRENT, SECTION_NEW].freeze
13
+ NO_ORDER = Float::INFINITY
14
+
15
+ enable_simple_cache
16
+ common_constructor :path, :config_data
17
+
18
+ def basename
19
+ by_pattern(3).if_present(path.basename.to_path)
20
+ end
21
+
22
+ def build
23
+ ::EhbrsRubyUtils::Music::Sort::Files::Base.new(section, order, basename, path)
24
+ end
25
+
26
+ def order
27
+ order_from_config_data || by_pattern(2).if_present(NO_ORDER, &:to_i)
28
+ end
29
+
30
+ def section
31
+ r = section_from_config_data || by_pattern(1).if_present(SECTION_NEW)
32
+ return SECTION_CURRENT if r.blank? || r.upcase == SECTION_CURRENT
33
+
34
+ SECTION_NEW
35
+ end
36
+
37
+ private
38
+
39
+ def by_pattern(index)
40
+ match_builded_pattern.if_present { |v| v[index] }
41
+ end
42
+
43
+ def match_builded_pattern_uncached
44
+ /\A([a-z])?([0-9]+)\s+(\S.*)\z/i.match(path.basename.to_path)
45
+ end
46
+
47
+ def order_from_config_data
48
+ config_data.each_value do |files|
49
+ files.index(basename).if_present { |v| return v + 1 }
50
+ end
51
+ nil
52
+ end
53
+
54
+ def section_from_config_data
55
+ config_data.each do |section, files|
56
+ return section if files.include?(basename)
57
+ end
58
+ nil
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+ require 'ehbrs_ruby_utils/music/sort/files/factory'
5
+
6
+ module EhbrsRubyUtils
7
+ module Music
8
+ module Sort
9
+ module Files
10
+ class Scanner
11
+ enable_simple_cache
12
+ common_constructor :root
13
+
14
+ def all
15
+ by_section.flat_map { |_s, fs| fs }
16
+ end
17
+
18
+ def config_file
19
+ root.join('.sort')
20
+ end
21
+
22
+ # @return [Integer]
23
+ def count
24
+ by_section.values.inject(0) { |a, e| a + e.count }
25
+ end
26
+
27
+ def search(name)
28
+ all.find { |sf| sf.name == name }
29
+ end
30
+
31
+ private
32
+
33
+ def by_section_uncached
34
+ r = {}
35
+ to_sort.each do |f|
36
+ sf = ::EhbrsRubyUtils::Music::Sort::Files::Factory.new(f, config_data).build
37
+ r[sf.section] ||= []
38
+ r[sf.section] << sf
39
+ end
40
+ EhbrsRubyUtils::Music::Sort::Files::Factory::SECTIONS.index_with do |s|
41
+ r[s] || []
42
+ end.freeze
43
+ end
44
+
45
+ def config_data_uncached
46
+ if config_file.exist?
47
+ ::EacRubyUtils::Yaml.load_file(config_file)
48
+ else
49
+ {}
50
+ end
51
+ end
52
+
53
+ def to_sort
54
+ root.children.reject { |e| e.basename.to_path.start_with?('.') }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ module Sort
8
+ module Files
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ehbrs_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Music
7
+ module Sort
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.41.2'
4
+ VERSION = '0.42.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ehbrs_ruby_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.41.2
4
+ version: 0.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-13 00:00:00.000000000 Z
11
+ date: 2024-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha
@@ -70,20 +70,14 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0.90'
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: 0.90.1
73
+ version: '0.91'
77
74
  type: :runtime
78
75
  prerelease: false
79
76
  version_requirements: !ruby/object:Gem::Requirement
80
77
  requirements:
81
78
  - - "~>"
82
79
  - !ruby/object:Gem::Version
83
- version: '0.90'
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: 0.90.1
80
+ version: '0.91'
87
81
  - !ruby/object:Gem::Dependency
88
82
  name: dentaku
89
83
  requirement: !ruby/object:Gem::Requirement
@@ -339,6 +333,16 @@ files:
339
333
  - lib/ehbrs_ruby_utils/music/ous/artist.rb
340
334
  - lib/ehbrs_ruby_utils/music/ous/category.rb
341
335
  - lib/ehbrs_ruby_utils/music/ous/node.rb
336
+ - lib/ehbrs_ruby_utils/music/sort.rb
337
+ - lib/ehbrs_ruby_utils/music/sort/commands.rb
338
+ - lib/ehbrs_ruby_utils/music/sort/commands/base.rb
339
+ - lib/ehbrs_ruby_utils/music/sort/commands/dump.rb
340
+ - lib/ehbrs_ruby_utils/music/sort/commands/load.rb
341
+ - lib/ehbrs_ruby_utils/music/sort/commands/shuffle.rb
342
+ - lib/ehbrs_ruby_utils/music/sort/files.rb
343
+ - lib/ehbrs_ruby_utils/music/sort/files/base.rb
344
+ - lib/ehbrs_ruby_utils/music/sort/files/factory.rb
345
+ - lib/ehbrs_ruby_utils/music/sort/files/scanner.rb
342
346
  - lib/ehbrs_ruby_utils/patches.rb
343
347
  - lib/ehbrs_ruby_utils/patches/object.rb
344
348
  - lib/ehbrs_ruby_utils/patches/object/template.rb