search_ui 0.0.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: 37d829ad8fbcc4b4e0ae9e986f10b156edea28650062f1e53d79c767fe07dbc1
4
+ data.tar.gz: 851f87e4e5731d1b515a6354cc13a95820007d179acdee7621009b318378a501
5
+ SHA512:
6
+ metadata.gz: 1beb2eb6a53971c40ab62c898ef5c78fe9c59a39e5b8fa4bd61dedf2c9271b94ad8379fdbbb54a2f50a359e979e9cccc43e0585ebdb8a2103a782685e3fcc0a8
7
+ data.tar.gz: 0270c1ec8d11b71335ea880c3fc82c4b919f21b97d0e76267cb3f8766a459f130c57a73344e1697644555761145957b78e6e23b83b23a8977e8f7e87031953be
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ .*.sw[pon]
2
+ .AppleDouble
3
+ .DS_Store
4
+ .byebug_history
5
+ .rvmrc
6
+ Gemfile.lock
7
+ coverage
8
+ pkg
9
+ tags
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2020 Florian Frank
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
16
+ CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
17
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # SearchUI - Searching things in console
2
+
3
+ ## Description
4
+
5
+ This library allows a user to search an array of objects
6
+ interactively in the console by matching the pattern a user inputs to an
7
+ array of objects and pick one of the remaining objects.
8
+
9
+ ## Download
10
+
11
+ The homepage of this library is located at http://github.com/flori/search\_ui
12
+
13
+ ## Author
14
+
15
+ Florian Frank mailto:flori@ping.de
16
+
17
+ ## License
18
+
19
+ This software is licensed under the X11 (or MIT) license:
20
+ http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ require 'gem_hadar'
4
+
5
+ GemHadar do
6
+ name 'search_ui'
7
+ author 'Florian Frank'
8
+ email 'flori@ping.de'
9
+ homepage "http://flori.github.com/#{name}"
10
+ summary 'Library to provide a user interface for searching in a console'
11
+ description 'This library allows a user to search an array of objects
12
+ interactively in the console by matching the pattern a user inputs to an
13
+ array of objects and pick one of the remaining objects.'
14
+
15
+ ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', 'coverage', '.rvmrc',
16
+ '.AppleDouble', 'tags', '.byebug_history', '.DS_Store'
17
+ readme 'README.md'
18
+ title "#{name.camelize} -- Search User Interface"
19
+
20
+ executables << 'search_it'
21
+
22
+ required_ruby_version '>= 2.0'
23
+ dependency 'tins', '~>1.0'
24
+ dependency 'term-ansicolor', '~>1.0'
25
+ dependency 'amatch', '~>0.0'
26
+ development_dependency 'simplecov', '~>0.0'
27
+ licenses << 'MIT'
28
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/bin/search_it ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'search_ui'
4
+ require 'tins/terminal'
5
+ require 'amatch'
6
+ include SearchUI
7
+
8
+
9
+ choices = ARGV
10
+ exit if choices.empty?
11
+
12
+ found = Search.new(
13
+ match: -> answer {
14
+ matcher = Amatch::PairDistance.new(answer.downcase)
15
+ matches = ARGV.map { |n| [ n, -matcher.similar(n.downcase) ] }.
16
+ select { |_, s| s < 0 }.sort_by(&:last).map(&:first)
17
+ matches.empty? and matches = choices
18
+ matches.first(Tins::Terminal.lines - 1)
19
+ },
20
+ query: -> _answer, matches, selector {
21
+ matches.each_with_index.
22
+ map { |m, i| i == selector ? "→ " + Search.on_blue(m) : " " + m } * ?\n
23
+ },
24
+ found: -> _answer, matches, selector {
25
+ matches[selector]
26
+ },
27
+ output: STDOUT
28
+ ).start and puts found
data/lib/search_ui.rb ADDED
@@ -0,0 +1,6 @@
1
+
2
+ module SearchUI
3
+ end
4
+
5
+ require 'search_ui/version'
6
+ require 'search_ui/search'
@@ -0,0 +1,90 @@
1
+ require 'term/ansicolor'
2
+
3
+ class SearchUI::Search
4
+ include Term::ANSIColor
5
+ extend Term::ANSIColor
6
+
7
+ def initialize(
8
+ match:,
9
+ query:,
10
+ found:,
11
+ output: STDOUT,
12
+ prompt: 'Search? %s'
13
+ )
14
+ @match = match
15
+ @query = query
16
+ @found = found
17
+ @output = output
18
+ @prompt = prompt
19
+ @selector = 0
20
+ @max_selector = nil
21
+ @answer = ''
22
+ end
23
+
24
+ def start
25
+ @output.print reset
26
+ @matches = @match.(@answer)
27
+ @selector = [ 0, [ @selector, @matches.size - 1 ].min ].max
28
+ result = @query.(@answer, @matches, @selector)
29
+ @output.print clear_screen
30
+ @output.print move_home { ?\n + result }
31
+ loop do
32
+ @output.print move_home { @prompt % @answer }
33
+ case getc
34
+ when true
35
+ @output.print clear_screen, move_home, reset
36
+ if result = @found.(@answer, @matches, @selector)
37
+ return result
38
+ else
39
+ return nil
40
+ end
41
+ when false
42
+ return nil
43
+ end
44
+ @matches = @match.(@answer)
45
+ @selector = [ 0, [ @selector, @matches.size - 1 ].min ].max
46
+ result = @query.(@answer, @matches, @selector)
47
+ @output.print clear_screen
48
+ @output.print move_home { ?\n + result }
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def getc
55
+ system 'stty raw -echo'
56
+ c = STDIN.getc
57
+ system 'stty cooked echo'
58
+ case c
59
+ when "\x03"
60
+ false
61
+ when "\e"
62
+ STDIN.getc == ?[ or return nil
63
+ STDIN.getc =~ /\A([AB])\z/ or return nil
64
+ if $1 == ?A
65
+ @selector -= 1
66
+ else
67
+ @selector += 1
68
+ end
69
+ @selector = [ @selector, 0 ].max
70
+ nil
71
+ when ?\r
72
+ true
73
+ when "\x7f"
74
+ @selector = 0
75
+ @answer.chop!
76
+ nil
77
+ when "\v"
78
+ @selector = 0
79
+ @answer.clear
80
+ nil
81
+ when /\A[\x00-\x1f]\z/
82
+ nil
83
+ else
84
+ @selector = 0
85
+ @answer << c
86
+ nil
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,8 @@
1
+ module SearchUi
2
+ # SearchUi version
3
+ VERSION = '0.0.0'
4
+ VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ end
data/search_ui.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: search_ui 0.0.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "search_ui".freeze
6
+ s.version = "0.0.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib".freeze]
10
+ s.authors = ["Florian Frank".freeze]
11
+ s.date = "2020-02-11"
12
+ s.description = "This library allows a user to search an array of objects\n interactively in the console by matching the pattern a user inputs to an\n array of objects and pick one of the remaining objects.".freeze
13
+ s.email = "flori@ping.de".freeze
14
+ s.executables = ["search_it".freeze]
15
+ s.extra_rdoc_files = ["README.md".freeze, "lib/search_ui.rb".freeze, "lib/search_ui/search.rb".freeze, "lib/search_ui/version.rb".freeze]
16
+ s.files = [".gitignore".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/search_it".freeze, "lib/search_ui.rb".freeze, "lib/search_ui/search.rb".freeze, "lib/search_ui/version.rb".freeze, "search_ui.gemspec".freeze]
17
+ s.homepage = "http://flori.github.com/search_ui".freeze
18
+ s.licenses = ["MIT".freeze]
19
+ s.rdoc_options = ["--title".freeze, "SearchUi -- Search User Interface".freeze, "--main".freeze, "README.md".freeze]
20
+ s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
21
+ s.rubygems_version = "3.1.2".freeze
22
+ s.summary = "Library to provide a user interface for searching in a console".freeze
23
+
24
+ if s.respond_to? :specification_version then
25
+ s.specification_version = 4
26
+ end
27
+
28
+ if s.respond_to? :add_runtime_dependency then
29
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
30
+ s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.0"])
31
+ s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.0"])
32
+ s.add_runtime_dependency(%q<term-ansicolor>.freeze, ["~> 1.0"])
33
+ s.add_runtime_dependency(%q<amatch>.freeze, ["~> 0.0"])
34
+ else
35
+ s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
36
+ s.add_dependency(%q<simplecov>.freeze, ["~> 0.0"])
37
+ s.add_dependency(%q<tins>.freeze, ["~> 1.0"])
38
+ s.add_dependency(%q<term-ansicolor>.freeze, ["~> 1.0"])
39
+ s.add_dependency(%q<amatch>.freeze, ["~> 0.0"])
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: search_ui
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Florian Frank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gem_hadar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.11.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.11.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tins
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: term-ansicolor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: amatch
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.0'
83
+ description: |-
84
+ This library allows a user to search an array of objects
85
+ interactively in the console by matching the pattern a user inputs to an
86
+ array of objects and pick one of the remaining objects.
87
+ email: flori@ping.de
88
+ executables:
89
+ - search_it
90
+ extensions: []
91
+ extra_rdoc_files:
92
+ - README.md
93
+ - lib/search_ui.rb
94
+ - lib/search_ui/search.rb
95
+ - lib/search_ui/version.rb
96
+ files:
97
+ - ".gitignore"
98
+ - Gemfile
99
+ - LICENSE
100
+ - README.md
101
+ - Rakefile
102
+ - VERSION
103
+ - bin/search_it
104
+ - lib/search_ui.rb
105
+ - lib/search_ui/search.rb
106
+ - lib/search_ui/version.rb
107
+ - search_ui.gemspec
108
+ homepage: http://flori.github.com/search_ui
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options:
114
+ - "--title"
115
+ - SearchUi -- Search User Interface
116
+ - "--main"
117
+ - README.md
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '2.0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ requirements: []
131
+ rubygems_version: 3.1.2
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Library to provide a user interface for searching in a console
135
+ test_files: []