termkit 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ackrc +7 -0
- data/.editorconfig +14 -0
- data/.gitignore +5 -1
- data/.gitlab-ci.yml +70 -0
- data/.rdoc_options +21 -0
- data/.travis.yml +5 -1
- data/Gemfile +8 -0
- data/Makefile +16 -1
- data/Makefile.common +5 -3
- data/README.md +2 -1
- data/bin/build_info.sh +22 -0
- data/bin/dev +10 -0
- data/lib/termkit.rb +32 -0
- data/lib/termkit/app/app.rb +61 -0
- data/lib/termkit/app/app_curses.rb +159 -0
- data/lib/termkit/app/app_ui.rb +153 -0
- data/lib/termkit/controller/controller.rb +58 -0
- data/lib/termkit/controller/controller_app.rb +22 -0
- data/lib/termkit/controller/controller_view.rb +28 -0
- data/lib/termkit/event/event.rb +14 -0
- data/lib/termkit/event/event_key.rb +33 -0
- data/lib/termkit/event/event_later.rb +16 -0
- data/lib/termkit/exception/exception_event_key_unhandled.rb +11 -0
- data/lib/termkit/exception/exception_event_unhandled.rb +18 -0
- data/lib/termkit/exception/exception_initialized_not_class_parent.rb +17 -0
- data/lib/termkit/exception/exception_std.rb +11 -0
- data/lib/termkit/misc/curses_color.rb +23 -0
- data/lib/termkit/misc/point.rb +114 -0
- data/lib/termkit/misc/rect.rb +116 -0
- data/lib/termkit/misc/size.rb +29 -0
- data/lib/termkit/model/model.rb +16 -0
- data/lib/termkit/version.rb +5 -4
- data/lib/termkit/view/content_view.rb +59 -0
- data/lib/termkit/view/content_view_clear.rb +20 -0
- data/lib/termkit/view/row_grid_view.rb +12 -0
- data/lib/termkit/view/view.rb +825 -0
- data/lib/termkit/view/view_grid.rb +12 -0
- data/lib/termkit/view/view_table.rb +296 -0
- data/lib/termkit/view/view_table_cell.rb +38 -0
- data/lib/termkit/view/view_text.rb +63 -0
- data/termkit.gemspec +8 -0
- data/termkit.sublime-project +2 -2
- metadata +120 -5
- data/tests/ts_all.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f349541a321abf4e99c77c41a7f3a77549f0ef55
|
4
|
+
data.tar.gz: 690a15bd0ab52b594f140fa015446b011be0dec6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9697742ccb5ded5120feceab7478f57d6ed2b45f62180871eabaa32a20031afe6df6c8cc75ffcecf24d1345a0a0735483525c7edb085f3dd2a76f95c24fa027
|
7
|
+
data.tar.gz: 8d1667a59f74a3742aafb34a14b33622f6322d8621cb498c2011b12f030088de503252a93b6845d163dd32fc94103834590138d96715d63b9ea01a2ebc8e7c44
|
data/.ackrc
ADDED
data/.editorconfig
ADDED
data/.gitignore
CHANGED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
before_script:
|
2
|
+
- apt-get update -yqq
|
3
|
+
- 'which ssh-agent || ( apt-get install openssh-client -y )'
|
4
|
+
- 'which rsync || ( apt-get install rsync -yqq --force-yes )'
|
5
|
+
- eval $(ssh-agent -s)
|
6
|
+
- ssh-add <(echo "$SSH_PRIVATE_KEY")
|
7
|
+
- mkdir -p ~/.ssh
|
8
|
+
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
9
|
+
- ruby -v
|
10
|
+
- gem update --system
|
11
|
+
- gem install bundler -v '~>1.13'
|
12
|
+
- bundler --version
|
13
|
+
- make
|
14
|
+
|
15
|
+
stages:
|
16
|
+
- test
|
17
|
+
- release
|
18
|
+
- deploy
|
19
|
+
|
20
|
+
test_21:
|
21
|
+
image: ruby:2.1
|
22
|
+
stage: test
|
23
|
+
environment: test
|
24
|
+
only:
|
25
|
+
- tags
|
26
|
+
script:
|
27
|
+
- make test
|
28
|
+
|
29
|
+
test_22:
|
30
|
+
image: ruby:2.2
|
31
|
+
stage: test
|
32
|
+
environment: test
|
33
|
+
only:
|
34
|
+
- tags
|
35
|
+
script:
|
36
|
+
- make test
|
37
|
+
|
38
|
+
test_23:
|
39
|
+
image: ruby:2.3
|
40
|
+
stage: test
|
41
|
+
environment: test
|
42
|
+
only:
|
43
|
+
- tags
|
44
|
+
script:
|
45
|
+
- make test
|
46
|
+
|
47
|
+
release_gem:
|
48
|
+
image: ruby:2.3
|
49
|
+
stage: release
|
50
|
+
environment: gem
|
51
|
+
only:
|
52
|
+
- tags
|
53
|
+
script:
|
54
|
+
- mkdir -p ~/.gem
|
55
|
+
- 'printf "%s\n:rubygems_api_key: %s" "---" "${RUBYGEMSORG_API_KEY}" > ~/.gem/credentials; chmod 0600 ~/.gem/credentials'
|
56
|
+
- make release
|
57
|
+
|
58
|
+
deploy_homepage:
|
59
|
+
image: ruby:2.3
|
60
|
+
stage: deploy
|
61
|
+
environment: homepage
|
62
|
+
only:
|
63
|
+
- tags
|
64
|
+
script:
|
65
|
+
- make cov
|
66
|
+
- make doc
|
67
|
+
- bin/build_info.sh > build.txt
|
68
|
+
- 'rsync ${RSYNC_OPTIONS} coverage ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_REMOTE_PATH}'
|
69
|
+
- 'rsync ${RSYNC_OPTIONS} doc ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_REMOTE_PATH}'
|
70
|
+
- 'rsync ${RSYNC_OPTIONS} build.txt ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_REMOTE_PATH}'
|
data/.rdoc_options
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
--- !ruby/object:RDoc::Options
|
2
|
+
encoding: UTF-8
|
3
|
+
static_path: []
|
4
|
+
rdoc_include: []
|
5
|
+
charset: UTF-8
|
6
|
+
exclude: []
|
7
|
+
hyperlink_all: false
|
8
|
+
line_numbers: true
|
9
|
+
locale: en
|
10
|
+
locale_dir: locale
|
11
|
+
locale_name:
|
12
|
+
main_page: README.md
|
13
|
+
markup: markdown
|
14
|
+
output_decoration: true
|
15
|
+
page_dir:
|
16
|
+
show_hash: false
|
17
|
+
tab_width: 4
|
18
|
+
template_stylesheets: []
|
19
|
+
title: TermKit
|
20
|
+
visibility: :protected
|
21
|
+
webcvs:
|
data/.travis.yml
CHANGED
@@ -2,10 +2,14 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 2.1
|
4
4
|
- 2.2
|
5
|
+
- 2.3
|
6
|
+
- 2.4.0-preview2
|
7
|
+
- ruby-head
|
5
8
|
sudo: required
|
6
9
|
before_install:
|
10
|
+
- gem --version
|
7
11
|
- gem update --system
|
8
|
-
- gem install bundler -v '~>1.
|
12
|
+
- gem install bundler -v '~>1.13'
|
9
13
|
- bundler --version
|
10
14
|
install:
|
11
15
|
- make
|
data/Gemfile
CHANGED
data/Makefile
CHANGED
@@ -3,6 +3,21 @@ GEM_NAME = termkit
|
|
3
3
|
|
4
4
|
include Makefile.common
|
5
5
|
|
6
|
+
.PHONY: dev
|
7
|
+
dev:
|
8
|
+
$(BUNDLER) exec ./bin/dev
|
9
|
+
|
6
10
|
.PHONY: test
|
7
11
|
test:
|
8
|
-
RUBYOPT=-w $(BUNDLER) exec ./
|
12
|
+
RUBYOPT=-w TZ=Europe/Vienna $(BUNDLER) exec ./test/suite_all.rb -v
|
13
|
+
|
14
|
+
.PHONY: cov
|
15
|
+
cov:
|
16
|
+
RUBYOPT=-w TZ=Europe/Vienna COVERAGE=1 $(BUNDLER) exec ./test/suite_all.rb -v
|
17
|
+
|
18
|
+
.PHONY: cov_local
|
19
|
+
cov_local:
|
20
|
+
RUBYOPT=-w TZ=Europe/Vienna SIMPLECOV_PHPUNIT_LOAD_PATH=../simplecov-phpunit COVERAGE=1 $(BUNDLER) exec ./test/suite_all.rb -v
|
21
|
+
|
22
|
+
doc:
|
23
|
+
rdoc README.md lib/termkit
|
data/Makefile.common
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
|
2
|
-
# Ruby Common Big
|
3
|
-
# 2016-05-20
|
2
|
+
# Ruby Common Big 2016-10-22
|
4
3
|
|
5
4
|
MV = mv -nv
|
6
5
|
RM = rm -rfd
|
7
6
|
MKDIR = mkdir -p
|
8
7
|
CHMOD = chmod
|
9
|
-
BUNDLER =
|
8
|
+
BUNDLER = bundler
|
10
9
|
BUNDLER_OPTIONS = --jobs=5 --retry=3
|
11
10
|
GEMSPEC_FILE = $(GEM_NAME).gemspec
|
12
11
|
|
@@ -17,6 +16,9 @@ all: setup $(ALL_TARGETS_EXT)
|
|
17
16
|
setup: .setup
|
18
17
|
|
19
18
|
.setup:
|
19
|
+
which ruby &> /dev/null
|
20
|
+
which $(BUNDLER) &> /dev/null
|
21
|
+
ruby -v
|
20
22
|
$(BUNDLER) install $(BUNDLER_OPTIONS)
|
21
23
|
touch $@
|
22
24
|
|
data/README.md
CHANGED
@@ -15,12 +15,13 @@ or via `Gemfile`:
|
|
15
15
|
|
16
16
|
## Project Links
|
17
17
|
|
18
|
+
- [Homepage](https://termkit.fox21.at/)
|
18
19
|
- [TermKit Gem](https://rubygems.org/gems/termkit)
|
19
20
|
- [Travis CI Repository](https://travis-ci.org/TheFox/termkit)
|
20
21
|
|
21
22
|
## License
|
22
23
|
|
23
|
-
Copyright (C) 2016 Christian Mayer <
|
24
|
+
Copyright (C) 2016 Christian Mayer <https://fox21.at>
|
24
25
|
|
25
26
|
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
26
27
|
|
data/bin/build_info.sh
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
DATE=$(date +"%F %T %z")
|
4
|
+
SCRIPT_BASEDIR=$(dirname $0)
|
5
|
+
|
6
|
+
|
7
|
+
cd "${SCRIPT_BASEDIR}/.."
|
8
|
+
|
9
|
+
RUBY_VERSION=$(ruby -e "print RUBY_VERSION")
|
10
|
+
TERMKIT_VERSION=$(ruby -I lib/termkit -rversion -e "print %{#{TheFox::TermKit::VERSION} (#{TheFox::TermKit::DATE})}")
|
11
|
+
|
12
|
+
printf "%s
|
13
|
+
|
14
|
+
ruby: %s
|
15
|
+
termkit: %s
|
16
|
+
|
17
|
+
--- build ---
|
18
|
+
id: %s
|
19
|
+
ref: %s@%s
|
20
|
+
stage: %s
|
21
|
+
server: %s %s
|
22
|
+
" "${DATE}" "${RUBY_VERSION}" "${TERMKIT_VERSION}" "${CI_BUILD_ID}" "${CI_BUILD_REF}" "${CI_BUILD_REF_NAME}" "${CI_BUILD_STAGE}" "${CI_SERVER_NAME}" "${CI_SERVER_VERSION}"
|
data/bin/dev
ADDED
data/lib/termkit.rb
CHANGED
@@ -1,2 +1,34 @@
|
|
1
1
|
|
2
2
|
require 'termkit/version'
|
3
|
+
|
4
|
+
require 'termkit/misc/curses_color'
|
5
|
+
require 'termkit/misc/point'
|
6
|
+
require 'termkit/misc/size'
|
7
|
+
require 'termkit/misc/rect'
|
8
|
+
|
9
|
+
require 'termkit/exception/exception_std'
|
10
|
+
require 'termkit/exception/exception_event_unhandled'
|
11
|
+
require 'termkit/exception/exception_event_key_unhandled'
|
12
|
+
require 'termkit/exception/exception_initialized_not_class_parent'
|
13
|
+
|
14
|
+
require 'termkit/event/event'
|
15
|
+
require 'termkit/event/event_key'
|
16
|
+
|
17
|
+
require 'termkit/model/model'
|
18
|
+
|
19
|
+
require 'termkit/view/content_view'
|
20
|
+
require 'termkit/view/content_view_clear'
|
21
|
+
require 'termkit/view/row_grid_view'
|
22
|
+
require 'termkit/view/view'
|
23
|
+
require 'termkit/view/view_grid'
|
24
|
+
require 'termkit/view/view_text'
|
25
|
+
require 'termkit/view/view_table'
|
26
|
+
require 'termkit/view/view_table_cell'
|
27
|
+
|
28
|
+
require 'termkit/controller/controller'
|
29
|
+
require 'termkit/controller/controller_app'
|
30
|
+
require 'termkit/controller/controller_view'
|
31
|
+
|
32
|
+
require 'termkit/app/app'
|
33
|
+
require 'termkit/app/app_ui'
|
34
|
+
require 'termkit/app/app_curses'
|
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module TheFox
|
5
|
+
module TermKit
|
6
|
+
|
7
|
+
class App
|
8
|
+
|
9
|
+
attr_accessor :logger
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@exit = false
|
13
|
+
|
14
|
+
@logger = Logger.new('termkit_app.log')
|
15
|
+
@logger.level = Logger::DEBUG
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Calls `run_cycle()` in a loop.
|
20
|
+
def run
|
21
|
+
#puts 'App run'
|
22
|
+
|
23
|
+
loop_cycle = 0
|
24
|
+
while !@exit
|
25
|
+
loop_cycle += 1
|
26
|
+
|
27
|
+
run_cycle
|
28
|
+
#sleep @run_cycle_sleep
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# As single cycle of `run()`.
|
34
|
+
def run_cycle
|
35
|
+
#puts 'App run_cycle'
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Call this to terminate the App.
|
40
|
+
def terminate
|
41
|
+
if !@exit
|
42
|
+
# puts 'App->terminate'
|
43
|
+
|
44
|
+
@exit = true
|
45
|
+
|
46
|
+
app_will_terminate
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
##
|
53
|
+
# This can be implemented by a sub-class of App.
|
54
|
+
def app_will_terminate
|
55
|
+
# puts 'App->app_will_terminate'
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
|
2
|
+
require 'curses'
|
3
|
+
#require 'io/console'
|
4
|
+
|
5
|
+
module TheFox
|
6
|
+
module TermKit
|
7
|
+
|
8
|
+
# Default Curses read input timeout.
|
9
|
+
CURSES_TIMEOUT = 200
|
10
|
+
|
11
|
+
class CursesApp < UIApp
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@curses_timeout = CURSES_TIMEOUT
|
15
|
+
|
16
|
+
@ui_inited = false
|
17
|
+
@ui_closed = false
|
18
|
+
|
19
|
+
super()
|
20
|
+
|
21
|
+
#puts 'CursesApp->initialize'
|
22
|
+
end
|
23
|
+
|
24
|
+
def curses_timeout=(curses_timeout)
|
25
|
+
@curses_timeout = curses_timeout
|
26
|
+
Curses.timeout = @curses_timeout
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# See UIApp `run_cycle()` method.
|
31
|
+
def run_cycle
|
32
|
+
super()
|
33
|
+
|
34
|
+
#puts 'CursesApp->run_cycle'
|
35
|
+
|
36
|
+
handle_user_input
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# See UIApp `draw_point()` method.
|
41
|
+
def draw_point(point, content)
|
42
|
+
# @logger.debug("draw_point #{point} #{content.inspect}")
|
43
|
+
|
44
|
+
content_s = content
|
45
|
+
foreground_color = nil
|
46
|
+
background_color = nil
|
47
|
+
if content.is_a?(ViewContent)
|
48
|
+
# @logger.debug("draw_point #{point} content is ViewContent")
|
49
|
+
|
50
|
+
content_s = content.char
|
51
|
+
|
52
|
+
# @logger.debug("draw_point #{point} #{content.foreground_color} #{content.background_color}")
|
53
|
+
|
54
|
+
foreground_color = CursesColor::COLORS[content.foreground_color]
|
55
|
+
background_color = CursesColor::COLORS[content.background_color]
|
56
|
+
end
|
57
|
+
|
58
|
+
c_attr = Curses::A_NORMAL
|
59
|
+
|
60
|
+
if !foreground_color.nil? && !background_color.nil?
|
61
|
+
Curses.init_pair(1, foreground_color, background_color)
|
62
|
+
c_attr = Curses.color_pair(1)
|
63
|
+
end
|
64
|
+
|
65
|
+
# @logger.debug("draw_point #{point} '#{content_s}' #{foreground_color.inspect} #{background_color.inspect}")
|
66
|
+
|
67
|
+
begin
|
68
|
+
Curses.setpos(point.y, point.x)
|
69
|
+
Curses.attron(c_attr) do
|
70
|
+
Curses.addstr(content_s)
|
71
|
+
end
|
72
|
+
rescue Exception => e
|
73
|
+
@logger.error("draw_point: #{e}")
|
74
|
+
end
|
75
|
+
|
76
|
+
# @logger.debug("draw_point #{point} #{content.inspect} DONE")
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# See UIApp `ui_refresh()` method.
|
81
|
+
def ui_refresh
|
82
|
+
Curses.refresh
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# See UIApp `ui_max_x()` method.
|
87
|
+
def ui_max_x
|
88
|
+
Curses.cols
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# See UIApp `ui_max_y()` method.
|
93
|
+
def ui_max_y
|
94
|
+
Curses.rows
|
95
|
+
end
|
96
|
+
|
97
|
+
protected
|
98
|
+
|
99
|
+
##
|
100
|
+
# See UIApp `ui_init()` method.
|
101
|
+
def ui_init
|
102
|
+
#puts "CursesApp->ui_init '#{@curses_timeout}'"
|
103
|
+
|
104
|
+
raise 'ui already initialized' if @ui_inited
|
105
|
+
@ui_inited = true
|
106
|
+
|
107
|
+
super()
|
108
|
+
|
109
|
+
# @logger.debug("init Curses")
|
110
|
+
|
111
|
+
Curses.noecho
|
112
|
+
Curses.timeout = @curses_timeout
|
113
|
+
Curses.curs_set(0)
|
114
|
+
Curses.init_screen
|
115
|
+
Curses.start_color
|
116
|
+
Curses.use_default_colors
|
117
|
+
Curses.crmode
|
118
|
+
Curses.stdscr.keypad(true)
|
119
|
+
|
120
|
+
# @logger.debug("color_pairs: #{Curses.color_pairs}")
|
121
|
+
|
122
|
+
# Curses.init_pair(1, Curses::COLOR_BLACK, Curses::COLOR_GREEN)
|
123
|
+
|
124
|
+
# Curses.setpos(0, 0)
|
125
|
+
# Curses.addstr('INIT OK')
|
126
|
+
# Curses.refresh
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# See UIApp `ui_close()` method.
|
131
|
+
def ui_close
|
132
|
+
#puts "CursesApp->ui_close"
|
133
|
+
|
134
|
+
raise 'ui already closed' if @ui_closed
|
135
|
+
@ui_closed = true
|
136
|
+
|
137
|
+
# Curses.setpos(10, 0)
|
138
|
+
# Curses.addstr('CLOSE ')
|
139
|
+
# Curses.refresh
|
140
|
+
# sleep(2)
|
141
|
+
|
142
|
+
Curses.refresh
|
143
|
+
Curses.stdscr.clear
|
144
|
+
Curses.stdscr.refresh
|
145
|
+
Curses.stdscr.close
|
146
|
+
Curses.close_screen
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
def handle_user_input
|
152
|
+
key_down(Curses.getch)
|
153
|
+
#key_down(IO.console.getch)
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|