termkit 0.0.0 → 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 +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
|