flexible_table 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b743ebb494954434ce4835b57d8692c1dcf54f5
4
- data.tar.gz: 020c4ec648d16a4241becb7d0db83e75f4ea7468
3
+ metadata.gz: 7820ebcd7f52ec82dc683231eb1a0d9bdd01a198
4
+ data.tar.gz: 03a373e6e7e954b5c68633800c1d2fffb6710c0d
5
5
  SHA512:
6
- metadata.gz: 426906c3b1c2189a16d420e73d0015f5a46cf486f9dd654e48ee8b0f8d010e4d369412baa9d77fa9da6c46dc32fb3411d0936eb12278952b0edc9a239c8dd227
7
- data.tar.gz: 27a2a8088925e0f9d1da035171c8ff1c2a6647558d405698773813e34e3b04fa3c02a76cefa233dff989af81d71572e12218a77d296c46c7ae05a37fae4f67f9
6
+ metadata.gz: da3febe12f4c2820748e6ef503cbd1c4a6459d8890ed4ddaf0ba4ad92c2187df0cca5688d74292481be93d4460bd71f158ef1573ddf1b271db178b9fedf7d5d2
7
+ data.tar.gz: d238dafe7c473efea8d96e7a70fd8e26cb8bdaa122fe80143926d15a6c5dd6b3bcb6d34072746bd768290e094aa7a2fb41ce605d916d68318f6a6451a9f832e8
@@ -1,9 +1,20 @@
1
+ ##
2
+ # This class represents a column in the table. Instances of this class will get created by FlexibleTable#add_column and used inside an instance of a FlexibleTable.
3
+ #
4
+ # It's important to note that the width_percentages of all FlexibleColmn's inside an instance of FlexibleTable must add up to less than or equal to 100.
1
5
  class FlexibleColumn
2
- def initialize(header, width_percentage, justify_row: :left, justify_header: :left)
3
- @header = header
4
- @width_percentage = width_percentage
5
- @justify_row = justify_row
6
- @justify_header = justify_header
7
- end
8
- attr_reader :width_percentage, :header, :justify_row, :justify_header
6
+
7
+ # === Attributes
8
+ #
9
+ # * +header+ - A String that will be displayed as the name of the column
10
+ # * +width_percentage+ - An Integer that will be the percentage of the terminal that the column should take up. The total columns width_percentages must add up to less than 100
11
+ # * +justify_header+ - Optional param that takes a symbol (:left or :right) that determines the justification of the column header
12
+ # * +justify_row+ - Optional param that takes a symbol (:left or :right) that determines the justification of the column cells
13
+ def initialize(header, width_percentage, justify_header: :left, justify_row: :left)
14
+ @header = header
15
+ @width_percentage = width_percentage
16
+ @justify_header = justify_header
17
+ @justify_row = justify_row
18
+ end
19
+ attr_reader :width_percentage, :header, :justify_row, :justify_header
9
20
  end
@@ -1,57 +1,75 @@
1
1
  require_relative './flexible_column'
2
2
  require_relative './print_helper'
3
3
  require 'io/console'
4
+ require_relative './terminal_utils'
4
5
 
6
+ ##
7
+ # This is the main class for creating Tables. The user can create a series of columns, and the print those columns out.
8
+ # See the README for more example usages.
9
+ #
10
+ # === Examples
11
+ #
12
+ # table = FlexibleTable.new
13
+ # table.add_column("I'm the first column", 10)
14
+ # table.add_column("I'm the second column", 10)
15
+ # table.print_header
16
+ # table.print_row("I'll be in column 1", "I'll be in column 2")
17
+ # table.print_row("I'll be in column 1", "I'll be in column 2")
18
+ # table.print_row("I'll be in column 1", "I'll be in column 2")
5
19
  class FlexibleTable
