rbs_mini_magick 0.1.0 → 0.2.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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +15 -1
  4. data/lib/rbs_mini_magick/builder.rb +47 -0
  5. data/lib/rbs_mini_magick/flows/major5_minor0/image_class.rb +55 -0
  6. data/lib/rbs_mini_magick/flows/major5_minor0/tool_interface.rb +50 -0
  7. data/lib/rbs_mini_magick/flows/major5_minor0/tool_singleton.rb +39 -0
  8. data/lib/rbs_mini_magick/flows/major5_minor0/tool_subclass.rb +40 -0
  9. data/lib/rbs_mini_magick/flows/major5_minor0.rb +38 -0
  10. data/lib/rbs_mini_magick/flows/state.rb +68 -0
  11. data/lib/rbs_mini_magick/flows.rb +9 -0
  12. data/lib/rbs_mini_magick/generator.rb +4 -4
  13. data/lib/rbs_mini_magick/image_magick/{command_line_option.rb → option.rb} +5 -8
  14. data/lib/rbs_mini_magick/image_magick/tool_usage.rb +52 -0
  15. data/lib/rbs_mini_magick/image_magick.rb +5 -21
  16. data/lib/rbs_mini_magick/version.rb +1 -1
  17. data/lib/rbs_mini_magick.rb +7 -6
  18. metadata +12 -15
  19. data/lib/rbs_mini_magick/builders/builder.rb +0 -57
  20. data/lib/rbs_mini_magick/builders/image_class.rb +0 -31
  21. data/lib/rbs_mini_magick/builders/singleton_method.rb +0 -20
  22. data/lib/rbs_mini_magick/builders/tool_interface.rb +0 -25
  23. data/lib/rbs_mini_magick/builders/tool_subclass.rb +0 -20
  24. data/lib/rbs_mini_magick/builders/v5_0/builder.rb +0 -37
  25. data/lib/rbs_mini_magick/builders/v5_0/image_class.rb +0 -32
  26. data/lib/rbs_mini_magick/builders/v5_0/singleton_method.rb +0 -20
  27. data/lib/rbs_mini_magick/builders/v5_0/tool_interface.rb +0 -20
  28. data/lib/rbs_mini_magick/builders/v5_0/tool_subclass.rb +0 -19
  29. data/lib/rbs_mini_magick/builders.rb +0 -18
  30. data/lib/rbs_mini_magick/image_magick/usage_parser.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d110222be265ce0165e6eb2ed2b0632ceb5ad05b52a99d42b6a00e61cc54a12
4
- data.tar.gz: d42c86a6def43b291ba45467fbccb48d0ffd455e49b5f211e77f886bbb98b29b
3
+ metadata.gz: f035353c1efe52e97b2951cbb68d0a3c14b2189dff3dd8451ab7c9e417b7105a
4
+ data.tar.gz: b50d67b49e4b704aaac3436f12587d782aed6b1c31db3e0bf965cb773770fe33
5
5
  SHA512:
6
- metadata.gz: 7bed2461449acac38299d412512a10ab9b175bec7cb9c52e77606fead4cb2e06b585691e6be5b82c28eaf24eb918f0471aa266416a99a744d861275a3cab8420
7
- data.tar.gz: 99c345541e98bebd636b3c7fa3a23d273626b937c5830bd8611dea2840e2574a51ea08cd2ec1b27077e16d9bfd006ec0aba8accc5a7bab0b916e8c37f95242e3
6
+ metadata.gz: 4a091a651834b604a18ebbfb3bce50c6393ba5d7fa79e9450a1416bd74eba96884cd064315344a5d96652d136f247b5044e4fa62c475ee30038efd3e20318cc1
7
+ data.tar.gz: 5f023c4f6f82cb4275967c11e53b833bb71e0f8d45ec5e7e404beb926daaebf65ff118394fd1180a68e2a64e94dccb9163628452d4b08c35163c1a8099d21dc4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## [0.2.0] - 2024-07-30
4
+
5
+ - Refactoring the RBS builder
6
+
3
7
  ## [0.1.0] - 2024-07-28
4
8
 
