rbs_mini_magick 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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