6
- include PrintHelper
7
-
8
- def initialize
9
- @screen_width = IO.console.winsize[1]
10
- @columns = []
11
- end
12
-
13
- def add_column(title, width_percentage, **args)
14
- @columns << FlexibleColumn.new(title, width_percentage, args)
15
- end
16
-
17
- def print_header()
18
- validate_column_width_percentages
19
-
20
- @columns.each_with_index do |col, index|
21
- abs_width = get_abs_width(col.width_percentage, 3)
22
- output = get_printable_output(col.header, abs_width)
23
-
24
- if(@columns[index].justify_header == :left)
25
- printf("%-#{abs_width}s", output)
26
- elsif(@columns[index].justify_header == :right)
27
- printf("%#{abs_width}s", output)
28
- else
29
- printf("%-#{abs_width}s", output) # default to left justify
30
- end
31
- printf(' | ') unless index == (@columns.length - 1)
32
- end
33
-
34
- puts "\n"
35
- print_header_line
36
- end
37
-
38
- def print_row(*args)
39
- validate_column_width_percentages
40
-
41
- args.each_with_index do |element, index|
42
- abs_width = get_abs_width(@columns[index].width_percentage, 3)
43
- output = get_printable_output(element, abs_width)
44
-
45
- if(@columns[index].justify_row == :left)
46
- printf("%-#{abs_width}s", output)
47
- elsif(@columns[index].justify_row == :right)
48
- printf("%#{abs_width}s", output)
49
- else
50
- printf("%-#{abs_width}s", output) # default to left justify
51
- end
52
-
53
- printf(' | ') unless index == (@columns.length - 1)
54
- end
55
- puts "\n"
56
- end
20
+ include PrintHelper
21
+
22
+ def initialize
23
+ @total_screen_columns = IO.console.winsize[1]
24
+ @columns = []
25
+ end
26
+
27
+ def add_column(title, width_percentage, **args)
28
+ @columns << FlexibleColumn.new(title, width_percentage, args)
29
+ end
30
+
31
+ def print_header()
32
+ exit unless columns_fit_screen?(@columns)
33
+
34
+ @columns.each_with_index do |col, index|
35
+ abs_width = get_abs_column_width(@total_screen_columns, col.width_percentage)
36
+ color_prefix = col.header.instance_eval { @tu_color_prefix } || ''
37
+ color_suffix = col.header.instance_eval { @tu_color_suffix } || ''
38
+ output = get_printable_output(col.header, abs_width)
39
+
40
+ if(@columns[index].justify_header == :left)
41
+ printf("%s%-#{abs_width}s%s", color_prefix, output, color_suffix)
42
+ elsif(@columns[index].justify_header == :right)
43
+ printf("%s%#{abs_width}s%s", color_prefix, output, color_suffix)
44
+ else
45
+ printf("%s%-#{abs_width}s%s", color_prefix, output, color_suffix) # default to left justify
46
+ end
47
+ print_column_separator unless index == (@columns.length - 1)
48
+ end
49
+
50
+ puts "\n"
51
+ print_header_line(@total_screen_columns)
52
+ end
53
+
54
+ def print_row(*args)
55
+ exit unless columns_fit_screen?(@columns)
56
+
57
+ args.each_with_index do |element, index|
58
+ abs_width = get_abs_column_width(@total_screen_columns, @columns[index].width_percentage)
59
+ color_prefix = element.instance_eval { @tu_color_prefix } || ''
60
+ color_suffix = element.instance_eval { @tu_color_suffix } || ''
61
+ output = get_printable_output(element, abs_width)
62
+
63
+ if(@columns[index].justify_row == :left)
64
+ printf("%s%-#{abs_width}s%s", color_prefix, output, color_suffix)
65
+ elsif(@columns[index].justify_row == :right)
66
+ printf("%s%#{abs_width}s%s", color_prefix, output, color_suffix)
67
+ else
68
+ printf("%s%-#{abs_width}s%s", color_prefix, output, color_suffix) # default to left justify
69
+ end
70
+
71
+ print_column_separator unless index == (@columns.length - 1)
72
+ end
73
+ puts "\n"
74
+ end
57
75
  end
data/lib/print_helper.rb CHANGED
@@ -1,33 +1,70 @@
1
1
  module PrintHelper
