tty 0.1.0 → 0.1.1

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -3
  3. data/CHANGELOG.md +8 -0
  4. data/README.md +74 -42
  5. data/lib/tty.rb +7 -9
  6. data/lib/tty/conversion.rb +16 -0
  7. data/lib/tty/conversion/converter/array.rb +35 -0
  8. data/lib/tty/{coercer → conversion/converter}/boolean.rb +20 -7
  9. data/lib/tty/conversion/converter/float.rb +28 -0
  10. data/lib/tty/conversion/converter/integer.rb +28 -0
  11. data/lib/tty/{coercer → conversion/converter}/range.rb +16 -7
  12. data/lib/tty/logger.rb +1 -1
  13. data/lib/tty/shell/question.rb +2 -1
  14. data/lib/tty/shell/response.rb +9 -4
  15. data/lib/tty/shell/statement.rb +3 -2
  16. data/lib/tty/table.rb +3 -3
  17. data/lib/tty/table/border.rb +8 -5
  18. data/lib/tty/table/border/row_line.rb +2 -2
  19. data/lib/tty/table/operation/alignment_set.rb +2 -1
  20. data/lib/tty/table/padder.rb +1 -1
  21. data/lib/tty/table/renderer/basic.rb +1 -1
  22. data/lib/tty/terminal.rb +1 -118
  23. data/lib/tty/text/truncation.rb +4 -1
  24. data/lib/tty/text/wrapping.rb +4 -1
  25. data/lib/tty/vector.rb +4 -3
  26. data/lib/tty/version.rb +2 -2
  27. data/spec/tty/{support/conversion_spec.rb → conversion/converter/array/convert_spec.rb} +4 -5
  28. data/spec/tty/{coercer/boolean/coerce_spec.rb → conversion/converter/boolean/convert_spec.rb} +5 -4
  29. data/spec/tty/{coercer/float/coerce_spec.rb → conversion/converter/float/convert_spec.rb} +3 -2
  30. data/spec/tty/{coercer/integer/coerce_spec.rb → conversion/converter/integer/convert_spec.rb} +4 -2
  31. data/spec/tty/{coercer/range/coerce_spec.rb → conversion/converter/range/convert_spec.rb} +3 -2
  32. data/spec/tty/shell/error_spec.rb +4 -1
  33. data/spec/tty/shell/response/read_bool_spec.rb +1 -1
  34. data/spec/tty/shell/say_spec.rb +3 -0
  35. data/spec/tty/shell/statement/initialize_spec.rb +2 -2
  36. data/spec/tty/shell/warn_spec.rb +3 -0
  37. data/spec/tty/table/field/equality_spec.rb +1 -1
  38. data/spec/tty/table/render_spec.rb +3 -0
  39. data/spec/tty/table/render_with_spec.rb +8 -5
  40. data/spec/tty/table/renderer/basic/coloring_spec.rb +10 -9
  41. data/spec/tty/table/renderer/style_spec.rb +3 -0
  42. data/spec/tty/terminal/color_spec.rb +6 -3
  43. data/tasks/console.rake +1 -1
  44. data/tty.gemspec +7 -1
  45. metadata +88 -30
  46. data/lib/tty/coercer.rb +0 -13
  47. data/lib/tty/coercer/float.rb +0 -20
  48. data/lib/tty/coercer/integer.rb +0 -20
  49. data/lib/tty/support/conversion.rb +0 -35
  50. data/lib/tty/support/equatable.rb +0 -152
  51. data/lib/tty/terminal/color.rb +0 -157
  52. data/spec/tty/support/equatable_spec.rb +0 -201
  53. data/spec/tty/terminal/color/code_spec.rb +0 -19
  54. data/spec/tty/terminal/color/remove_spec.rb +0 -44
  55. data/spec/tty/terminal/color/set_spec.rb +0 -29
  56. data/spec/tty/terminal/size_spec.rb +0 -97
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ff8d55e968e3331ebf153894ccbf0a049298bc6
4
- data.tar.gz: 5cfbe8e57e25a74cb855e1501ce3c18c0a7b16b2
3
+ metadata.gz: fa48f582822f503a5f6baabe338a3cde4fa5a75c
4
+ data.tar.gz: c65742283bfea4e4389b2b8efb311a149b106bd7
5
5
  SHA512:
