bidi2pdf 0.1.1 → 0.1.3

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -0
  3. data/CHANGELOG.md +40 -2
  4. data/README.md +10 -0
  5. data/Rakefile +2 -0
  6. data/cliff.toml +138 -0
  7. data/docker/Dockerfile.chromedriver +33 -0
  8. data/docker/docker-compose.yml +7 -0
  9. data/docker/entrypoint.sh +3 -0
  10. data/docker/nginx/default.conf +6 -0
  11. data/lib/bidi2pdf/bidi/add_headers_interceptor.rb +1 -1
  12. data/lib/bidi2pdf/bidi/auth_interceptor.rb +1 -1
  13. data/lib/bidi2pdf/bidi/client.rb +62 -146
  14. data/lib/bidi2pdf/bidi/command_manager.rb +82 -0
  15. data/lib/bidi2pdf/bidi/connection_manager.rb +34 -0
  16. data/lib/bidi2pdf/bidi/session.rb +30 -22
  17. data/lib/bidi2pdf/chromedriver_manager.rb +40 -16
  18. data/lib/bidi2pdf/cli.rb +147 -18
  19. data/lib/bidi2pdf/launcher.rb +19 -6
  20. data/lib/bidi2pdf/version.rb +1 -1
  21. data/sig/bidi2pdf/bidi/add_headers_interceptor.rbs +20 -0
  22. data/sig/bidi2pdf/bidi/auth_interceptor.rbs +17 -0
  23. data/sig/bidi2pdf/bidi/browser.rbs +38 -0
  24. data/sig/bidi2pdf/bidi/browser_tab.rbs +42 -0
  25. data/sig/bidi2pdf/bidi/client.rbs +72 -0
  26. data/sig/bidi2pdf/bidi/event_manager.rbs +29 -0
  27. data/sig/bidi2pdf/bidi/network_event.rbs +51 -0
  28. data/sig/bidi2pdf/bidi/network_events.rbs +55 -0
  29. data/sig/bidi2pdf/bidi/print_parameters_validator.rbs +44 -0
  30. data/sig/bidi2pdf/bidi/session.rbs +52 -0
  31. data/sig/bidi2pdf/bidi/user_context.rbs +50 -0
  32. data/sig/bidi2pdf/bidi/web_socket_dispatcher.rbs +53 -0
  33. data/sig/bidi2pdf/chromedriver_manager.rbs +42 -0
  34. data/sig/bidi2pdf/cli.rbs +21 -0
  35. data/sig/bidi2pdf/launcher.rbs +38 -0
  36. data/sig/bidi2pdf/process_tree.rbs +27 -0
  37. data/sig/bidi2pdf/session_runner.rbs +51 -0
  38. data/sig/bidi2pdf/utils.rbs +5 -0
  39. data/sig/vendor/thor.rbs +13 -0
  40. data/tasks/changelog.rake +29 -0
  41. data/tasks/generate_rbs.rake +64 -0
  42. metadata +48 -8
