ehbrs_ruby_utils 0.32.0 → 0.35.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress.rb +2 -2
  3. data/lib/ehbrs_ruby_utils/bga/parsers/table/options.rb +3 -3
  4. data/lib/ehbrs_ruby_utils/bga/session/skip_trophies.rb +1 -1
  5. data/lib/ehbrs_ruby_utils/bga/session/user.rb +1 -3
  6. data/lib/ehbrs_ruby_utils/bga/table/whatsapp_formatters/base.rb +1 -1
  7. data/lib/ehbrs_ruby_utils/circular_list_spreader/base_level.rb +1 -1
  8. data/lib/ehbrs_ruby_utils/circular_list_spreader/group_level.rb +1 -1
  9. data/lib/ehbrs_ruby_utils/cooking_book/build/base_page.rb +42 -0
  10. data/lib/ehbrs_ruby_utils/cooking_book/build/index_page.rb +26 -0
  11. data/lib/ehbrs_ruby_utils/cooking_book/build/recipe_page.rb +26 -0
  12. data/lib/ehbrs_ruby_utils/cooking_book/build.rb +45 -0
  13. data/lib/ehbrs_ruby_utils/cooking_book/project.rb +31 -0
  14. data/lib/ehbrs_ruby_utils/cooking_book/recipe/ingredient.rb +21 -0
  15. data/lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb +60 -0
  16. data/lib/ehbrs_ruby_utils/cooking_book/recipe/part.rb +32 -0
  17. data/lib/ehbrs_ruby_utils/cooking_book/recipe.rb +37 -0
  18. data/lib/ehbrs_ruby_utils/cooking_book.rb +9 -0
  19. data/lib/ehbrs_ruby_utils/fs/selected/build.rb +1 -1
  20. data/lib/ehbrs_ruby_utils/music/lyrics_book/resource.rb +1 -1
  21. data/lib/ehbrs_ruby_utils/patches/object/template.rb +2 -2
  22. data/lib/ehbrs_ruby_utils/patches/object.rb +1 -1
  23. data/lib/ehbrs_ruby_utils/patches.rb +1 -1
  24. data/lib/ehbrs_ruby_utils/version.rb +1 -1
  25. data/lib/ehbrs_ruby_utils/vg/wii/file_move.rb +89 -0
  26. data/lib/ehbrs_ruby_utils/vg/wii/game_file.rb +87 -0
  27. data/lib/ehbrs_ruby_utils/vg/wii/wit/image_format.rb +47 -0
  28. data/lib/ehbrs_ruby_utils/vg/wii/wit/parsers/dump.rb +67 -0
  29. data/lib/ehbrs_ruby_utils/vg/wii/wit/parsers/info.rb +39 -0
  30. data/lib/ehbrs_ruby_utils/vg/wii/wit/path.rb +55 -0
  31. data/lib/ehbrs_ruby_utils/vg/wii/wit.rb +13 -0
  32. data/lib/ehbrs_ruby_utils/vg/wii.rb +11 -0
  33. data/lib/ehbrs_ruby_utils/vg.rb +9 -0
  34. data/lib/ehbrs_ruby_utils/videos/container.rb +1 -1
  35. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/subtitles_provider.rb +51 -0
  36. data/lib/ehbrs_ruby_utils/videos/opensubtitles/processors/title.rb +5 -0
  37. data/lib/ehbrs_ruby_utils/videos/quality.rb +1 -3
  38. data/lib/ehbrs_ruby_utils/videos/resolution.rb +2 -2
  39. data/lib/ehbrs_ruby_utils/videos/series/rename/file/basename_parser.rb +2 -2
  40. data/lib/ehbrs_ruby_utils/videos/series/rename/file.rb +2 -2
  41. data/lib/ehbrs_ruby_utils/videos/series/rename/line_result.rb +2 -2
  42. data/lib/ehbrs_ruby_utils/videos/series/rename/line_result_group.rb +1 -0
  43. data/lib/ehbrs_ruby_utils/videos/series/rename/season_group.rb +1 -0
  44. data/lib/ehbrs_ruby_utils/videos/stream.rb +1 -1
  45. data/lib/ehbrs_ruby_utils/web_utils/videos/file.rb +1 -1
  46. metadata +44 -146
  47. data/.rspec +0 -1
  48. data/.rubocop.yml +0 -45
  49. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec.rb +0 -7
  50. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_84920871_2023-06-12.source.html +0 -8657
  51. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_84920871_2023-06-12.target.yaml +0 -41
  52. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_84920871_2023-06-19.source.html +0 -8650
  53. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_84920871_2023-06-19.target.yaml +0 -41
  54. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93167144_2023-06-12.source.html +0 -8657
  55. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93167144_2023-06-12.target.yaml +0 -5
  56. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93205235_2023-06-12.source.html +0 -8657
  57. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93205235_2023-06-12.target.yaml +0 -13
  58. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93212034_2023-06-12.source.html +0 -8657
  59. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93212034_2023-06-12.target.yaml +0 -29
  60. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93223573_2023-06-12.source.html +0 -8657
  61. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93223573_2023-06-12.target.yaml +0 -7
  62. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93248308_2023-06-12.source.html +0 -8657
  63. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_in_progress_spec_files/player_93248308_2023-06-12.target.yaml +0 -1
  64. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec.rb +0 -7
  65. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/1.source.html +0 -1082
  66. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/1.target.yaml +0 -151
  67. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/2.source.html +0 -1083
  68. data/spec/lib/ehbrs_ruby_utils/bga/parsers/game_stats_spec_files/2.target.yaml +0 -1127
  69. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec.rb +0 -7
  70. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_302873643.source.html +0 -1491
  71. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_302873643.target.yaml +0 -40
  72. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_308782287.source.html +0 -1965
  73. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_308782287.target.yaml +0 -46
  74. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_356513708.source.html +0 -1497
  75. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_356513708.target.yaml +0 -56
  76. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_357408039.source.html +0 -1500
  77. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_357408039.target.yaml +0 -66
  78. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_368448439.source.html +0 -1497
  79. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_368448439.target.yaml +0 -58
  80. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373602409.source.html +0 -1441
  81. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373602409.target.yaml +0 -30
  82. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373747455.source.html +0 -1521
  83. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_373747455.target.yaml +0 -59
  84. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_383405743.source.html +0 -1480
  85. data/spec/lib/ehbrs_ruby_utils/bga/parsers/table_spec_files/table_383405743.target.yaml +0 -32
  86. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec.rb +0 -68
  87. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.source.yaml +0 -124
  88. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/ehbrs_music1.target.yaml +0 -70
  89. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.source.yaml +0 -7
  90. data/spec/lib/ehbrs_ruby_utils/circular_list_spreader_spec_files/minimum.target.yaml +0 -5
  91. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec.rb +0 -7
  92. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.source.html +0 -993
  93. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/counterpart_s01e01.target.yaml +0 -5
  94. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.source.html +0 -478
  95. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/episode_spec_files/wire-season-1-page-1.target.yaml +0 -43
  96. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec.rb +0 -7
  97. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.source.html +0 -763
  98. data/spec/lib/ehbrs_ruby_utils/videos/opensubtitles/parsers/title_spec_files/countepart.target.yaml +0 -22
  99. data/spec/lib/ehbrs_ruby_utils/videos/resolution_spec.rb +0 -18
  100. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec.rb +0 -13
  101. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_attachment.source.yaml +0 -28
  102. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_attachment.target.yaml +0 -8
  103. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_audio.source.yaml +0 -49
  104. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_audio.target.yaml +0 -8
  105. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_subtitle.source.yaml +0 -43
  106. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_subtitle.target.yaml +0 -8
  107. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_video.source.yaml +0 -59
  108. data/spec/lib/ehbrs_ruby_utils/videos/stream_spec_files/menina_ovo_video.target.yaml +0 -8
  109. data/spec/rubocop_check_spec.rb +0 -3
  110. data/spec/spec_helper.rb +0 -4
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehbrs/executables'
5
+ require 'ehbrs_ruby_utils/vg/wii/wit/parsers/info'
6
+
7
+ module EhbrsRubyUtils
8
+ module Vg
9
+ module Wii
10
+ module Wit
11
+ class ImageFormat
12
+ class << self
13
+ SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
14
+
15
+ enable_simple_cache
16
+
17
+ def by_name(name)
18
+ all.find { |i| i.name.downcase == name.to_s.downcase } ||
19
+ raise(::ArgumentError, "Image not found with name \"#{name.to_s.downcase}\" " \
20
+ "(Available: #{all.map(&:name).join(', ')})")
21
+ end
22
+
23
+ private
24
+
25
+ def all_uncached
26
+ ::EhbrsRubyUtils::Vg::Wii::Wit::Parsers::Info.new(info_output).images
27
+ .map do |_label, data|
28
+ new(
29
+ *%w[name info option].map { |k| data.fetch(k) },
30
+ *%w[extensions attributes].map { |k| data.fetch(k).to_s.split(/\s+/) }
31
+ )
32
+ end
33
+ end
34
+
35
+ def info_output
36
+ ::Ehbrs::Executables.wit.command
37
+ .append(%w[info image-format --sections])
38
+ .execute!
39
+ end
40
+ end
41
+
42
+ common_constructor :name, :description, :option, :extensions, :attributes
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Vg
7
+ module Wii
8
+ module Wit
9
+ module Parsers
10
+ class Dump
11
+ enable_simple_cache
12
+ common_constructor :output
13
+
14
+ # WIA/WII (v1.00,LZMA2.7@100) & Wii
15
+ # ISO/WII & Wii
16
+ # WBFS/WII & Wii
17
+ # ISO/GC & GameCube
18
+ FILE_DISC_TYPE_PATTERN = %r{\A(\S+)/(\S+)\s+(?:\(([^\)]+)\)\s+)?&\s+(\S+)\z}.freeze
19
+
20
+ private
21
+
22
+ def properties_uncached
23
+ r = {}
24
+ output.each_line do |line|
25
+ dump_output_line_to_hash(line).if_present { |v| r.merge!(v) }
26
+ end
27
+ r
28
+ end
29
+
30
+ def dump_output_line_to_hash(line)
31
+ m = /\A\s*([^:]+):\s+(.+)\z/.match(line.strip)
32
+ return nil unless m
33
+
34
+ parse_attribute(m[1].strip, m[2].strip)
35
+ end
36
+
37
+ def line_method_parser(label)
38
+ "parse_#{label}".parameterize.underscore
39
+ end
40
+
41
+ def parse_attribute(label, value)
42
+ method = line_method_parser(label)
43
+ return { label => value } unless respond_to?(method, true)
44
+
45
+ send(method, value).transform_keys { |k| "#{label}/#{k}" }
46
+ end
47
+
48
+ def parse_file_disc_type(value)
49
+ r = FILE_DISC_TYPE_PATTERN.match(value).if_present do |m|
50
+ { type: m[1], platform_acronym: m[2], type_extra: m[3],
51
+ platform_name: m[4] }
52
+ end
53
+ r.if_blank { raise "\"#{FILE_DISC_TYPE_PATTERN}\" does not match \"#{value}\"" }
54
+ end
55
+
56
+ def parse_disc_part_ids(value)
57
+ value.split(',').to_h do |v|
58
+ r = v.strip.split('=')
59
+ [r[0].strip, r[1].strip]
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'ehbrs/executables'
5
+ require 'fileutils'
6
+ require 'inifile'
7
+
8
+ module EhbrsRubyUtils
9
+ module Vg
10
+ module Wii
11
+ module Wit
12
+ module Parsers
13
+ class Info
14
+ SECTION_NAME_PATTERN = /\A#{::Regexp.quote('IMAGE-FORMAT:')}(.+)\z/.freeze
15
+
16
+ enable_simple_cache
17
+ common_constructor :output
18
+
19
+ private
20
+
21
+ def images_uncached
22
+ ini = ::IniFile.new(content: output)
23
+ r = {}
24
+ ini.sections.each do |section_name|
25
+ image_section_name = parse_image_section_name(section_name)
26
+ r[image_section_name] = ini[section_name] if image_section_name.present?
27
+ end
28
+ r
29
+ end
30
+
31
+ def parse_image_section_name(section_name)
32
+ SECTION_NAME_PATTERN.match(section_name).if_present { |m| m[1] }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Vg
7
+ module Wii
8
+ module Wit
9
+ class Path
10
+ WIT_PATH_PATTERN = /\A(?:([a-z0-9]+):)?(.+)\z/i.freeze
11
+
12
+ class << self
13
+ def assert(source)
14
+ source = parse(source) unless source.is_a?(self)
15
+ source
16
+ end
17
+
18
+ def parse(path)
19
+ WIT_PATH_PATTERN
20
+ .match(path)
21
+ .if_present { |m| new(m[1], m[2]) }
22
+ .if_blank { raise "\"#{WIT_PATH_PATTERN}\" does not match \"#{path}\"" }
23
+ end
24
+ end
25
+
26
+ common_constructor :type, :path do
27
+ self.type = type.to_s.upcase
28
+ self.path = ::Pathname.new(path.to_s)
29
+ end
30
+
31
+ def change?(other)
32
+ type_change?(other) || path_change?(other)
33
+ end
34
+
35
+ def path_change?(other)
36
+ path.expand_path.to_s != other.path.expand_path.to_s
37
+ end
38
+
39
+ def to_s
40
+ r = path.to_s
41
+ r = "#{type.to_s.upcase}:#{r}" if type.present?
42
+ r
43
+ end
44
+
45
+ def type_change?(other)
46
+ return false if other.type.blank?
47
+ return true if type.blank?
48
+
49
+ type != other.type
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Vg
7
+ module Wii
8
+ module Wit
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Vg
7
+ module Wii
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EhbrsRubyUtils
6
+ module Vg
7
+ require_sub __FILE__
8
+ end
9
+ end
@@ -43,7 +43,7 @@ module EhbrsRubyUtils
43
43
  def song_metadata_uncached