2
- private
3
- def get_abs_width(width_percentage, offset=0)
4
- abs_width = (Integer(((width_percentage.to_f / 100.to_f) * @screen_width.to_f).floor)) - offset
5
-
6
- return abs_width <= 0 ? 1 : abs_width
7
- end
8
-
9
- def get_printable_output(str, abs_width)
10
- return str.to_s[0..(abs_width - 1)]
11
- end
12
-
13
- def print_header_line
14
- line_header = ''
15
-
16
- @columns.each do |col|
17
- get_abs_width(col.width_percentage).times do |t|
18
- line_header << '-'
19
- end
20
- end
21
- puts "#{line_header}\n"
22
- end
23
-
24
- def validate_column_width_percentages
25
- total_percentage = (@columns.map { |x| x.width_percentage }).reduce(:+)
26
- if(total_percentage > 100)
27
- puts "Your column percentages can't add up to more than 100%\n"
28
- @columns.each { |col| puts "\t#{col.header}: \t#{col.width_percentage}" }
29
- puts "\tTotal percetage: #{total_percentage}"
30
- exit
31
- end
32
- end
2
+ ##
3
+ # Returns the width that a column should occupy based on screen size
4
+ #
5
+ # === Attributes
6
+ #
7
+ # +total_screen_columns+ - An Integer representing columns on the terminal window
8
+ # +width_percentage+ - An Integer representing the percentage of the total_screen_columns that the column should occupy
9
+ def get_column_width(total_screen_columns, width_percentage)
10
+ column_width = (Integer(((width_percentage.to_f / 100.to_f) * total_screen_columns.to_f).floor))
11
+
12
+ return column_width
13
+ end
14
+
15
+ ##
16
+ # Returns a slightly truncated version of #get_column_width in order to compensate for different font sizes.
17
+ # This is the method that should be used when calculating what gets printed into a column
18
+ #
19
+ # === Attributes
20
+ #
21
+ # +total_screen_columns+ - An Integer representing columns on the terminal window
22
+ # +width_percentage+ - An Integer representing the percentage of the total_screen_columns that the column should occupy
23
+ def get_abs_column_width(total_screen_columns, width_percentage)
24
+ column_width = get_column_width(total_screen_columns, width_percentage) - 3
25
+
26
+ return column_width <= 0 ? 1 : column_width
27
+ end
28
+
29
+ def get_printable_output(str, abs_width)
30
+ return str.to_s[0..(abs_width - 1)]
31
+ end
32
+
33
+ def print_header_line(total_screen_columns)
34
+ line_header = ''
35
+ separator = tty_supports_unicode? ? "\u2500" : '-'
36
+
37
+ @columns.each do |col|
38
+ get_column_width(total_screen_columns, col.width_percentage).times do |t|
39
+ line_header << separator
40
+ end
41
+ end
42
+ puts "#{line_header}\n"
43
+ end
44
+
45
+ def columns_fit_screen?(columns)
46
+ total_percentage = (columns.map { |x| x.width_percentage }).reduce(:+)
47
+ if(total_percentage > 100)
48
+ puts "Your column percentages can't add up to more than 100\n"
49
+ columns.each { |col| puts "\t#{col.header}: \t#{col.width_percentage}" }
50
+ puts "\tTotal percetage: #{total_percentage}"
51
+
52
+ return false
53
+ else
54
+ return true
55
+ end
56
+ end
57
+
58
+ def print_column_separator
59
+ separator = tty_supports_unicode? ? "\u2502" : '|'
60
+
61
+ printf(" #{separator} ")
62
+ end
63
+
64
+ private
65
+ def tty_supports_unicode?
66
+ @tty_is_unicode_enabled ||= ENV.values_at("LC_ALL","LC_CTYPE","LANG").compact.any? { |x| x.downcase.include?('utf-8') }
67
+
68
+ return @tty_is_unicode_enabled
69
+ end
33
70
  end