@@ -0,0 +1,38 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class Browser
4
+ @url: String
5
+ @chromedriver_manager: Bidi2pdf::ChromedriverManager
6
+ @browser: untyped
7
+ @timeout: Integer
8
+ @debug: bool
9
+
10
+ attr_reader browser: untyped
11
+ attr_reader timeout: Integer
12
+
13
+ def initialize: (
14
+ url: String,
15
+ chromedriver_manager: Bidi2pdf::ChromedriverManager,
16
+ ?timeout: Integer,
17
+ ?debug: bool
18
+ ) -> void
19
+
20
+ def navigate: (?reload: bool) -> void
21
+
22
+ def current_url: -> String
23
+
24
+ def wait_until: [T] (
25
+ ?timeout: Integer,
26
+ ?message: String
27
+ ) { () -> T? } -> T
28
+
29
+ def close: () -> void
30
+
31
+ private
32
+
33
+ def connect: () -> untyped
34
+
35
+ def setup_browser: () -> untyped
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,42 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class BrowserTab
4
+ @browser: Bidi2pdf::Bidi::Browser
5
+ @tab_id: String?
6
+ @session_id: String?
7
+ @timeout: Integer
8
+
9
+ attr_reader browser: Bidi2pdf::Bidi::Browser
10
+ attr_reader tab_id: String?
11
+ attr_reader session_id: String?
12
+
13
+ def initialize: (
14
+ browser: Bidi2pdf::Bidi::Browser,
15
+ ?tab_id: String?,
16
+ ?timeout: Integer
17
+ ) -> void
18
+
19
+ def navigate_to: (String url) -> void
20
+
21
+ def execute_script: [T] (String script, *untyped args) -> T
22
+
23
+ def wait_for_navigation: (?timeout: Integer) -> void
24
+
25
+ def wait_for_element: (
26
+ selector: String,
27
+ ?visible: bool,
28
+ ?timeout: Integer
29
+ ) -> untyped
30
+
31
+ def capture_screenshot: (?path: String?) -> String
32
+
33
+ def close: () -> void
34
+
35
+ private
36
+
37
+ def ensure_tab_active: () -> void
38
+
39
+ def connect_to_tab: () -> String?
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,72 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class Client
4
+ @next_id_mutex: Mutex
5
+ @ws_url: untyped
6
+
7
+ @id: untyped
8
+
9
+ @pending_responses: Hash[String, Thread::Queue]
10
+
11
+ @connected: untyped
12
+
13
+ @connection_mutex: Mutex
14
+
15
+ @send_cmd_mutex: Mutex
16
+
17
+ @connection_cv: untyped
18
+
19
+ @started: untyped
20
+
21
+ @socket: untyped
22
+
23
+ @dispatcher: untyped
24
+
25
+ include Bidi2pdf::Utils
26
+
27
+ attr_reader ws_url: untyped
28
+
29
+ def initialize: (untyped ws_url) -> void
30
+
31
+ def start: () -> untyped
32
+
33
+ def started?: () -> untyped
34
+
35
+ def wait_until_open: (?timeout: untyped) -> untyped
36
+
37
+ def send_cmd: (untyped method, ?::Hash[untyped, untyped] params) -> untyped
38
+
39
+ # rubocop:disable Metrics/AbcSize
40
+ def send_cmd_and_wait: (untyped method, ?::Hash[untyped, untyped] params, ?timeout: untyped) ?{ (untyped) -> untyped } -> untyped
41
+
42
+ # Event API for external consumers
43
+ def on_message: () { () -> untyped } -> untyped
44
+
45
+ def on_open: () { () -> untyped } -> untyped
46
+
47
+ def on_close: () { () -> untyped } -> untyped
48
+
49
+ def on_error: () { () -> untyped } -> untyped
50
+
51
+ def on_event: (*untyped names) { () -> untyped } -> untyped
52
+
53
+ def remove_message_listener: (untyped block) -> untyped
54
+
55
+ def remove_event_listener: (*untyped names) { () -> untyped } -> untyped
56
+
57
+ def add_headers_interceptor: (context: untyped, url_patterns: untyped, headers: untyped) -> untyped
58
+
59
+ def add_auth_interceptor: (context: untyped, url_patterns: untyped, username: untyped, password: untyped) -> untyped
60
+
61
+ private
62
+
63
+ def next_id: () -> untyped
64
+
65
+ def handle_open: () -> untyped
66
+
67
+ def handle_response_to_cmd: (untyped data) -> untyped
68
+
69
+ def redact_sensitive_fields: (untyped obj, ?::Array[untyped] sensitive_keys) -> untyped
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,29 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class EventManager
4
+ @browser: Bidi2pdf::Bidi::Browser
5
+ @listeners: Hash[String, Array[Proc]]
6
+ @active: bool
7
+
8
+ def initialize: (browser: Bidi2pdf::Bidi::Browser) -> void
9
+
10
+ def on: (String event_name) { (Hash[String, untyped]) -> void } -> void
11
+
12
+ def off: (String event_name) -> void
13
+
14
+ def emit: (String event_name, Hash[String, untyped] params) -> void
15
+
16
+ def start_listening: () -> void
17
+
18
+ def stop_listening: () -> void
19
+
20
+ private
21
+
22
+ def register_browser_events: () -> void
23
+
24
+ def handle_event: (String event_name, Hash[String, untyped] params) -> void
25
+
26
+ def process_event: (String event_name, Hash[String, untyped] params) -> void
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,51 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class NetworkEvent
4
+ # Request data
5
+ @request_id: String
6
+ @url: String
7
+ @method: String
8
+ @headers: Hash[String, String]
9
+ @post_data: String?
10
+
11
+ # Response data
12
+ @response_status: Integer?
13
+ @response_headers: Hash[String, String]?
14
+ @response_body: String?
15
+
16
+ # Timing information
17
+ @timestamp: Float
18
+ @timing: Hash[Symbol, Float]?
19
+
20
+ attr_reader request_id: String
21
+ attr_reader url: String
22
+ attr_reader method: String
23
+ attr_reader headers: Hash[String, String]
24
+ attr_reader post_data: String?
25
+ attr_reader response_status: Integer?
26
+ attr_reader response_headers: Hash[String, String]?
27
+ attr_reader response_body: String?
28
+ attr_reader timestamp: Float
29
+ attr_reader timing: Hash[Symbol, Float]?
30
+
31
+ def initialize: (
32
+ request_id: String,
33
+ url: String,
34
+ method: String,
35
+ headers: Hash[String, String],
36
+ ?post_data: String?,
37
+ ?timestamp: Float?
38
+ ) -> void
39
+
40
+ def add_response: (
41
+ status: Integer,
42
+ headers: Hash[String, String],
43
+ ?body: String?
44
+ ) -> void
45
+
46
+ def add_timing: (Hash[Symbol, Float] timing_data) -> void
47
+
48
+ def completed?: () -> bool
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,55 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class NetworkEvents
4
+ include Enumerable[NetworkEvent]
5
+
6
+ @events: Hash[String, NetworkEvent]
7
+ @browser: Bidi2pdf::Bidi::Browser?
8
+ @event_manager: Bidi2pdf::Bidi::EventManager?
9
+ @recording: bool
10
+ @filters: Array[Proc]
11
+
12
+ attr_reader events: Hash[String, NetworkEvent]
13
+ attr_reader recording: bool
14
+
15
+ def initialize: (?browser: Bidi2pdf::Bidi::Browser?) -> void
16
+
17
+ def start_recording: (?browser: Bidi2pdf::Bidi::Browser?) -> void
18
+
19
+ def stop_recording: () -> void
20
+
21
+ def add_filter: () { (NetworkEvent) -> bool } -> void
22
+
23
+ def clear_filters: () -> void
24
+
25
+ def clear: () -> void
26
+
27
+ def size: () -> Integer
28
+
29
+ def []: (String request_id) -> NetworkEvent?
30
+
31
+ def each: () { (NetworkEvent) -> void } -> self
32
+ | () -> Enumerator[NetworkEvent, self]
33
+
34
+ def find_by_url: (String url_pattern) -> Array[NetworkEvent]
35
+
36
+ def find_by_method: (String method) -> Array[NetworkEvent]
37
+
38
+ def completed_requests: () -> Array[NetworkEvent]
39
+
40
+ def pending_requests: () -> Array[NetworkEvent]
41
+
42
+ def to_a: () -> Array[NetworkEvent]
43
+
44
+ private
45
+
46
+ def setup_event_listeners: () -> void
47
+
48
+ def handle_request_event: (Hash[String, untyped] params) -> void
49
+
50
+ def handle_response_event: (Hash[String, untyped] params) -> void
51
+
52
+ def handle_loading_finished_event: (Hash[String, untyped] params) -> void
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,44 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class PrintParametersValidator
4
+ # Valid print parameter configurations
5
+ DEFAULT_PARAMETERS: Hash[Symbol, untyped]
6
+ ALLOWED_PAGE_RANGES_FORMATS: Array[String]
7
+ ALLOWED_MARGIN_UNITS: Array[String]
8
+ ALLOWED_PAPER_FORMATS: Array[String]
9
+ ALLOWED_ORIENTATIONS: Array[String]
10
+
11
+ @parameters: Hash[Symbol, untyped]
12
+ @errors: Array[String]
13
+
14
+ attr_reader errors: Array[String]
15
+ attr_reader parameters: Hash[Symbol, untyped]
16
+
17
+ def initialize: (Hash[Symbol, untyped] parameters) -> void
18
+
19
+ def validate: () -> bool
20
+
21
+ def valid?: () -> bool
22
+
23
+ private
24
+
25
+ def validate_boolean: (Symbol key) -> void
26
+
27
+ def validate_number: (Symbol key, ?min: Numeric?, ?max: Numeric?) -> void
28
+
29
+ def validate_string: (Symbol key) -> void
30
+
31
+ def validate_enum: (Symbol key, Array[String] allowed_values) -> void
32
+
33
+ def validate_margins: () -> void
34
+
35
+ def validate_page_ranges: () -> void
36
+
37
+ def validate_paper_size: () -> void
38
+
39
+ def normalize_parameters: () -> void
40
+
41
+ def add_error: (String message) -> void
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,52 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class Session
4
+ @browser: Bidi2pdf::Bidi::Browser
5
+ @session_id: String?
6
+ @contexts: Array[String]
7
+ @timeout: Integer
8
+ @event_manager: Bidi2pdf::Bidi::EventManager?
9
+ @network_events: Bidi2pdf::Bidi::NetworkEvents?
10
+
11
+ attr_reader browser: Bidi2pdf::Bidi::Browser
12
+ attr_reader session_id: String?
13
+ attr_reader contexts: Array[String]
14
+
15
+ def initialize: (
16
+ browser: Bidi2pdf::Bidi::Browser,
17
+ ?session_id: String?,
18
+ ?timeout: Integer
19
+ ) -> void
20
+
21
+ def create: () -> String
22
+
23
+ def attach: (session_id: String) -> String
24
+
25
+ def detach: () -> void
26
+
27
+ def execute_command: [T] (String method, ?Hash[Symbol, untyped] params) -> T
28
+
29
+ def navigate_to: (String url) -> void
30
+
31
+ def evaluate: [T] (String script) -> T
32
+
33
+ def wait_for_load: (?timeout: Integer?) -> void
34
+
35
+ def network_events: () -> Bidi2pdf::Bidi::NetworkEvents
36
+
37
+ def capture_screenshot: (?path: String?) -> String
38
+
39
+ def print_to_pdf: (
40
+ ?Hash[Symbol, untyped] parameters
41
+ ) -> String
42
+
43
+ def close: () -> void
44
+
45
+ private
46
+
47
+ def ensure_session: () -> String
48
+
49
+ def setup_event_listeners: () -> void
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,50 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class UserContext
4
+ @browser: Bidi2pdf::Bidi::Browser
5
+ @context_id: String
6
+ @session_id: String?
7
+ @event_manager: Bidi2pdf::Bidi::EventManager?
8
+ @network_events: Bidi2pdf::Bidi::NetworkEvents?
9
+ @closed: bool
10
+
11
+ attr_reader context_id: String
12
+ attr_reader browser: Bidi2pdf::Bidi::Browser
13
+ attr_reader session_id: String?
14
+
15
+ def initialize: (
16
+ browser: Bidi2pdf::Bidi::Browser,
17
+ context_id: String,
18
+ ?session_id: String?
19
+ ) -> void
20
+
21
+ def create_session: () -> String
22
+
23
+ def attach_session: (session_id: String) -> String
24
+
25
+ def execute_command: [T] (String method, ?Hash[Symbol, untyped] params) -> T
26
+
27
+ def navigate_to: (String url) -> void
28
+
29
+ def evaluate: [T] (String script) -> T
30
+
31
+ def wait_for_load: (?timeout: Integer?) -> void
32
+
33
+ def network_events: () -> Bidi2pdf::Bidi::NetworkEvents
34
+
35
+ def capture_screenshot: (?path: String?) -> String
36
+
37
+ def print_to_pdf: (?Hash[Symbol, untyped] parameters) -> String
38
+
39
+ def close: () -> void
40
+
41
+ def closed?: () -> bool
42
+
43
+ private
44
+
45
+ def ensure_open: () -> void
46
+
47
+ def setup_event_listeners: () -> void
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,53 @@
1
+ module Bidi2pdf
2
+ module Bidi
3
+ class WebSocketDispatcher
4
+ @url: String
5
+ @socket: WebSocket::Driver
6
+ @connection: TCPSocket
7
+ @pending_requests: Hash[Integer, Concurrent::Promises::ResolvableFuture]
8
+ @message_id: Integer
9
+ @listeners: Hash[String, Array[Proc]]
10
+ @thread: Thread?
11
+ @mutex: Mutex
12
+ @connected: bool
13
+ @logger: Logger?
14
+
15
+ attr_reader url: String
16
+ attr_reader connected: bool
17
+
18
+ def initialize: (String url, ?logger: Logger?) -> void
19
+
20
+ def connect: () -> bool
21
+
22
+ def disconnect: () -> void
23
+
24
+ def send_command: [T] (String method, ?Hash[Symbol, untyped] params) -> T
25
+
26
+ def send_message: (Hash[Symbol, untyped] message) -> Integer
27
+
28
+ def add_event_listener: (String event_name) { (Hash[String, untyped]) -> void } -> void
29
+
30
+ def remove_event_listener: (String event_name, ?Proc? callback) -> void
31
+
32
+ def connected?: () -> bool
33
+
34
+ private
35
+
36
+ def generate_message_id: () -> Integer
37
+
38
+ def create_socket: () -> WebSocket::Driver
39
+
40
+ def handle_open: () -> void
41
+
42
+ def handle_message: (String data) -> void
43
+
44
+ def handle_close: () -> void
45
+
46
+ def handle_error: (Exception error) -> void
47
+
48
+ def dispatch_event: (String event_name, Hash[String, untyped] params) -> void
49
+
50
+ def listen_for_messages: () -> void
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,42 @@
1
+ module Bidi2pdf
2
+ class ChromedriverManager
3
+ @port: Integer
4
+ @headless: bool
5
+ @session: untyped
6
+ @pid: Integer?
7
+
8
+ attr_reader port: Integer
9
+ attr_reader pid: Integer?
10
+ attr_reader session: untyped
11
+
12
+ def initialize: (?port: Integer, ?headless: bool) -> void
13
+
14
+ def start: () -> self
15
+
16
+ def stop: (?timeout: Integer) -> bool
17
+
18
+ private
19
+
20
+ # rubocop:disable Metrics/AbcSize
21
+ def detect_zombie_processes: () -> Array[Integer]?
22
+
23
+ def debug_show_all_children: () -> void
24
+
25
+ def close_session: () -> void
26
+
27
+ def term_chromedriver: () -> bool
28
+
29
+ def kill_chromedriver: (?timeout: Integer) -> bool
30
+
31
+ def build_cmd: () -> Array[String]
32
+
33
+ def update_chromedriver: () -> void
34
+
35
+ # rubocop:disable Metrics/AbcSize
36
+ def parse_port_from_output: (IO io, ?timeout: Integer) -> Integer?
37
+
38
+ def process_alive?: (?pid: Integer?) -> bool
39
+
40
+ def wait_until_chromedriver_ready: (?timeout: Integer) -> bool
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ module Bidi2pdf
2
+ class CLI < Thor
3
+ # rubocop:disable Layout/BeginEndAlignment
4
+ @launcher: untyped
5
+
6
+ def render: () -> untyped
7
+
8
+ private
9
+
10
+ # rubocop:disable Metrics/AbcSize
11
+ def launcher: () -> untyped
12
+
13
+ def configure: () -> untyped
14
+
15
+ def log_level: () -> untyped
16
+
17
+ def parse_key_values: (untyped pairs) -> untyped
18
+
19
+ def parse_auth: (untyped auth_string) -> ::Array[untyped]
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ module Bidi2pdf
2
+ class Launcher
3
+ @url: untyped
4
+
5
+ @port: untyped
6
+
7
+ @headless: untyped
8
+
9
+ @output: untyped
10
+
11
+ @cookies: untyped
12
+
13
+ @headers: untyped
14
+
15
+ @auth: untyped
16
+
17
+ @manager: untyped
18
+
19
+ @wait_window_loaded: untyped
20
+
21
+ @wait_network_idle: untyped
22
+
23
+ @print_options: untyped
24
+
25
+ @remote_browser_url: untyped
26
+
27
+ # rubocop:disable Metrics/ParameterLists
28
+ def initialize: (url: untyped, output: untyped, cookies: untyped, headers: untyped, auth: untyped, ?headless: bool, ?port: ::Integer, ?wait_window_loaded: bool, ?wait_network_idle: bool, ?print_options: ::Hash[untyped, untyped], ?remote_browser_url: untyped?) -> void
29
+
30
+ def launch: () -> untyped
31
+
32
+ def stop: () -> untyped
33
+
34
+ private
35
+
36
+ def session: () -> untyped
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module Bidi2pdf
2
+ class ProcessTree
3
+ @root_pid: untyped
4
+
5
+ @process_map: untyped
6
+
7
+ include Sys
8
+
9
+ def initialize: (?untyped? root_pid) -> void
10
+
11
+ def children: (untyped of_pid) -> (::Array[untyped] | untyped)
12
+
13
+ def traverse: () { () -> untyped } -> untyped
14
+
15
+ private
16
+
17
+ def print_handler: (untyped process, untyped level) -> untyped
18
+
19
+ def build_process_map: () -> untyped
20
+
21
+ def connect_children: () -> untyped
22
+
23
+ def root_pids: () -> (::Array[untyped] | untyped)
24
+
25
+ def traverse_branch: (untyped pid, ?::Integer level) { () -> untyped } -> (nil | untyped)
26
+ end
27
+ end
@@ -0,0 +1,51 @@
1
+ module Bidi2pdf
2
+ class SessionRunner
3
+ @session: untyped
4
+
5
+ @url: untyped
6
+
7
+ @output: untyped
8
+
9
+ @cookies: untyped
10
+
11
+ @headers: untyped
12
+
13
+ @auth: untyped
14
+
15
+ @wait_window_loaded: untyped
16
+
17
+ @wait_network_idle: untyped
18
+
19
+ @print_options: untyped
20
+
21
+ @window: untyped
22
+
23
+ @tab: untyped
24
+
25
+ @uri: untyped
26
+
27
+ def initialize: (session: untyped, url: untyped, output: untyped, ?cookies: ::Hash[untyped, untyped], ?headers: ::Hash[untyped, untyped], ?auth: ::Hash[untyped, untyped], ?wait_window_loaded: bool, ?wait_network_idle: bool, ?print_options: ::Hash[untyped, untyped]) -> void
28
+
29
+ def run: () -> untyped
30
+
31
+ private
32
+
33
+ def setup_browser: () -> untyped
34
+
35
+ def add_cookies: (untyped tab) -> untyped
36
+
37
+ def add_headers: () -> untyped
38
+
39
+ def add_basic_auth: () -> (nil | untyped)
40
+
41
+ def run_flow: () -> untyped
42
+
43
+ def uri: () -> untyped
44
+
45
+ def domain: () -> untyped
46
+
47
+ def source_origin: () -> untyped
48
+
49
+ def url_patterns: () -> ::Array[{ type: "pattern", protocol: untyped, hostname: untyped, port: untyped }]
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ module Bidi2pdf
2
+ module Utils
3
+ def self?.timed: (untyped operation_name) { () -> untyped } -> untyped
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class Thor
2
+ def self.desc: (String name, String description) -> void
3
+
4
+ def self.option: (Symbol name, ?Hash[Symbol, untyped] options) -> void
5
+
6
+ def self.long_desc: (String description, ?Hash[Symbol, untyped] options) -> void
7
+
8
+ interface _Command
9
+ def execute: (*untyped) -> untyped
10
+ end
11
+
12
+ def initialize: (?Hash[Symbol, untyped] options) -> void
13
+ end