44
44
  ::UltimateLyrics::SongMetadata.new(
45
45
  ::UltimateLyrics::SongMetadata::Field.lists.sources.values
46
- .map { |source| [source, tag.send(source)] }.to_h
46
+ .index_with { |source| tag.send(source) }
47
47
  )
48
48
  end
49
49
 
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/default_processor'
4
+ require 'ehbrs_ruby_utils/videos/opensubtitles/processors/episode'
5
+ require 'ehbrs_ruby_utils/videos/opensubtitles/processors/title'
6
+ require 'eac_ruby_utils/core_ext'
7
+
8
+ module EhbrsRubyUtils
9
+ module Videos
10
+ module Opensubtitles
11
+ module Processors
12
+ class SubtitlesProvider < ::Aranha::DefaultProcessor
13
+ enable_simple_cache
14
+
15
+ delegate :perform, :subtitles, to: :sub_processor
16
+
17
+ # @return [Boolean]
18
+ def episode?
19
+ title_parser.data[:episodes].if_present(true, &:empty?)
20
+ end
21
+
22
+ private
23
+
24
+ # @return [Class]
25
+ def sub_processor_class
26
+ if episode?
27
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Processors::Episode
28
+ else
29
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Processors::Title
30
+ end
31
+ end
32
+
33
+ # @return [EhbrsRubyUtils::Videos::Opensubtitles::Parsers::Episode]
34
+ def episode_parser
35
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Parsers::Episode.new(source_uri)
36
+ end
37
+
38
+ # @return [EhbrsRubyUtils::Videos::Opensubtitles::Parsers::Title]
39
+ def title_parser
40
+ ::EhbrsRubyUtils::Videos::Opensubtitles::Parsers::Title.new(source_uri)
41
+ end
42
+
43
+ # @return [Aranha::DefaultProcessor]
44
+ def sub_processor_uncached
45
+ sub_processor_class.new(source_uri, extra_data)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -18,6 +18,11 @@ module EhbrsRubyUtils
18
18
  episodes.each(&:perform)