6
- metadata.gz: cb5e763c659e1b78d82e179e4a25df354b7ab9939d99effe637044d5e27e0b9400025bb2bae37eeb9e350ae1f176a6b2b4227224f467d8ba8a6236cb67a80bbc
7
- data.tar.gz: 138c0a16a982220b62b0859bbf19bef558e3a14978cbd1dcd3a57d7b706541cbafed1ffc2d6867c8c36797de30dd273a468d270c55d9268ae25d2a4694abc176
6
+ metadata.gz: c2f866d26af71516c644c099d4cf799acf70bb86c1f8abaa4621b9c97257c8d0f4be3b53700a1ebfe43e58b32f80754101db4e5fb296766ee6d18393f829c23d
7
+ data.tar.gz: 7b02be106e54c2885b85a7731bdea9d143214f7eeb288db5285d30015d70fc9085c438a799de9339ceb4f8b46dfb01e8f92fa0a454ba725b46772409e3211699
@@ -6,20 +6,18 @@ rvm:
6
6
  - 2.0.0
7
7
  - 2.1.0
8
8
  - ruby-head
9
+ - rbx-2
9
10
  matrix:
10
11
  include:
11
12
  - rvm: jruby-19mode
12
13
  - rvm: jruby-20mode
13
14
  - rvm: jruby-21mode
14
15
  - rvm: jruby-head
15
- - rvm: rbx-2
16
16
  allow_failures:
17
17
  - rvm: jruby-20mode
18
18
  - rvm: jruby-21mode
19
19
  - rvm: ruby-head
20
20
  - rvm: jruby-head
21
- - rvm: rbx
22
- - rvm: rbx-2
23
21
  fast_finish: true
24
22
  branches:
25
23
  only: master
@@ -1,3 +1,11 @@
1
+ 0.1.1 (November 23, 2014)
2
+
3
+ * Add TTY::ProgressBar
4
+ * Add TTY::Spinner
5
+ * Remove TTY::Terminal::Color and replace with Pastel
6
+ * Change to depend on Equatable library
7
+ * Change to depend on TTY::Screen library for screen size detection
8
+
1
9
  0.1.0 (21 September, 2014)
2
10
 
3
11
  * Simplify development dependency mangement