@@ -0,0 +1,89 @@
1
+ module TerminalUtils
2
+ ##
3
+ #
4
+ # This is a refinement on String that adds some properties to the String that represent ANSI Escape Sequences
5
+ #
6
+ # === Examples
7
+ #
8
+ # # Set the String foreground color property to red
9
+ # 'hello'.fg_red.tu_color_prefix
10
+ # => "\e[31m"
11
+ #
12
+ # 'hello'.fg_red.tu_color_suffix
13
+ # => "\e[0m"
14
+ #
15
+ #
16
+ # # Set the background color property to red
17
+ # 'hello'.bg_red.tu_color_prefix
18
+ # => "\e[41m"
19
+ #
20
+ # 'hello'.bg_red.tu_color_suffix
21
+ # => "\e[0m"
22
+ #
23
+ #
24
+ # # Set the foreground to red and the background to black
25
+ # 'hello'.fg_red.bg_black.tu_color_prefix
26
+ # => "\e[31m\e[40m"
27
+ #
28
+ # 'hello'.fg_red.bg_black.tu_color_suffix
29
+ # => "\e[0m"
30
+ module Color
31
+ refine String do
32
+ def fg_default; return fg_color("\e[39m"); end
33
+ def fg_black; return fg_color("\e[30m"); end
34
+ def fg_red; return fg_color("\e[31m"); end
35
+ def fg_green; return fg_color("\e[32m"); end
36
+ def fg_yellow; return fg_color("\e[33m"); end
37
+ def fg_blue; return fg_color("\e[34m"); end
38
+ def fg_magenta; return fg_color("\e[35m"); end
39
+ def fg_cyan; return fg_color("\e[36m"); end
40
+ def fg_grey; return fg_color("\e[37m"); end
41
+ def fg_bright_black; return fg_color("\e[90m"); end
42
+ def fg_bright_red; return fg_color("\e[91m"); end
43
+ def fg_bright_green; return fg_color("\e[92m"); end
44
+ def fg_bright_yellow; return fg_color("\e[93m"); end
45
+ def fg_bright_blue; return fg_color("\e[94m"); end
46
+ def fg_bright_magenta; return fg_color("\e[95m"); end
47
+ def fg_bright_cyan; return fg_color("\e[96m"); end
48
+ def fg_bright_grey; return fg_color("\e[97m"); end
49
+
50
+ def bg_default; return fg_color("\e[49m"); end
51
+ def bg_black; return bg_color("\e[40m"); end
52
+ def bg_red; return bg_color("\e[41m"); end
53
+ def bg_green; return bg_color("\e[42m"); end
54
+ def bg_yellow; return bg_color("\e[43m"); end
55
+ def bg_blue; return bg_color("\e[44m"); end
56
+ def bg_magenta; return bg_color("\e[45m"); end
57
+ def bg_cyan; return bg_color("\e[46m"); end
58
+ def bg_grey; return bg_color("\e[47m"); end
59
+ def bg_bright_black; return bg_color("\e[100m"); end
60
+ def bg_bright_red; return bg_color("\e[101m"); end
61
+ def bg_bright_green; return bg_color("\e[102m"); end
62
+ def bg_bright_yellow; return bg_color("\e[103m"); end
63
+ def bg_bright_blue; return bg_color("\e[104m"); end
64
+ def bg_bright_magenta; return bg_color("\e[105m"); end
65
+ def bg_bright_cyan; return bg_color("\e[106m"); end
66
+ def bg_bright_grey; return bg_color("\e[107m"); end
67
+
68
+ private
69
+ def fg_color(ansi_code)
70
+ @tu_fg_color = ansi_code
71
+
72
+ return color_string
73
+ end
74
+
75
+ def bg_color(ansi_code)
76
+ @tu_bg_color = ansi_code
77
+
78
+ return color_string
79
+ end
80
+
81
+ def color_string
82
+ @tu_color_prefix = [@tu_fg_color, @tu_bg_color].compact.join('')
83
+ @tu_color_suffix = "\e[0m"
84
+
85
+ return self
86
+ end
87
+ end
88
+ end
89
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flexible_table
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Sykes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-02 00:00:00.000000000 Z
11
+ date: 2016-10-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Prints a table that can have different column widths that also respond
14
14
  in size relative to the size of the terminal window
@@ -20,6 +20,7 @@ files:
20
20
  - lib/flexible_column.rb
21
21
  - lib/flexible_table.rb
22
22
  - lib/print_helper.rb
23
+ - lib/terminal_utils.rb
23
24
  homepage: https://github.com/bretts/flexible_table
24
25
  licenses:
25
26
  - MIT
@@ -40,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
41
  version: '0'
41
42
  requirements: []
42
43
  rubyforge_project:
43
- rubygems_version: 2.5.1
44
+ rubygems_version: 2.6.7
44
45
  signing_key:
45
46
  specification_version: 4
46
47
  summary: Prints a table that can have different column widths that also respond in