19
19
  end
20
20
 
21
+ # @return [Array<EhbrsRubyUtils::Videos::Opensubtitles::Processors::Subtitle>]
22
+ def subtitles
23
+ episodes.flat_map(&:subtitles)
24
+ end
25
+
21
26
  private
22
27
 
23
28
  def episode_uri(episode_data)
@@ -36,9 +36,7 @@ module EhbrsRubyUtils
36
36
  height <=> other.height
37
37
  end
38
38
 
39
- def to_s
40
- height.to_s
41
- end
39
+ delegate :to_s, to: :height
42
40
 
43
41
  def to_xs
44
42
  "#{height} (Min: #{min_height}, Max: #{max_height})"
@@ -29,11 +29,11 @@ module EhbrsRubyUtils
29
29
  end
30
30
 
31
31
  def higher
32
- width > height ? width : height
32
+ [width, height].max
33
33
  end
34
34
 
35
35
  def lower
36
- width < height ? width : height
36
+ [width, height].min
37
37
  end
38
38
 
39
39
  def pixels
@@ -10,10 +10,10 @@ module EhbrsRubyUtils
10
10
  module BasenameParser
11
11
  FORMATS = [{
12
12
  format: /(\d+)(\d{2})(\d{2})/i,
13
- build: ->(m) { { s: padding(m[1]), e: padding(m[2]) + '-' + padding(m[3]) } }
13
+ build: ->(m) { { s: padding(m[1]), e: "#{padding(m[2])}-#{padding(m[3])}" } }
14
14
  }, {
15
15
  format: /s(\d+)e(\d+)-(\d+)/i,
16
- build: ->(m) { { s: padding(m[1]), e: padding(m[2]) + '-' + padding(m[3]) } }
16
+ build: ->(m) { { s: padding(m[1]), e: "#{padding(m[2])}-#{padding(m[3])}" } }
17
17
  }, {
18
18
  format: /(\d{1,2})\s*[^\d]\s*(\d{2})/i,
19
19
  build: ->(m) { { s: padding(m[1]), e: padding(m[2]) } }
@@ -13,7 +13,7 @@ module EhbrsRubyUtils
13
13
 
14
14
  common_constructor :file, :options do
15
15
  self.file = file.to_pathname.expand_path
16
- self.options = ::OpenStruct.new(options) if options.is_a?(::Hash)
16
+ self.options = options.to_struct if options.is_a?(::Hash)
17
17
  end
18
18
 
19
19
  # @return [String]
@@ -70,7 +70,7 @@ module EhbrsRubyUtils
70
70
 
71
71
  def kernel_from_directory_name
72
72
  dir = dirname.basename.to_path.sub(/\([0-9]+\)/, '')
73
- dir.split(/\W+/).select { |w| /\A[a-z0-9]/.match(w) }.map { |p| p[0].downcase }.join('')
73
+ dir.split(/\W+/).select { |w| /\A[a-z0-9]/.match(w) }.map { |p| p[0].downcase }.join
74
74
  end
75
75
 
76
76
  def extension
@@ -11,13 +11,13 @@ module EhbrsRubyUtils
11
11
  enable_speaker
12
12
 
13
13
  def show(level)
14
- out(padding_level(level) + line_out + "\n")
14
+ out("#{padding_level(level)}#{line_out}\n")
15
15
  end
16
16
 
17
17
  private
18
18
 
19
19
  def padding_level(level)
20
- (' ' * level.to_i) + '* '
20
+ "#{' ' * level.to_i}* "
21
21
  end
22
22
  end
23
23
  end
@@ -10,6 +10,7 @@ module EhbrsRubyUtils
10
10
  attr_reader :name, :children
11
11
 
12
12
  def initialize(name, files)
13
+ super
13
14
  @name = name
14
15
  @children = build_children(files)
15
16
  end
@@ -10,6 +10,7 @@ module EhbrsRubyUtils
10
10
  attr_reader :season, :files
11
11
 
12
12
  def initialize(season, files)
13
+ super
13
14
  @season = season
14
15
  @files = files.sort_by { |f| [f.episode] }
15
16
  end
@@ -54,7 +54,7 @@ module EhbrsRubyUtils
54
54
  end
55
55
 
56
56
  def language_with_title
57
- [language, title].reject(&:blank?).if_present { |v| v.join('_').variableize }
57
+ [language, title].compact_blank.if_present { |v| v.join('_').variableize }
58
58
  end
59
59
 
60
60
  def title
@@ -10,7 +10,7 @@ module EhbrsRubyUtils
10
10
  require_sub __FILE__
11
11
 
12
12
  def initialize(data)
13
- super(::OpenStruct.new(data))
13
+ super(data.to_struct)
14
14
  end
15
15
 
16
16
  def exist?