data/README.md CHANGED
@@ -4,13 +4,14 @@
4
4
  [![Build Status](https://secure.travis-ci.org/peter-murach/tty.png?branch=master)][travis]
5
5
  [![Code Climate](https://codeclimate.com/github/peter-murach/tty.png)][codeclimate]
6
6
  [![Coverage Status](https://coveralls.io/repos/peter-murach/tty/badge.png?branch=master)][coveralls]
7
+ [![Inline docs](http://inch-ci.org/github/peter-murach/tty.png?branch=master)](http://inch-ci.org/github/peter-murach/tty)
7
8
 
8
9
  [gem]: http://badge.fury.io/rb/tty
9
10
  [travis]: http://travis-ci.org/peter-murach/tty
10
11
  [codeclimate]: https://codeclimate.com/github/peter-murach/tty
11
12
  [coveralls]: https://coveralls.io/r/peter-murach/tty
12
13
 
13
- TTY is a toolbox for developing beautiful command line clients in Ruby. It provides a fluid interface for gathering input from the user, querying system and terminal and displaying information back. It is not another command line options parser, rather a plumbing library that helps in common tasks.
14
+ > TTY is a toolbox for developing beautiful command line clients in Ruby. It provides a fluid interface for gathering input from the user, querying system and terminal and displaying information back. It is not another command line options parser, rather a plumbing library that helps in common tasks.
14
15
 
15
16
  ## Motivation
16
17
 
@@ -22,19 +23,20 @@ Even more so, any command line application needs a clear way of communicating it
22
23
 
23
24
  Jump-start development of your command line app:
24
25
 
25
- * Table rendering with an easy-to-use API. [status: ✔ ]
26
+ * Terminal ASCII and Unicode tables. [status: ✔ ]
26
27
  * Terminal output colorization. [status: ✔ ]
27
28
  * Terminal output paging. [status: ✔ ]
28
- * System & command detection utilities. [status: ✔ ]
29
+ * System detection utilities. [status: ✔ ]
30
+ * Command detection utilities. [status: ✔ ]
29
31
  * Text manipulation(wrapping/truncation) [status: ✔ ]
30
- * Shell user interface. [status: In Progress]
32
+ * Terminal progress bars drawing. [status: ]
33
+ * Terminal spinners. [status: ✔ ]
34
+ * Prompt user interface. [status: In Progress]
31
35
  * File diffs. [status: TODO]
32
- * Progress bar. [status: TODO]
33
36
  * Configuration file management. [status: TODO]
34
37
  * Logging [status: In Progress]
35
38
  * Plugin ecosystem [status: TODO]
36
39
  * Fully tested with major ruby interpreters.
37
- * No dependencies to allow for easy gem vendoring.
38
40
 
39
41
  ## Installation
40
42
 
@@ -60,15 +62,49 @@ Or install it yourself as:
60
62
  * [1.5 Padding](#15-padding)
61
63
  * [1.6 Filter](#16-filter)
62
64
  * [1.7 Width](#17-width)
63
- * [2. Terminal](#2-terminal)
64
- * [2.1 Color](#21-color)
65
- * [2.2 Pager](#22-pager)
66
- * [3. Shell](#3-shell)
67
- * [4. System](#4-system)
65
+ * [2. Color](#2-color)
66
+ * [3. ProgressBar](#3-progressbar)
67
+ * [4. Spinner](#4-spinner)
68
+ * [5. Screen](#5-screen)
69
+ * [6. Terminal](#6-terminal)
70
+ * [6.1 Pager](#61-pager)
71
+ * [7. Shell](#7-shell)
72
+ * [8. System](#8-system)
68
73
 
69
74
  ## Usage
70
75
 
71
- ### 1 Table
76
+ **TTY** provides you with many tools to get the job done in terminal.
77
+
78
+ To print tabular output use `TTY::Table`:
79
+
80
+ ```ruby
81
+ table = TTY::Table[['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']]
82
+ table.to_s # => a1 a2 a3
83
+ b1 b2 b3
84
+ ```
85
+
86
+ To colorize your strings use `Pastel`:
87
+
88
+ ```ruby
89
+ pastel = Pastel.new
90
+ pastel.green.on_red.bold('Piotr')
91
+ ```
92
+
93
+ To create a progress bar use `TTY::ProgressBar`:
94
+
95
+ ```ruby
96
+ bar = TTY::ProgressBar.new("downloading [:bar]", total: 30)
97
+ 30.times { bar.advance }
98
+ ```
99
+
100
+ To create a spinner use `TTY::Spinner`:
101
+
102
+ ```ruby
103
+ spinner = TTY::Spinner.new('Loading ... ', format: :spin_2)
104
+ 30.times { spinner.spin }
105
+ ```
106
+
107
+ ## 1 Table
72
108
 
73
109
  To instantiate table pass 2-dimensional array:
74
110
 
@@ -293,7 +329,7 @@ end
293
329
  By default padding is not applied. You can add `padding` to table fields like so
294
330
 
295
331
  ```ruby
296
- heaer = ['Field', 'Type', 'Null', 'Key', 'Default', 'Extra']
332
+ header = ['Field', 'Type', 'Null', 'Key', 'Default', 'Extra']
297
333
  rows = [['id', 'int(11)', 'YES', 'nil', 'NULL', '']]
298
334
  table = TTY::Table.new(header, rows)
299
335
  table.render { |renderer| renderer.padding= [0,1,0,1] }
@@ -377,45 +413,41 @@ table.render width: 80, resize: true
377
413
  +---------+-------+------------+
378
414
  ```
379
415
 
380
- ### 2 Terminal
416
+ ## 2 Color
381
417
 
382
- To read general terminal properties you can use on of the helpers
418
+ To colorize your output you can use **Pastel** like so:
383
419
 
384
420
  ```ruby
385
- term = TTY::Terminal.new
386
- term.width # => 140
387
- term.height # => 60
388
- term.color? # => true or false
389
- term.echo(false) { } # switch off echo for the block
390
- term.page # page terminal output, on non unix systems falls back to ruby implementation
421
+ pastel = Pastel.new
422
+ pastel.red.on_green.bold 'text...' # => red bold text on green background
391
423
  ```
392
424
 
393
- #### 2.1 Color
425
+ Please refer to [documentation](https://github.com/peter-murach/pastel) for complete API.
394
426
 
395
- To colorize your output do
427
+ ## 3. ProgressBar
396
428
 
397
- ```ruby
398
- term.color.set 'text...', :bold, :red, :on_green # => red bold text on green background
399
- term.color.remove 'text...' # strips off ansi escape sequences
400
- term.color.code :red # ansi escape code for the supplied color
401
- ```
429
+ Please refer to [documentation](https://github.com/peter-murach/tty-progressbar) for complete API.
430
+
431
+ ## 4. Spinner
432
+
433
+ Please refer to [documentation](https://github.com/peter-murach/tty-spinner) for complete API.
434
+
435
+ ## 5. Screen
402
436
 
403
- Available colors are:
437
+ Please refer to [documentation](https://github.com/peter-murach/tty-screen) for complete API.
438
+
439
+
440
+ ## 6 Terminal
441
+
442
+ To read general terminal properties you can use on of the helpers
404
443
 
405
444
  ```ruby
406
- black
407
- red
408
- green
409
- yellow
410
- blue
411
- magenta
412
- cyan
413
- white
445
+ term = TTY::Terminal.new
446
+ term.echo(false) { } # switch off echo for the block
447
+ term.page # page terminal output, on non unix systems falls back to ruby implementation
414
448
  ```
415
449
 
416
- To supply background color simply prefix it with `on_`. For example a green background would be `on_green`.
417
-
418
- #### 2.2 Pager
450
+ ### 6.1 Pager
419
451
 
420
452
  To page your output do
421
453
 
@@ -423,7 +455,7 @@ To page your output do
423
455
  term.page 'long text...'
424
456
  ```
425
457
 
426
- ### 3 Shell
458
+ ## 7 Shell
427
459
 
428
460
  Main responsibility is to interact with the prompt and provide convenience methods.
429
461
 
@@ -522,7 +554,7 @@ shell.suggest('sta', ['stage', 'stash', 'commit', 'branch'])
522
554
  stash
523
555
  ```
524
556
 
525
- ### 4 System
557
+ ## 8 System
526
558
 
527
559
  ```ruby
528
560
  TTY::System.unix? # check if unix platform
data/lib/tty.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'equatable'
4
+ require 'pastel'
5
+ require 'tty-screen'
6
+ require 'tty-spinner'
7
+ require 'tty-progressbar'
8
+
3
9
  require 'tty/version'
4
10
 
11
+ require 'tty/conversion'
5
12
  require 'tty/support/utils'
6
13
  require 'tty/support/delegatable'
7
- require 'tty/support/conversion'
8
14
  require 'tty/support/coercion'
9
- require 'tty/support/equatable'
10
15
  require 'tty/support/unicode'
11
16
 
12
17
  require 'tty/terminal'
@@ -15,17 +20,11 @@ require 'tty/table'
15
20
  require 'tty/text'
16
21
  require 'tty/vector'
17
22
  require 'tty/shell'
18
- require 'tty/coercer'
19
23
  require 'tty/logger'
20
24
  require 'tty/plugins'
21
25
 
22
26
  require 'tty/plugins/plugin'
23
27
 
24
- require 'tty/coercer/range'
25
- require 'tty/coercer/integer'
26
- require 'tty/coercer/float'
27
- require 'tty/coercer/boolean'
28
-
29
28
  require 'tty/shell/response_delegation'
30
29
  require 'tty/shell/question'
31
30
  require 'tty/shell/question/validation'
@@ -35,7 +34,6 @@ require 'tty/shell/suggestion'
35
34
  require 'tty/shell/reader'
36
35
  require 'tty/shell/response'
37
36
 
38
- require 'tty/terminal/color'
39
37
  require 'tty/terminal/echo'
40
38
  require 'tty/terminal/home'
41
39
  require 'tty/terminal/pager'
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module TTY
4
+ module Conversion
5
+ TypeError = Class.new(StandardError)
6
+
7
+ # Raised when cannot conver to a given type
8
+ NoTypeConversionAvailable = Class.new(StandardError)
9
+ end
10
+ end
11
+
12
+ require 'tty/conversion/converter/array'
13
+ require 'tty/conversion/converter/boolean'
14
+ require 'tty/conversion/converter/float'
15
+ require 'tty/conversion/converter/integer'
16
+ require 'tty/conversion/converter/range'
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ module TTY
4
+ module Conversion
5
+ class ArrayConverter
6
+
7
+ attr_reader :target
8
+
9
+ attr_reader :source
10
+
11
+ def initialize(source = String)
12
+ @source = source
13
+ @target = Array
14
+ end
15
+
16
+ # @api public
17
+ def convert(value, copy = false)
18
+ case value
19
+ when Array
20
+ copy ? value.dup : value
21
+ when Hash
22
+ Array(value)
23
+ else
24
+ begin
25
+ converted = value.to_ary
26
+ rescue Exception => e
27
+ raise TTY::TypeError,
28
+ "Cannot convert #{value.class} into an Array (#{e.message})"
29
+ end
30
+ converted
31
+ end
32
+ end
33
+ end # ArrayConverter
34
+ end # Conversion
35
+ end # TTY
@@ -1,10 +1,23 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TTY
4
- class Coercer
5
- # A class responsible for boolean type coercion
6
- class Boolean
7
- # Coerce value to boolean type including range of strings such as
4
+ module Conversion
5
+ class BooleanConverter
6
+
7
+ attr_reader :target
8
+
9
+ attr_reader :source
10
+
11
+ def initialize(source = String)
12
+ @source = source
13
+ @target = [TrueClass, FalseClass]
14
+ end
15
+
16
+ def boolean?(value)
17
+ target.any? { |klass| value.is_a?(klass) }
18
+ end
19
+
20
+ # Convert value to boolean type including range of strings such as
8
21
  #
9
22
  # @param [Object] value
10
23
  #
@@ -21,7 +34,7 @@ module TTY
21
34
  # 0, f, F, FALSE, false, False, n, N, No, no, No
22
35
  #
23
36
  # @api public
24
- def self.coerce(value)
37
+ def convert(value)
25
38
  case value.to_s
26
39
  when /^(yes|y|t(rue)?|1)$/i
27
40
  return true
@@ -31,6 +44,6 @@ module TTY
31
44
  fail TypeError, "Expected boolean type, got #{value}"
32
45
  end
33
46
  end
34
- end # Boolean
35
- end # Coercer
47
+ end # BooleanConverter
48
+ end # Conversion
36
49
  end # TTY
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ module TTY
4
+ module Conversion
5
+ class FloatConverter
6
+
7
+ attr_reader :target
8
+
9
+ attr_reader :source
10
+
11
+ def initialize(source = String)
12
+ @source = source
13
+ @target = Float
14
+ end
15
+
16
+ # @api public
17
+ def convert(value, strict = false)
18
+ Kernel.send(target.name.to_sym, value.to_s)
19
+ rescue
20
+ if strict
21
+ raise InvalidArgument, "#{value} could not be coerced into #{target.name}"
22
+ else
23
+ value.to_f
24
+ end
25
+ end
26
+ end # IntegerConverter
27
+ end # Conversion
28
+ end # TTY
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ module TTY
4
+ module Conversion
5
+ class IntegerConverter
6
+
7
+ attr_reader :target
8
+
9
+ attr_reader :source
10
+
11
+ def initialize(source = String)
12
+ @source = source
13
+ @target = Integer
14
+ end
15
+
16
+ # @api public
17
+ def convert(value, strict = false)
18
+ Kernel.send(target.name.to_sym, value.to_s)
19
+ rescue
20
+ if strict
21
+ raise InvalidArgument, "#{value} could not be coerced into #{target.name}"
22
+ else
23
+ value.to_i
24
+ end
25
+ end
26
+ end # IntegerConverter
27
+ end # Conversion
28
+ end # TTY
@@ -1,10 +1,19 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TTY
4
- class Coercer
5
- # A class responsible for range type coercion
6
- class Range
7
- # Coerce value to Range type with possible ranges
4
+ module Conversion
5
+ class RangeConverter
6
+
7
+ attr_reader :target
8
+
9
+ attr_reader :source
10
+
11
+ def initialize(source = String)
12
+ @source = source
13
+ @target = Range
14
+ end
15
+
16
+ # Convert value to Range type with possible ranges
8
17
  #
9
18
  # @param [Object] value
10
19
  #
@@ -15,7 +24,7 @@ module TTY
15
24
  # coerce('0-9') # => (0..9)
16
25
  #
17
26
  # @api public
18
- def self.coerce(value)
27
+ def convert(value)
19
28
  case value.to_s
20
29
  when /\A(\-?\d+)\Z/
21
30
  ::Range.new($1.to_i, $1.to_i)
@@ -27,6 +36,6 @@ module TTY
27
36
  fail InvalidArgument, "#{value} could not be coerced into Range type"
28
37
  end
29
38
  end
30
- end # Range
31
- end # Coercer
39
+ end # RangeConverter
40
+ end # Conversion
32
41
  end # TTY