simple_input 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e065b4936a53b4c1e0b9f2332af8209ee1bd533843df9586bf79c20fb7c57674
4
+ data.tar.gz: c66dc78ffed023c2f649c3e90ac8ebec510535241b2dab29b2ddaa7d9d41c843
5
+ SHA512:
6
+ metadata.gz: 4d0732167d96ad22769951c189cc3885b3d5e5eecb3fdea3f0b882f538818fe7f1ba31c7b94dce35ad27988d361c73dc02929895b115bf4a1ff323d57ecc9b6d
7
+ data.tar.gz: 1d9b4eb5f0fc7f9d6ea0f185a9d5de5c19a827d91e8ae3ac6cfa98ddff3bb7f0c3254c26ed4d0ad80dec7b837cd51405bc03b90e691aff521f001ef55547a81a
@@ -0,0 +1,14 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'sorbet-runtime'
5
+
6
+ # 1. デフォルトバリデーター
7
+ module DefaultValidators
8
+ extend T::Sig
9
+
10
+ module_function
11
+
12
+ sig { params(val: String).returns(T.nilable(String)) }
13
+ def not_empty(val); val.empty? ? '入力してください' : nil; end
14
+ end
@@ -0,0 +1,83 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'sorbet-runtime'
5
+ require 'stringio'
6
+
7
+ # 2. 本体
8
+ class Input
9
+ extend T::Sig
10
+
11
+ ValidatorProc = T.type_alias { T.proc.params(arg0: String).returns(T.nilable(String)) }
12
+ ValidatorType = T.type_alias { T.any(Symbol, ValidatorProc) }
13
+
14
+ sig { returns(Input) }
15
+ def self.new_input; new; end
16
+
17
+ private_class_method :new
18
+
19
+ sig { void }
20
+ def initialize
21
+ @reader = T.let($stdin, T.any(IO, StringIO))
22
+ @writer = T.let($stdout, T.any(IO, StringIO))
23
+ @title = T.let('', String)
24
+ @prompt = T.let('> ', String)
25
+ @validators = T.let([], T::Array[ValidatorProc])
26
+ @validator_provider = T.let(DefaultValidators, T.untyped)
27
+ end
28
+
29
+ sig { params(text: String).returns(T.self_type) }
30
+ def title(text); @title = text; self; end
31
+
32
+ sig { params(text: String).returns(T.self_type) }
33
+ def prompt(text); @prompt = text; self; end
34
+
35
+ sig { params(provider: T.untyped).returns(T.self_type) }
36
+ def with_validators(provider); @validator_provider = provider; self; end
37
+
38
+ sig { params(validator: T.nilable(ValidatorType), block: T.nilable(ValidatorProc)).returns(T.self_type) }
39
+ def validate(validator = nil, &block)
40
+ if block
41
+ @validators << block
42
+ elsif validator.is_a?(Proc)
43
+ @validators << validator
44
+ elsif validator.is_a?(Symbol)
45
+ unless @validator_provider.respond_to?(validator)
46
+ raise ArgumentError, "Unknown validator :#{validator} in #{@validator_provider}"
47
+ end
48
+
49
+ @validators << @validator_provider.method(validator).to_proc
50
+ end
51
+ self
52
+ end
53
+
54
+ sig { returns(String) }
55
+ def run
56
+ loop do
57
+ @writer.puts "\e[1m#{@title}\e[0m" unless @title.empty?
58
+ @writer.print @prompt
59
+
60
+ input_data = @reader.gets
61
+ return '' if input_data.nil? # Ctrl-D
62
+
63
+ val = input_data.chomp.strip
64
+ error = T.let(nil, T.nilable(String))
65
+ @validators.each { |v| break if (error = v.call(val)) }
66
+
67
+ return val unless error
68
+
69
+ # 視認性のための余白
70
+ @writer.puts ''
71
+ @writer.puts "\e[31m! #{error}\e[0m"
72
+ @writer.puts ''
73
+ end
74
+ rescue Interrupt # Ctrl-C
75
+ @writer.puts "\n\e[2m(canceled)\e[0m"
76
+ exit 0
77
+ end
78
+
79
+ private
80
+
81
+ sig { params(r: T.any(IO, StringIO), w: T.any(IO, StringIO)).returns(T.self_type) }
82
+ def with_context(r, w); @reader = r; @writer = w; self; end
83
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimplePrompt
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "simple_prompt/version"
4
+ require_relative "simple_prompt/default_validators"
5
+ require_relative "simple_prompt/input"
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_input
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - tsu-na-gu
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: sorbet-runtime
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 0.5.100
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.5.100
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.12'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.12'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rubocop
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.50'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.50'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rubocop-rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rubocop-sorbet
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.6.0
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.6.0
82
+ - !ruby/object:Gem::Dependency
83
+ name: sorbet
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.5.100
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.5.100
96
+ description: A simple input library for Ruby, inspired by golang's huh! library's
97
+ input component.
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files: []
101
+ files:
102
+ - lib/simple_prompt.rb
103
+ - lib/simple_prompt/default_validators.rb
104
+ - lib/simple_prompt/input.rb
105
+ - lib/simple_prompt/version.rb
106
+ homepage: https://github.com/tsu-na-gu/simple-input
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '3.4'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubygems_version: 4.0.6
125
+ specification_version: 4
126
+ summary: A simple input library for Ruby
127
+ test_files: []