ehbrs_ruby_utils 0.41.1 → 0.42.0

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: 586c5869279d721b48b5cf6d6ce585edc26601a00aff87f412fa0cad3142206e
4
- data.tar.gz: bf287e776722f8b92f3f7fe7832fdc574251c4ebee744c1f3018ef2957e278d7
3
+ metadata.gz: d257573a9117902808e20c43bf002671f832d16cc40bf676cfb46282435b22f5
4
+ data.tar.gz: fa5b446750faae117f1902457683b1b46599f85e64d40b7402451433d007d861
5
5
  SHA512:
6
- metadata.gz: ba4bc8bce782d16640c2e984ffd02f1a4a8dd390921f136321697efc1d3dd03339baeac2722ff5f1d9f858e44f3d616b3bb1b83dca6358d5993f621c3fd6593a
7
- data.tar.gz: f9711900cb11defad1165a869e77bdc5ff160b7a070f79870bd927c624871271476505900b1d45dd88bf7598191809879b84fc9c3f40d5f6a37d5302caf47c83
6
+ metadata.gz: 2f5dbbbcffc5213abb54303cc9272e3875f40ba4f80c759298c6ba4d6677e806862b5a221a26fd487f45c26c02f7075decbf1251b424dd15a28ab186c35d9d5c
7
+ data.tar.gz: dd456900169ed432a7c2b3aaef91ab93fff318b098eddcade488b5877df89b9babdeb45ec1336eadeb2ecde18d80a1c1b7011a5fa56952ed6427e60f3aab41ea
@@ -25,6 +25,8 @@ module EhbrsRubyUtils
25
25
  private
26
26
 
27
27
  def clear_target_dir
28
+ return unless target_dir.exist?
29
+
28
30
  target_dir.children.each do |c|
29
31
  c.unlink if c.symlink? && c.directory?
30
32
  end
@@ -11,7 +11,7 @@ module EhbrsRubyUtils
11
11
  end
12
12
 
13
13
  def perform
14
- target_path.make_symlink(path)
14
+ target_path.assert_parent.make_symlink(path)
15
15
  end
16
16
 
17
17
  def target_path
@@ -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,6 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_templates/patches/object/template'
4
-
5
- EacTemplates::Searcher.default.included_paths <<
6
- File.expand_path('../../../../template', __dir__)
4
+ require 'eac_templates/sources/from_all_gems'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EhbrsRubyUtils
4
- VERSION = '0.41.1'
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.1
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-02-12 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
@@ -50,34 +50,34 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.9'
53
+ version: '0.10'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.10.1
54
57
  type: :runtime
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - "~>"
59
62
  - !ruby/object:Gem::Version
60
- version: '0.9'
63
+ version: '0.10'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.10.1
61
67
  - !ruby/object:Gem::Dependency
62
68
  name: avm
63
69
  requirement: !ruby/object:Gem::Requirement
64
70
  requirements:
65
71
  - - "~>"
66
72
  - !ruby/object:Gem::Version
67
- version: '0.84'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 0.84.2
73
+ version: '0.91'
71
74
  type: :runtime
72
75
  prerelease: false
73
76
  version_requirements: !ruby/object:Gem::Requirement
74
77
  requirements:
75
78
  - - "~>"
76
79
  - !ruby/object:Gem::Version
77
- version: '0.84'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 0.84.2
80
+ version: '0.91'
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: dentaku
83
83
  requirement: !ruby/object:Gem::Requirement
@@ -333,6 +333,16 @@ files:
333
333
  - lib/ehbrs_ruby_utils/music/ous/artist.rb
334
334
  - lib/ehbrs_ruby_utils/music/ous/category.rb
335
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
336
346
  - lib/ehbrs_ruby_utils/patches.rb
337
347
  - lib/ehbrs_ruby_utils/patches/object.rb
338
348
  - lib/ehbrs_ruby_utils/patches/object/template.rb