5
9
  - Initial release
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # RbsMiniMagick
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/rbs_mini_magick.svg)](https://badge.fury.io/rb/rbs_mini_magick)
4
+
5
+ Generate rbs for MiniMagick gem according to the version of MiniMagick and ImageMagick you use.
6
+
3
7
  ## Installation
4
8
 
5
9
  Install the gem and add to the application's Gemfile by executing:
@@ -16,10 +20,20 @@ $ gem install rbs_mini_magick
16
20
 
17
21
  ## Usage
18
22
 
19
- ```sh
23
+ Generate rbs for the MiniMagick gem in the `sig/rbs_mini_magick` directory.
24
+
25
+ ```
20
26
  $ bundle exec rbs-mini-magick generate
21
27
  ```
22
28
 
29
+ If you want to change the output directory, you can use the `--output-dir` option.
30
+
31
+ Other available options can be referenced with `--help`.
32
+
33
+ ```
34
+ $ bundle exec rbs-mini-magick generate --help
35
+ ```
36
+
23
37
  ## Development
24
38
 
25
39
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ # RbsMiniMagick::Builder
5
+ class Builder
6
+ # @param mini_magick_version [String, nil]
7
+ # @return [void]
8
+ def initialize(mini_magick_version:)
9
+ @mini_magick_version = mini_magick_version&.then { Gem::Version.new(_1) } ||
10
+ MiniMagick.version
11
+ end
12
+
13
+ # @return [String]
14
+ def run
15
+ tool_names, flows = tool_names_and_flows
16
+ initial_state = Flows::State.init(tool_usages: build_tool_usages(tool_names))
17
+ completed_state = flows.reduce(initial_state) { |state, flow| flow.run(state) }
18
+
19
+ completed_state.formated_rbs
20
+ end
21
+
22
+ private
23
+
24
+ # @!attribute [r] mini_magick_version
25
+ # @return [Gem::Version]
26
+ attr_reader :mini_magick_version
27
+
28
+ # @return [Array]
29
+ def tool_names_and_flows
30
+ case mini_magick_version
31
+ when Range.new(Gem::Version.new("5.0"), nil)
32
+ [Flows::Major5Minor0::TOOL_NAMES, Flows::Major5Minor0::FLOWS]
33
+ else
34
+ raise Error, "#{mini_magick_version} does not support"
35
+ end
36
+ end
37
+
38
+ # @param tool_names [Array<String>]
39
+ # @return [Array<RbsMiniMagick::ImageMagick::ToolUsage>]
40
+ def build_tool_usages(tool_names)
41
+ tool_names.map do |tool_name|
42
+ raw_usage = ImageMagick::UsageFetcher.new(tool_name: tool_name).run
43
+ ImageMagick::ToolUsage.build_by_raw_usage(tool_name, raw_usage)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module Flows
5
+ # RbsMiniMagick::Flows::Major5Minor0
6
+ module Major5Minor0
7
+ # RbsMiniMagick::Flows::Major5Minor0::ImageClass
8
+ class ImageClass
9
+ # @param state [RbsMiniMagick::Flows::State]
10
+ # @return [RbsMiniMagick::Flows::State]
11
+ def run(state) # rubocop:disable Metrics/MethodLength
12
+ image_instance_methods = MiniMagick::Image.instance_methods.to_set(&:to_s)
13
+ mogrify_methods = state.fetch_tool_usage("mogrify")
14
+ .options
15
+ .reject { image_instance_methods.include?(_1.normalized_name) }
16
+ .map { mogrify_method(_1) }
17
+ .uniq.join("\n")
18
+ rbs = <<~RBS
19
+ module MiniMagick
20
+ class Image
21
+ def initialize: (_ToS input_path, ?Tempfile? tempfile) ?{ (Tool & _Mogrify[Tool]) -> void } -> void
22
+ | ...
23
+
24
+ def combine_options: () { (Tool & _Mogrify[Tool]) -> void } -> self
25
+ | ...
26
+
27
+ def composite: (instance other_image, ?String output_extension, ?untyped? mask) ?{ (Tool & _Composite[Tool]) -> void } -> instance
28
+ | ...
29
+
30
+ def identify: () ?{ (Tool & _Identify[Tool]) -> void } -> String
31
+ | ...
32
+
33
+ def mogrify: (?Integer? page) ?{ (Tool & _Mogrify[Tool]) -> void } -> self
34
+ | ...
35
+
36
+ #{mogrify_methods}
37
+ end
38
+ end
39
+ RBS
40
+
41
+ state.concat_rbs(rbs)
42
+ end
43
+
44
+ private
45
+
46
+ # @param option [RbsMiniMagick::ImageMagick::Option]
47
+ # @return [String]
48
+ def mogrify_method(option)
49
+ args = option.args_empty? ? "" : "*_ToS args"
50
+ "def #{option.normalized_name}: (#{args}) -> self"
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module Flows
5
+ # RbsMiniMagick::Flows::Major5Minor0
6
+ module Major5Minor0
7
+ # RbsMiniMagick::Flows::Major5Minor0::ToolInterface
8
+ class ToolInterface
9
+ # @param name [String]
10
+ # @return [void]
11
+ def initialize(name:)
12
+ @name = name
13
+ end
14
+
15
+ # @param state [RbsMiniMagick::Flows::State]
16
+ # @return [RbsMiniMagick::Flows::State]
17
+ def run(state) # rubocop:disable Metrics/MethodLength
18
+ tool_usage = state.fetch_tool_usage(name)
19
+ interface_name = "_#{name.capitalize}"
20
+ option_methods = tool_usage.options
21
+ .map { option_method(_1) }
22
+ .uniq.join("\n")
23
+ rbs = <<~RBS
24
+ module MiniMagick
25
+ interface #{interface_name}[T]
26
+ #{option_methods}
27
+ end
28
+ end
29
+ RBS
30
+
31
+ state.concat_rbs(rbs)
32
+ end
33
+
34
+ private
35
+
36
+ # @!attribute [r] name
37
+ # @return [String]
38
+ attr_reader :name
39
+
40
+ # @param option [RbsMiniMagick::ImageMagick::Option]
41
+ # @return [String]
42
+ def option_method(option)
43
+ args = option.args_empty? ? "" : "*_ToS args"
44
+
45
+ "def #{option.normalized_name}: (#{args}) -> T"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module Flows
5
+ # RbsMiniMagick::Flows::Major5Minor0
6
+ module Major5Minor0
7
+ # RbsMiniMagick::Flows::Major5Minor0::ToolSingleton
8
+ class ToolSingleton
9
+ # @param name [String]
10
+ # @return [void]
11
+ def initialize(name:)
12
+ @name = name
13
+ end
14
+
15
+ # @param state [RbsMiniMagick::Flows::State]
16
+ # @return [RbsMiniMagick::Flows::State]
17
+ def run(state)
18
+ interface_name = "_#{name.capitalize}"
19
+ args = "?errors: bool, ?warnings: bool, ?stdin: _ToS, ?timeout: Integer?, **untyped options"
20
+ rbs = <<~RBS
21
+ module MiniMagick
22
+ def self.#{name}: (#{args}) -> (Tool & #{interface_name}[Tool])
23
+ | (#{args}) { (Tool & #{interface_name}[Tool]) -> void } -> String
24
+ | ...
25
+ end
26
+ RBS
27
+
28
+ state.concat_rbs(rbs)
29
+ end
30
+
31
+ private
32
+
33
+ # @!attribute [r] name
34
+ # @return [String]
35
+ attr_reader :name
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module Flows
5
+ # RbsMiniMagick::Flows::Major5Minor0
6
+ module Major5Minor0
7
+ # RbsMiniMagick::Flows::Major5Minor0::ToolSubclass
8
+ class ToolSubclass
9
+ # @param name [String]
10
+ # @return [void]
11
+ def initialize(name:)
12
+ @name = name
13
+ end
14
+
15
+ # @param state [RbsMiniMagick::Flows::State]
16
+ # @return [RbsMiniMagick::Flows::State]
17
+ def run(state) # rubocop:disable Metrics/MethodLength
18
+ capitalized_name = name.capitalize
19
+ rbs = <<~RBS
20
+ module MiniMagick
21
+ class Tool
22
+ class #{capitalized_name} < Tool
23
+ include _#{capitalized_name}
24
+ end
25
+ end
26
+ end
27
+ RBS
28
+
29
+ state.concat_rbs(rbs)
30
+ end
31
+
32
+ private
33
+
34
+ # @!attribute [r] name
35
+ # @return [String]
36
+ attr_reader :name
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "major5_minor0/tool_interface"
4
+ require_relative "major5_minor0/tool_singleton"
5
+ require_relative "major5_minor0/tool_subclass"
6
+ require_relative "major5_minor0/image_class"
7
+
8
+ module RbsMiniMagick
9
+ module Flows
10
+ # RbsMiniMagick::Flows::Major5Minor0
11
+ module Major5Minor0
12
+ # @return [String<String>]
13
+ TOOL_NAMES = %w[
14
+ animate
15
+ compare
16
+ composite
17
+ conjure
18
+ convert
19
+ display
20
+ identify
21
+ import
22
+ mogrify
23
+ montage
24
+ stream
25
+ ].freeze
26
+ public_constant :TOOL_NAMES
27
+
28
+ # @return [Array<#run>]
29
+ FLOWS = [
30
+ *TOOL_NAMES.map { ToolInterface.new(name: _1) },
31
+ *TOOL_NAMES.map { ToolSingleton.new(name: _1) },
32
+ *TOOL_NAMES.map { ToolSubclass.new(name: _1) },
33
+ ImageClass.new
34
+ ].freeze
35
+ public_constant :FLOWS
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module Flows
5
+ # RbsMiniMagick::Flows::State
6
+ class State
7
+ class << self
8
+ # @param tool_usages [Array<RbsMiniMagick::ImageMagick::ToolUsage>]
9
+ # @return [RbsMiniMagick::Flows::State]
10
+ def init(tool_usages:)
11
+ new(tool_usages: tool_usages, rbs: "")
12
+ end
13
+ end
14
+
15
+ # @!attribute [r] tool_usages
16
+ # @return [Array<RbsMiniMagick::ImageMagick::ToolUsage>]
17
+ attr_reader :tool_usages
18
+
19
+ # @param tool_usages [Array<RbsMiniMagick::ImageMagick::ToolUsage>]
20
+ # @param rbs [String]
21
+ # @return [void]
22
+ def initialize(tool_usages:, rbs:)
23
+ @tool_usages = tool_usages
24
+ @tool_usage_by_name = tool_usages.to_h { [_1.name, _1] }
25
+ @rbs = rbs
26
+ end
27
+
28
+ # @param tool_name [String]
29
+ # @return [RbsMiniMagick::ImageMagick::ToolUsage]
30
+ def fetch_tool_usage(tool_name)
31
+ tool_usage_by_name.fetch(tool_name)
32
+ end
33
+
34
+ # @param new_rbs [String]
35
+ # @return [RbsMiniMagick::Flows::State]
36
+ def concat_rbs(new_rbs)
37
+ self.class.new(
38
+ tool_usages: tool_usages,
39
+ rbs: [rbs, new_rbs].join("\n")
40
+ )
41
+ end
42
+
43
+ # @return [String]
44
+ def formated_rbs
45
+ @formated_rbs ||= format_rbs
46
+ end
47
+
48
+ private
49
+
50
+ # @!attribute [r] rbs
51
+ # @return [String]
52
+ attr_reader :rbs
53
+ # @!attribute [r] tool_usage_by_name
54
+ # @return [Hash<String, RbsMiniMagick::ImageMagick::ToolUsage>]
55
+ attr_reader :tool_usage_by_name
56
+
57
+ # @return [String]
58
+ def format_rbs
59
+ out = StringIO.new
60
+ decls = RBS::Parser.parse_signature(rbs).then { _1[1] + _1[2] }
61
+
62
+ RBS::Writer.new(out: out).write(decls)
63
+
64
+ out.string
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "flows/state"
4
+ require_relative "flows/major5_minor0"
5
+
6
+ module RbsMiniMagick
7
+ # RbsMiniMagick::Flows
8
+ module Flows; end
9
+ end
@@ -3,11 +3,11 @@
3
3
  module RbsMiniMagick
4
4
  # RbsMiniMagick::Generator
5
5
  class Generator
6
- # @param mini_magick_version [Gem::Version, nil]
6
+ # @param mini_magick_version [String, nil]
7
7
  # @param output_dir [String, nil]
8
8
  # @return [void]
9
9
  def initialize(mini_magick_version:, output_dir:)
10
- @mini_magick_version = mini_magick_version || MiniMagick.version
10
+ @mini_magick_version = mini_magick_version
11
11
  @output_dir = output_dir&.then { Pathname(_1) } ||
12
12
  Bundler.root.join("sig", "rbs_mini_magick") # steep:ignore
13
13
  @output_path = @output_dir.join("mini_magick.rbs")
@@ -15,7 +15,7 @@ module RbsMiniMagick
15
15
 
16
16
  # @return [void]
17
17
  def run
18
- rbs = Builders::Builder.new(mini_magick_version: mini_magick_version).run
18
+ rbs = Builder.new(mini_magick_version: mini_magick_version).run
19
19
  FileUtils.mkdir_p(output_dir.to_s)
20
20
  File.write(output_path.to_s, rbs)
21
21
  end
@@ -23,7 +23,7 @@ module RbsMiniMagick
23
23
  private
24
24
 
25
25
  # @!attribute [r] mini_magick_version
26
- # @return [Gem::Version]
26
+ # @return [String, nil]
27
27
  attr_reader :mini_magick_version
28
28
  # @!attribute [r] output_dir
29
29
  # @return [Pathname]
@@ -2,8 +2,8 @@
2
2
 
3
3
  module RbsMiniMagick
4
4
  module ImageMagick
5
- # RbsMiniMagick::ImageMagick::CommandLineOption
6
- class CommandLineOption
5
+ # RbsMiniMagick::ImageMagick::Option
6
+ class Option
7
7
  # @!attribute [r] normalized_name
8
8
  # @return [String]
9
9
  attr_reader :normalized_name
@@ -17,12 +17,9 @@ module RbsMiniMagick
17
17
  @normalized_name = name.delete_prefix("-").gsub(/\W/, "_")
18
18
  end
19
19
 
20
- # @param return_type [String]
21
- # @return [String]
22
- def to_method_signature(return_type)
23
- sig_args = args.empty? ? "" : "*_ToS args"
24
-
25
- "def #{normalized_name}: (#{sig_args}) -> #{return_type}"
20
+ # @return [Boolean]
21
+ def args_empty?
22
+ args.empty?
26
23
  end
27
24
 
28
25
  private
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RbsMiniMagick
4
+ module ImageMagick
5
+ # RbsMiniMagick::ImageMagick::ToolUsage
6
+ class ToolUsage
7
+ class << self
8
+ # @param name [String]
9
+ # @param raw_usage [String]
10
+ # @return [RbsMiniMagick::ImageMagick::ToolUsage]
11
+ def build_by_raw_usage(name, raw_usage)
12
+ new(
13
+ name: name,
14
+ options: raw_usage.split("\n").filter_map { build_option_by_raw_line(_1) }
15
+ )
16
+ end
17
+
18
+ private
19
+
20
+ # @param raw_line [String]
21
+ # @return [RbsMiniMagick::ImageMagick::Option, nil]
22
+ def build_option_by_raw_line(raw_line)
23
+ splited = raw_line.match(/^\s*(-\S+(?: \S+)*)\s*/)
24
+ &.then { _1[1] }
25
+ &.split
26
+
27
+ return if splited.nil?
28
+
29
+ Option.new(
30
+ name: String(splited.first),
31
+ args: splited[1..] || []
32
+ )
33
+ end
34
+ end
35
+
36
+ # @!attribute [r] name
37
+ # @return [String]
38
+ attr_reader :name
39
+ # @!attribute [r] options
40
+ # @return [Array<RbsMiniMagick::ImageMagick::Option>]
41
+ attr_reader :options
42
+
43
+ # @param name [String]
44
+ # @param options [Array<RbsMiniMagick::ImageMagick::Option>]
45
+ # @return [void]
46
+ def initialize(name:, options:)
47
+ @name = name
48
+ @options = options
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,26 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "image_magick/usage_fetcher"
4
+ require_relative "image_magick/option"
5
+ require_relative "image_magick/tool_usage"
6
+
3
7
  module RbsMiniMagick
4
8
  # RbsMiniMagick::ImageMagick
5
- module ImageMagick
6
- # @return [String<String>]
7
- TOOL_NAMES = %w[
8
- animate
9
- compare
10
- composite
11
- conjure
12
- convert
13
- display
14
- identify
15
- import
16
- mogrify
17
- montage
18
- stream
19
- ].freeze
20
- public_constant :TOOL_NAMES
21
- end
9
+ module ImageMagick; end
22
10
  end
23
-
24
- require_relative "image_magick/command_line_option"
25
- require_relative "image_magick/usage_fetcher"
26
- require_relative "image_magick/usage_parser"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RbsMiniMagick
4
4
  # RbsMiniMagick::VERSION
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  public_constant :VERSION
7
7
  end
@@ -9,14 +9,15 @@ require "stringio"
9
9
 
10
10
  require "mini_magick"
11
11
 
12
+ require_relative "rbs_mini_magick/version"
13
+ require_relative "rbs_mini_magick/image_magick"
14
+ require_relative "rbs_mini_magick/flows"
15
+ require_relative "rbs_mini_magick/builder"
16
+ require_relative "rbs_mini_magick/generator"
17
+ require_relative "rbs_mini_magick/cli"
18
+
12
19
  # RbsMiniMagick
13
20
  module RbsMiniMagick
14
21
  # RbsMiniMagick::Error
15
22
  class Error < StandardError; end
16
23
  end
17
-
18
- require_relative "rbs_mini_magick/version"
19
- require_relative "rbs_mini_magick/image_magick"
20
- require_relative "rbs_mini_magick/builders"
21
- require_relative "rbs_mini_magick/generator"
22
- require_relative "rbs_mini_magick/cli"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs_mini_magick
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - aki19035vc
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-28 00:00:00.000000000 Z
11
+ date: 2024-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mini_magick
@@ -51,23 +51,20 @@ files:
51
51
  - README.md
52
52
  - exe/rbs-mini-magick
53
53
  - lib/rbs_mini_magick.rb
54
- - lib/rbs_mini_magick/builders.rb
55
- - lib/rbs_mini_magick/builders/builder.rb
56
- - lib/rbs_mini_magick/builders/image_class.rb
57
- - lib/rbs_mini_magick/builders/singleton_method.rb
58
- - lib/rbs_mini_magick/builders/tool_interface.rb
59
- - lib/rbs_mini_magick/builders/tool_subclass.rb
60
- - lib/rbs_mini_magick/builders/v5_0/builder.rb
61
- - lib/rbs_mini_magick/builders/v5_0/image_class.rb
62
- - lib/rbs_mini_magick/builders/v5_0/singleton_method.rb
63
- - lib/rbs_mini_magick/builders/v5_0/tool_interface.rb
64
- - lib/rbs_mini_magick/builders/v5_0/tool_subclass.rb
54
+ - lib/rbs_mini_magick/builder.rb
65
55
  - lib/rbs_mini_magick/cli.rb
56
+ - lib/rbs_mini_magick/flows.rb
57
+ - lib/rbs_mini_magick/flows/major5_minor0.rb
58
+ - lib/rbs_mini_magick/flows/major5_minor0/image_class.rb
59
+ - lib/rbs_mini_magick/flows/major5_minor0/tool_interface.rb
60
+ - lib/rbs_mini_magick/flows/major5_minor0/tool_singleton.rb
61
+ - lib/rbs_mini_magick/flows/major5_minor0/tool_subclass.rb
62
+ - lib/rbs_mini_magick/flows/state.rb
66
63
  - lib/rbs_mini_magick/generator.rb
67
64
  - lib/rbs_mini_magick/image_magick.rb
68
- - lib/rbs_mini_magick/image_magick/command_line_option.rb
65
+ - lib/rbs_mini_magick/image_magick/option.rb
66
+ - lib/rbs_mini_magick/image_magick/tool_usage.rb
69
67
  - lib/rbs_mini_magick/image_magick/usage_fetcher.rb
70
- - lib/rbs_mini_magick/image_magick/usage_parser.rb
71
68
  - lib/rbs_mini_magick/version.rb
72
69
  homepage: https://github.com/aki19035vc/rbs_mini_magick
73
70
  licenses:
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::Builder
6
- class Builder
7
- # @param mini_magick_version [Gem::Version]
8
- # @return [void]
9
- def initialize(mini_magick_version:)
10
- @mini_magick_version = mini_magick_version
11
- end
12
-
13
- # @return [String]
14
- def run
15
- rbs = case mini_magick_version
16
- when Range.new(Gem::Version.new("5.0"), nil)
17
- v5_0
18
- else
19
- raise Error, "#{mini_magick_version} does not support"
20
- end
21
-
22
- format_rbs(rbs)
23
- end
24
-
25
- private
26
-
27
- # @!attribute [r] mini_magick_version
28
- # @return [Gem::Version]
29
- attr_reader :mini_magick_version
30
-
31
- # @return [Hash<String, Array<RbsMiniMagick::ImageMagick::CommandLineOption>>]
32
- def options_by_tool
33
- @options_by_tool ||= ImageMagick::TOOL_NAMES.to_h do |tool|
34
- tool.then { ImageMagick::UsageFetcher.new(tool_name: _1).run }
35
- .then { ImageMagick::UsageParser.new(raw_usage: _1).run }
36
- .then { [tool, _1] }
37
- end
38
- end
39
-
40
- # @return [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
41
- def mogrify_options
42
- @mogrify_options ||= options_by_tool.fetch("mogrify")
43
- end
44
-
45
- # @param rbs [String]
46
- # @return [String]
47
- def format_rbs(rbs)
48
- out = StringIO.new
49
- decls = RBS::Parser.parse_signature(rbs).then { _1[1] + _1[2] }
50
-
51
- RBS::Writer.new(out: out).write(decls)
52
-
53
- out.string
54
- end
55
- end
56
- end
57
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ImageClass
6
- class ImageClass
7
- # @param mogrify_options [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
8
- # @return [void]
9
- def initialize(mogrify_options:)
10
- @mogrify_options = mogrify_options
11
- end
12
-
13
- private
14
-
15
- # @!attribute [r] mogrify_options
16
- # @return [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
17
- attr_reader :mogrify_options
18
-
19
- # @return [Array<String>]
20
- def delegated_mogrify_methods
21
- image_instance_methods = MiniMagick::Image.instance_methods.to_set(&:to_s)
22
-
23
- mogrify_options.filter_map do |item|
24
- next if image_instance_methods.include?(item.normalized_name)
25
-
26
- item.to_method_signature("self")
27
- end.uniq
28
- end
29
- end
30
- end
31
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::SingletonMethod
6
- class SingletonMethod
7
- # @param tool_name [String]
8
- # @return [void]
9
- def initialize(tool_name:)
10
- @tool_name = tool_name
11
- end
12
-
13
- private
14
-
15
- # @!attribute [r] tool_name
16
- # @return [String]
17
- attr_reader :tool_name
18
- end
19
- end
20
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ToolInterface
6
- class ToolInterface
7
- # @param tool_name [String]
8
- # @param options [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
9
- # @return [void]
10
- def initialize(tool_name:, options:)
11
- @tool_name = tool_name
12
- @options = options
13
- end
14
-
15
- private
16
-
17
- # @!attribute [r] tool_name
18
- # @return [String]
19
- attr_reader :tool_name
20
- # @!attribute [r] options
21
- # @return [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
22
- attr_reader :options
23
- end
24
- end
25
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ToolSubclass
6
- class ToolSubclass
7
- # @param tool_name [String]
8
- # @return [void]
9
- def initialize(tool_name:)
10
- @tool_name = tool_name
11
- end
12
-
13
- private
14
-
15
- # @!attribute [r] tool_name
16
- # @return [String]
17
- attr_reader :tool_name
18
- end
19
- end
20
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builder
6
- class Builder
7
- # @return [String]
8
- def v5_0 # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
9
- tool_interface_methods = options_by_tool.map do |tool, options|
10
- Builders::ToolInterface.new(tool_name: tool, options: options).v5_0
11
- end.join("\n")
12
-
13
- tool_subclasses = options_by_tool.map do |tool, _|
14
- Builders::ToolSubclass.new(tool_name: tool).v5_0
15
- end.join("\n")
16
-
17
- singleton_methods = options_by_tool.map do |tool, _|
18
- Builders::SingletonMethod.new(tool_name: tool).v5_0
19
- end.join("\n")
20
-
21
- image_class = Builders::ImageClass.new(mogrify_options: mogrify_options).v5_0
22
-
23
- <<~RBS
24
- module MiniMagick
25
- #{tool_interface_methods}
26
-
27
- #{tool_subclasses}
28
-
29
- #{singleton_methods}
30
-
31
- #{image_class}
32
- end
33
- RBS
34
- end
35
- end
36
- end
37
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ImageClass
6
- class ImageClass
7
- # @return [String]
8
- def v5_0
9
- <<~RBS
10
- class Image
11
- def initialize: (_ToS input_path, ?Tempfile? tempfile) ?{ (Tool & _Mogrify[Tool]) -> void } -> void
12
- | ...
13
-
14
- def combine_options: () { (Tool & _Mogrify[Tool]) -> void } -> self
15
- | ...
16
-
17
- def composite: (instance other_image, ?String output_extension, ?untyped? mask) ?{ (Tool & _Composite[Tool]) -> void } -> instance
18
- | ...
19
-
20
- def identify: () ?{ (Tool & _Identify[Tool]) -> void } -> String
21
- | ...
22
-
23
- def mogrify: (?Integer? page) ?{ (Tool & _Mogrify[Tool]) -> void } -> self
24
- | ...
25
-
26
- #{delegated_mogrify_methods.join("\n")}
27
- end
28
- RBS
29
- end
30
- end
31
- end
32
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::SingletonMethod
6
- class SingletonMethod
7
- # @return [String]
8
- def v5_0
9
- interface_name = "_#{tool_name.capitalize}"
10
- args = "?errors: bool, ?warnings: bool, ?stdin: _ToS, ?timeout: Integer?, **untyped options"
11
-
12
- <<~RBS
13
- def self.#{tool_name}: (#{args}) -> (Tool & #{interface_name}[Tool])
14
- | (#{args}) { (Tool & #{interface_name}[Tool]) -> void } -> String
15
- | ...
16
- RBS
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ToolInterface
6
- class ToolInterface
7
- # @return [String]
8
- def v5_0
9
- tool_methods = options.map { _1.to_method_signature("[T]") }
10
- .uniq.join("\n")
11
-
12
- <<~RBS
13
- interface _#{tool_name.capitalize}[T]
14
- #{tool_methods}
15
- end
16
- RBS
17
- end
18
- end
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module Builders
5
- # RbsMiniMagick::Builders::ToolSubclass
6
- class ToolSubclass
7
- # @return [String]
8
- def v5_0
9
- <<~RBS
10
- class Tool
11
- class #{tool_name.capitalize} < Tool
12
- include _#{tool_name.capitalize}
13
- end
14
- end
15
- RBS
16
- end
17
- end
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- # RbsMiniMagick::Builders
5
- module Builders; end
6
- end
7
-
8
- require_relative "builders/builder"
9
- require_relative "builders/tool_interface"
10
- require_relative "builders/tool_subclass"
11
- require_relative "builders/singleton_method"
12
- require_relative "builders/image_class"
13
-
14
- require_relative "builders/v5_0/builder"
15
- require_relative "builders/v5_0/tool_interface"
16
- require_relative "builders/v5_0/tool_subclass"
17
- require_relative "builders/v5_0/singleton_method"
18
- require_relative "builders/v5_0/image_class"
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RbsMiniMagick
4
- module ImageMagick
5
- # RbsMiniMagick::ImageMagick::UsageParser
6
- class UsageParser
7
- # @param raw_usage [String]
8
- # @return [void]
9
- def initialize(raw_usage:)
10
- @raw_usage = raw_usage
11
- end
12
-
13
- # @return [Array<RbsMiniMagick::ImageMagick::CommandLineOption>]
14
- def run
15
- parse_raw_command_line_options
16
- .map { build_command_line_option(_1) }
17
- end
18
-
19
- private
20
-
21
- # @!attribute [r] raw_usage
22
- # @return [String]
23
- attr_reader :raw_usage
24
-
25
- # @return [Array<String>]
26
- def parse_raw_command_line_options
27
- raw_usage.split("\n").filter_map do |line|
28
- line.match(/^\s*(-\S+(?: \S+)*)\s*/)&.then { _1[1] }
29
- end
30
- end
31
-
32
- # @param raw_string [String]
33
- # @return [RbsMiniMagick::ImageMagick::CommandLineOption]
34
- def build_command_line_option(raw_string)
35
- splited = raw_string.split
36
-
37
- CommandLineOption.new(
38
- name: String(splited.first),
39
- args: splited[1..] || []
40
- )
41
- end
42
- end
43
- end
44
- end