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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +15 -1
- data/lib/rbs_mini_magick/builder.rb +47 -0
- data/lib/rbs_mini_magick/flows/major5_minor0/image_class.rb +55 -0
- data/lib/rbs_mini_magick/flows/major5_minor0/tool_interface.rb +50 -0
- data/lib/rbs_mini_magick/flows/major5_minor0/tool_singleton.rb +39 -0
- data/lib/rbs_mini_magick/flows/major5_minor0/tool_subclass.rb +40 -0
- data/lib/rbs_mini_magick/flows/major5_minor0.rb +38 -0
- data/lib/rbs_mini_magick/flows/state.rb +68 -0
- data/lib/rbs_mini_magick/flows.rb +9 -0
- data/lib/rbs_mini_magick/generator.rb +4 -4
- data/lib/rbs_mini_magick/image_magick/{command_line_option.rb → option.rb} +5 -8
- data/lib/rbs_mini_magick/image_magick/tool_usage.rb +52 -0
- data/lib/rbs_mini_magick/image_magick.rb +5 -21
- data/lib/rbs_mini_magick/version.rb +1 -1
- data/lib/rbs_mini_magick.rb +7 -6
- metadata +12 -15
- data/lib/rbs_mini_magick/builders/builder.rb +0 -57
- data/lib/rbs_mini_magick/builders/image_class.rb +0 -31
- data/lib/rbs_mini_magick/builders/singleton_method.rb +0 -20
- data/lib/rbs_mini_magick/builders/tool_interface.rb +0 -25
- data/lib/rbs_mini_magick/builders/tool_subclass.rb +0 -20
- data/lib/rbs_mini_magick/builders/v5_0/builder.rb +0 -37
- data/lib/rbs_mini_magick/builders/v5_0/image_class.rb +0 -32
- data/lib/rbs_mini_magick/builders/v5_0/singleton_method.rb +0 -20
- data/lib/rbs_mini_magick/builders/v5_0/tool_interface.rb +0 -20
- data/lib/rbs_mini_magick/builders/v5_0/tool_subclass.rb +0 -19
- data/lib/rbs_mini_magick/builders.rb +0 -18
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f035353c1efe52e97b2951cbb68d0a3c14b2189dff3dd8451ab7c9e417b7105a
|
4
|
+
data.tar.gz: b50d67b49e4b704aaac3436f12587d782aed6b1c31db3e0bf965cb773770fe33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a091a651834b604a18ebbfb3bce50c6393ba5d7fa79e9450a1416bd74eba96884cd064315344a5d96652d136f247b5044e4fa62c475ee30038efd3e20318cc1
|
7
|
+
data.tar.gz: 5f023c4f6f82cb4275967c11e53b833bb71e0f8d45ec5e7e404beb926daaebf65ff118394fd1180a68e2a64e94dccb9163628452d4b08c35163c1a8099d21dc4
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# RbsMiniMagick
|
2
2
|
|
3
|
+
[](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
|
-
|
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
|
@@ -3,11 +3,11 @@
|
|
3
3
|
module RbsMiniMagick
|
4
4
|
# RbsMiniMagick::Generator
|
5
5
|
class Generator
|
6
|
-
# @param mini_magick_version [
|
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
|
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 =
|
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 [
|
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::
|
6
|
-
class
|
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
|
-
# @
|
21
|
-
|
22
|
-
|
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"
|
data/lib/rbs_mini_magick.rb
CHANGED
@@ -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.
|
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-
|
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/
|
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/
|
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
|