nazar 0.1.1 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3ea71c523b3f82b6882bdcb11b842e53b4f2283bc95d1ab5e8c0e17e2b1c9b6
4
- data.tar.gz: 97017a09da4032dd35b90e34cd49cf92e96473f7c1f001a8f9ffab1c93ae6d2f
3
+ metadata.gz: 2f577a21e50d8bf8606ed8e8bf115a2c2fb0909b2ee7c1fae72fb4ef871064d0
4
+ data.tar.gz: '0609ff110d8ce48f3df2fd297ccd02e047d6730985b2698f9592c8f68e39df1b'
5
5
  SHA512:
6
- metadata.gz: cb511b109dc83d28057e6454a5d438e799cfbb0a6eb64d2f0c55ae53dd8e92c19f0c78b4a361452307e41999738972260e2b5b4b6dc347c05ddaf81e49b452bd
7
- data.tar.gz: 5c0f4e67fea1a380606dd75bac52de072ac9851f70b844ee8ba1464c73592e49cde3f0449fcb208cdb912b938e067fce4a8af0a7d5f7076e244e6b78d2cfa336
6
+ metadata.gz: fbf98c584b508c82a19e69730403dda91e54b3f5d6c6a833ba535149591647445c14222b4bda7440090565c5b97a5e777c0b33d331c6a90194b3f32ac5962d03
7
+ data.tar.gz: da49a17743f2676d1178eb76df8e17c93752f6ad4d22dbe6195398a59f34ec4121315ffb4007c87ee704ed2d9fc4507fd9d9ac87ef72fbafb98eb933f8e1725d
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -57,13 +57,13 @@ group :development, :test do
57
57
  gem 'nazar', require: false
58
58
  end
59
59
  ```
60
- Then, you have to call `Nazar.enable!`. If you're using Rails, you might want to add this snippet to `config/application.rb`:
60
+ Then, you have to call `Nazar.enable!`. If you're using Rails, you might want to add this snippet to `config/application.rb`:
61
61
 
62
62
  ```ruby
63
63
  console do
64
64
  require 'nazar'
65
65
 
66
- Nazar.enable! # See configuration section for more options and
66
+ Nazar.enable! # See configuration section for more options and
67
67
  # Opt-in setup section if you don't want to enable it for every item
68
68
  end
69
69
  ```
@@ -73,15 +73,15 @@ Otherwise, call it in `bin/console` or any other script that launches your REPL.
73
73
 
74
74
  This is my recommended way to install this gem - that way it works automatically in all your projects, even in standalone `irb` or `pry` sessions.
75
75
 
76
- - **Create global gems path**
77
-
76
+ - **Create global gems path**
77
+
78
78
  `mkdir -p ~/.gem/ruby/global` - You're welcome to use any other path for your global gemset
79
79
  - **Install nazar in your global gemset**
80
-
80
+
81
81
  `gem install nazar -i ~/.gem/ruby/global`
82
82
  - **Load Nazar in your REPL rc file**
83
83
  Add following snippet to your `.irbrc` or `.pryrc`:
84
-
84
+
85
85
  ```ruby
86
86
  global_gemset_path = File.expand_path('~/.gem/ruby/global/gems')
87
87
 
@@ -91,7 +91,7 @@ if Dir.exist?(global_gemset_path)
91
91
  $LOAD_PATH.unshift(*global_gems_path)
92
92
  end
93
93
 
94
- %w[nazar].each do |gem|
94
+ %w[nazar].each do |gem| # add more gems you want to load globally
95
95
  begin
96
96
  require gem
97
97
  rescue LoadError
@@ -101,16 +101,92 @@ end
101
101
  Nazar.enable! if defined?(Nazar)
102
102
  ```
103
103
 
104
+ ## Layouts
105
+ `Nazar.config.formatter.layout` can be set to either `:horizontal`, `:vertical` or `:auto`.
106
+
107
+ `:auto` uses horizontal layout if it fits in your console size, otherwise it falls back to `:vertical` layout.
108
+
109
+ Here's a preview of both layouts:
110
+
111
+ #### Horizontal
112
+ ```ruby
113
+ ┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┓
114
+ ┃ id │ email │ name │ description │ created_at │ updated_at │ active │ last_login_at ┃
115
+ ┣═══════╪══════════════════════════════════════╪══════════════════════╪═══════════════════════════════════════════════════════════════════════╪═════════════════════════╪═════════════════════════╪════════╪═════════════════════════┫
116
+ ┃ 1 │ delma@goldner.co │ Mrs. Charis Brown │ Quasi atque ea. Beatae corporis quia. Eveniet velit ad. │ 2021-09-01 05:42:24 UTC │ 2021-09-20 09:36:29 UTC │ ✗ │ ∅ ┃
117
+ ┃ 2 │ markpfeffer@wunschbraun.info │ Ms. Sherice Champlin │ Omnis ut illum. Non velit mollitia. Expedita facilis dignissimos. │ 2021-09-10 07:27:00 UTC │ 2021-09-20 09:36:29 UTC │ ✓ │ 2021-09-19 16:25:32 UTC ┃
118
+ ┃ 3 │ nathansimonis@kunde.org │ Florentino Gleason │ Non recusandae eos. Et voluptates iusto. Commodi est in. │ 2021-09-07 18:24:45 UTC │ 2021-09-20 09:36:29 UTC │ ✗ │ ∅ ┃
119
+ ┃ 4 │ edwardowilkinson@walkerschiller.info │ Judie Boehm │ Ut ea eum. Tempore voluptates praesentium. Animi sapiente distinctio. │ 2021-09-05 02:11:36 UTC │ 2021-09-20 09:36:29 UTC │ ✓ │ 2021-09-19 20:17:24 UTC ┃
120
+ ┃ 5 │ isaiahebert@brauncarroll.net │ Mari Ullrich │ Aperiam quas voluptas. Autem alias quia. Aut perspiciatis eos. │ 2021-09-09 05:23:03 UTC │ 2021-09-20 09:36:29 UTC │ ∅ │ ∅ ┃
121
+ ┠───────┼──────────────────────────────────────┴──────────────────────┴───────────────────────────────────────────────────────────────────────┴─────────────────────────┴─────────────────────────┴────────┴─────────────────────────┨
122
+ ┃ Total │ 5 ┃
123
+ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
124
+ ```
125
+
126
+ ### Vertical
127
+ ```ruby
128
+ User.first(5)
129
+
130
+ ┏━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
131
+ ┃ id │ 1 ┃
132
+ ┃ email │ delma@goldner.co ┃
133
+ ┃ name │ Mrs. Charis Brown ┃
134
+ ┃ description │ Quasi atque ea. Beatae corporis quia. Eveniet velit ad. ┃
135
+ ┃ created_at │ 2021-09-01 05:42:24 UTC ┃
136
+ ┃ updated_at │ 2021-09-20 09:36:29 UTC ┃
137
+ ┃ active │ ✗ ┃
138
+ ┃ last_login_at │ ∅ ┃
139
+ ┠───────────────┼───────────────────────────────────────────────────────────────────────┨
140
+ ┃ id │ 2 ┃
141
+ ┃ email │ markpfeffer@wunschbraun.info ┃
142
+ ┃ name │ Ms. Sherice Champlin ┃
143
+ ┃ description │ Omnis ut illum. Non velit mollitia. Expedita facilis dignissimos. ┃
144
+ ┃ created_at │ 2021-09-10 07:27:00 UTC ┃
145
+ ┃ updated_at │ 2021-09-20 09:36:29 UTC ┃
146
+ ┃ active │ ✓ ┃
147
+ ┃ last_login_at │ 2021-09-19 16:25:32 UTC ┃
148
+ ┠───────────────┼───────────────────────────────────────────────────────────────────────┨
149
+ ┃ id │ 3 ┃
150
+ ┃ email │ nathansimonis@kunde.org ┃
151
+ ┃ name │ Florentino Gleason ┃
152
+ ┃ description │ Non recusandae eos. Et voluptates iusto. Commodi est in. ┃
153
+ ┃ created_at │ 2021-09-07 18:24:45 UTC ┃
154
+ ┃ updated_at │ 2021-09-20 09:36:29 UTC ┃
155
+ ┃ active │ ✗ ┃
156
+ ┃ last_login_at │ ∅ ┃
157
+ ┠───────────────┼───────────────────────────────────────────────────────────────────────┨
158
+ ┃ id │ 4 ┃
159
+ ┃ email │ edwardowilkinson@walkerschiller.info ┃
160
+ ┃ name │ Judie Boehm ┃
161
+ ┃ description │ Ut ea eum. Tempore voluptates praesentium. Animi sapiente distinctio. ┃
162
+ ┃ created_at │ 2021-09-05 02:11:36 UTC ┃
163
+ ┃ updated_at │ 2021-09-20 09:36:29 UTC ┃
164
+ ┃ active │ ✓ ┃
165
+ ┃ last_login_at │ 2021-09-19 20:17:24 UTC ┃
166
+ ┠───────────────┼───────────────────────────────────────────────────────────────────────┨
167
+ ┃ id │ 5 ┃
168
+ ┃ email │ isaiahebert@brauncarroll.net ┃
169
+ ┃ name │ Mari Ullrich ┃
170
+ ┃ description │ Aperiam quas voluptas. Autem alias quia. Aut perspiciatis eos. ┃
171
+ ┃ created_at │ 2021-09-09 05:23:03 UTC ┃
172
+ ┃ updated_at │ 2021-09-20 09:36:29 UTC ┃
173
+ ┃ active │ ∅ ┃
174
+ ┃ last_login_at │ ∅ ┃
175
+ ┠───────────────┼───────────────────────────────────────────────────────────────────────┨
176
+ ┃ Total │ 5 ┃
177
+ ┗━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
178
+ ```
179
+
104
180
  ## Shorthand method
105
181
 
106
- Nazar defines top level `__(data)` method, that can be useful for two things:
182
+ Nazar defines top level `__(data, **options)` method, that can be useful for two things:
107
183
 
108
184
  ### Inspecting (array of) Hashes/Structs
109
185
 
110
186
  Nazar by design won't enhance output for any collection that does not consist of supported (eg. ActiveRecord/Sequel) items. If you have a data that is structurally compatible (ie: all items consists of the same keys), and want to enahance the output, you can simply use `#__` method:
111
187
 
112
188
  ```ruby
113
- __ [{foo: :bar, test: 123},{foo: :baz, test: 456}]
189
+ __([{foo: :bar, test: 123},{foo: :baz, test: 456}])
114
190
  ┏━━━━━━━┯━━━━━━┓
115
191
  ┃ foo │ test ┃
116
192
  ┣═══════╪══════┫
@@ -123,6 +199,21 @@ __ [{foo: :bar, test: 123},{foo: :baz, test: 456}]
123
199
 
124
200
  It works with Structs and Hashes (or, more specifically - with any object that reponds to `#keys` and `#values`)
125
201
 
202
+ You can also enforce layout and/or pagination:
203
+
204
+ ```ruby
205
+ __([{foo: :bar, test: 123},{foo: :baz, test: 456}], layout: :vertical)
206
+ ┏━━━━━━━┯━━━━━━┓
207
+ ┃ foo │ :bar ┃
208
+ ┃ test │ 123 ┃
209
+ ┠───────┼──────┨
210
+ ┃ foo │ :baz ┃
211
+ ┃ test │ 456 ┃
212
+ ┠───────┼──────┨
213
+ ┃ Total │ 2 ┃
214
+ ┗━━━━━━━┷━━━━━━┛
215
+ ```
216
+
126
217
  ### Opt-in setup
127
218
 
128
219
  If you use `Nazar.load!` instead of `Nazar.enable!`, it would not enhance output for every element in the console. Instead, you have to call `#__` for each item that you want to enhance output
@@ -134,7 +225,6 @@ User.all # Returns default output
134
225
  __ User.all # Returns output enhanced by Nazar
135
226
  ```
136
227
 
137
-
138
228
  ## Configuration
139
229
 
140
230
  By default, Nazar improves output for ActiveRecord (both collections and a single item) and for CSV Tables. You can configure that by calling `#enable!` with optional argument:
@@ -146,7 +236,9 @@ You can also configure behaviour of Nazar:
146
236
  | Config | Default | Description |
147
237
  | ------ | ------- | ----------- |
148
238
  | `Nazar.config.colors.enabled` | true | Determines whether the output should be colorised or not |
149
- | `Nazar.config.formatter.nil` | `∅` | Sets character printed if the value was nil |
239
+ | `Nazar.config.formatter.nil` | `∅` | Sets character printed if the value was nil |
240
+ | `Nazar.config.formatter.layout` | `:auto` | Determines which layout should be used. See <a href="#layouts">Layouts</a> for more details |
241
+ | `Nazar.config.formatter.paginate` | `true` | Determines if results too long/wide should be printed directly, or paginated with `less`. Horizontal layout is always paginated.
150
242
  | `Nazar.config.formatter.boolean` | ['✓', '✗'] | First item in array is a character for `true`, second for `false` |
151
243
  | `Nazar.config.enable_shorthand_method` | true | Determines if shorthand method should be defined. See <a href="#opt-in-setup">Opt-in setup</a> for more details |
152
244
 
data/certs/krzyzak.pem CHANGED
@@ -1,27 +1,27 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIEgjCCAuqgAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MTMwMQYDVQQDDCptaWNo
3
- YWwua3J6eXphbm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wHhcNMjEwOTE3
4
- MTYyMDMyWhcNMjIwOTE3MTYyMDMyWjA1MTMwMQYDVQQDDCptaWNoYWwua3J6eXph
3
+ YWwua3J6eXphbm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wHhcNMjIwOTE5
4
+ MTQwNDQyWhcNMjMwOTE5MTQwNDQyWjA1MTMwMQYDVQQDDCptaWNoYWwua3J6eXph
5
5
  bm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUA
6
- A4IBjwAwggGKAoIBgQDEWgTDpbt17SytlzKcnFAeiNeL95n0/kwX6ubyXItTDKlG
7
- Tw4KuDrqp2rcEZZhbqVLfJX3NgAFpme6fC1sg6KfG6b5w6g+b9NBw4q1+gw1LS0J
8
- SITmgZJrMOqsX6YLeMWK5+guFuj8dhHb18IbLgS6q/+cLHQvfWMz9m0Nz6bh7p1D
9
- ydK1TaRk9QcSd9c0RoSQ8psqPoHMzqZ28+UceDMrpPPqzJXNfusibUvF/lETribm
10
- pKEiwybVh5IouMcWs5gplukkreJyjnCX19aFk3yPlQZaNp1Uly9qgO5Q5Z4gmD4M
11
- 24sZ5KxNrc7LCMC6D5KnkSPRo+nj7biIfAii6wrN7cdSValR3yJdczxSEiKBSr3Y
12
- kxQT9c53i+ouYerAGlmVmW1AfsIyt6S0eRHpeYpYo2PwX9jcnUsCfYkKBpV1ZgWr
13
- /unnOrhQT2noEzKHpi5A5kyj+woLMjHGZ8oSSwHNUurlgVGpj+K08Aci73KILTPd
14
- modoWl+EM350UUcektUCAwEAAaOBnDCBmTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
15
- sDAdBgNVHQ4EFgQUdFw+GB412vZ1HGQ7vuKqB09p45wwLwYDVR0RBCgwJoEkbWlj
6
+ A4IBjwAwggGKAoIBgQC22POIs4KtFipZ5W1nYbBu2iUck//fJrhyssXVxnljkZr/
7
+ 8P6/BH9SiWmyatDQ+LiYug72olUoMQ2wRoZzEn58ZllZlHfPJSQ5QnIjKjITWHJt
8
+ iBi/ou31T0/OU7KVnPzryMKBL9smbxhwRbBrQlT8nV5rfHXCrpvGdOElM3EvNWwR
9
+ HM7Klal/3zlr3q/X3BZQvOp8R8hmR6OYtgNrYclS6IkvqKpcD9Y3q8K4Snz6RZ3o
10
+ DGp0QW28cF5m6CJ+N7KpQkASPuFFMAjnqyhE6r5VsklxR7I083UI1JLVOq/+s6Yt
11
+ kbCBqscI55BwcYakszStNqJXiqrEOqUEdcg5tkzc0PFC+ZEzWbMU1RTox17N1pwG
12
+ VGtdE/3OxK2A/hm6GM/sFPR2ig7wRSBs6AI9bwbv259RzHvm4wr1yQDAQzuNWeyZ
13
+ Wd3/SkNDN3nEF9mTEF1pyRC4UO2+tvQc5YOoW66a6W/gNyhGQk4QFT39Pt1Mq/VX
14
+ Ec8+0b1uEAKvD+z9xPcCAwEAAaOBnDCBmTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
15
+ sDAdBgNVHQ4EFgQUSu4g81ThKkq44UAqzDkZQAEi4eUwLwYDVR0RBCgwJoEkbWlj
16
16
  aGFsLmtyenl6YW5vd3NraStnaXRodWJAZ21haWwuY29tMC8GA1UdEgQoMCaBJG1p
17
17
  Y2hhbC5rcnp5emFub3dza2krZ2l0aHViQGdtYWlsLmNvbTANBgkqhkiG9w0BAQsF
18
- AAOCAYEAw0q3kANMgrsHJ76bt86tTfJhMFhqldTzlXE92nuM8wTonNTiuwNpbJW0
19
- sd2mK/n0Lm4kfe/wt5uwtvggtxhmoH8Sac1VyLiVOj+/7jfymYbxfMCC8uGDsPX0
20
- CU7u/Mp+Dr9U8PXIM+ICQ5PmhxZjK0BUXZlZ18shGI1mFY+v0FwjDNYgTgmiHAiW
21
- rH93qOM3GH6L1NykkBnmwZyLtIYhEvMpWebqojW+A3wrhxrVUG7XiqMrn2vy0pZW
22
- 9SRgzlg5M1H3rU+RJVp8ve5Nz1gfb0C5kXnOtvDQuLAX+8OzE/kPi8K0lCKvfJpC
23
- 3HPm1Il1fZp5WMnGj4zsIIESYj9j0Q12x9yygZGPksZrgcbdho1lBaZTt0+eqTVq
24
- JWaxXNTngvP87JEn1IlU2S+n2huSBtSd+h3UaubUMDUanTewtjfp1HOpGdN5qTsS
25
- FlwFUDGjWAe8lcsjyGp1dox0FK91TAHdZW1op8LYnOcO2DM8Mgzu4Gp7mibATEnx
26
- ooN2pwmH
18
+ AAOCAYEAfmM8QzJAfeZkmHonfleoiIIFNSeG84wK/MWBGKr0VMIalhNHpR6DQbao
19
+ 5kAQh7PMWjPr0n3ZHUT4QU7lqp1/eiErEXtKAExnxRefzWSHNm0WjXT/dIyFUbYQ
20
+ rRnKtabxRNWtRIrK3GecPBDtAVTRtYQQkCaSwbwE37sHJhntS/Dvnl8pw2THq7ef
21
+ XbhPDcqmP+yWRCszn9Hzda19+8VA6Sn+fIwevXMUgvb3VHqLYcIO2amHtnCeM8Q5
22
+ caYBi+Tx9EDFh04EE4rbUGX25RcLO43j3ShLLqfW6QHFUtJIKS7WhgBVoEGvNA35
23
+ 2KAZEiV7+ByRFKndeJmFtom0GMNBYPQW4l96aCrQJZyVhWSWGQZornxbH+hylJEp
24
+ on5yD3vJbVQXzwm0Z4I1IH5xc4YbEepCQRK6u/cT6NuiQqbqeW82BxjXMPu4HVBy
25
+ WXVb638bzH4OYBIYuGcw50jqBK1SyDx4exzThr6KxSiGwhAKj2xFqy51MIQjfUN0
26
+ TL5B7Buq
27
27
  -----END CERTIFICATE-----
@@ -27,7 +27,7 @@ module Nazar
27
27
  end
28
28
 
29
29
  def self.valid?(data)
30
- item = data.first
30
+ item = data&.first
31
31
  compatible = item.respond_to?(:keys) && item.respond_to?(:values)
32
32
 
33
33
  data.is_a?(Enumerable) && (item.is_a?(Struct) || compatible)
@@ -2,13 +2,19 @@
2
2
 
3
3
  module Nazar
4
4
  class Renderer
5
- def initialize(data, use_generic_formatter: false)
5
+ def initialize(data, layout:, paginate:, use_generic_formatter: false)
6
6
  @data = data
7
7
  @use_generic_formatter = use_generic_formatter
8
+ @layout = layout
9
+ @paginate = paginate
8
10
  end
9
11
 
10
12
  def render
11
- pager.page(view.render)
13
+ if paginate || view.horizontal?
14
+ pager.page(view.render)
15
+ else
16
+ puts view.render
17
+ end
12
18
  nil
13
19
  end
14
20
 
@@ -22,10 +28,10 @@ module Nazar
22
28
 
23
29
  private
24
30
 
25
- attr_reader :data
31
+ attr_reader :data, :use_generic_formatter, :layout, :paginate
26
32
 
27
33
  def view
28
- @view ||= View.new(data, use_generic_formatter: @use_generic_formatter)
34
+ @view ||= View.new(data, use_generic_formatter: use_generic_formatter, layout: layout)
29
35
  end
30
36
  end
31
37
  end
data/lib/nazar/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nazar
4
- VERSION = '0.1.1'
4
+ VERSION = '1.0.0'
5
5
  end
data/lib/nazar/view.rb CHANGED
@@ -4,11 +4,12 @@ module Nazar
4
4
  class View
5
5
  extend Forwardable
6
6
 
7
- def_delegators :formatter, :headers, :cells, :summary
7
+ def_delegators :formatter, :headers, :summary
8
8
 
9
- def initialize(data, use_generic_formatter: false)
9
+ def initialize(data, layout:, use_generic_formatter: false)
10
10
  @data = data
11
11
  @use_generic_formatter = use_generic_formatter
12
+ @layout = layout
12
13
  end
13
14
 
14
15
  def render
@@ -23,10 +24,38 @@ module Nazar
23
24
  !!formatter_klass && formatter.valid?
24
25
  end
25
26
 
27
+ def layout
28
+ case @layout
29
+ when :auto
30
+ determine_layout
31
+ when :vertical
32
+ :vertical
33
+ when :horizontal
34
+ :horizontal
35
+ else
36
+ raise ArgumentError, "Unknown layout: #{Nazar.config.formatter.layout}"
37
+ end
38
+ end
39
+
40
+ def horizontal?
41
+ layout == :horizontal
42
+ end
43
+
26
44
  private
27
45
 
28
46
  attr_reader :data, :use_generic_formatter
29
47
 
48
+ def determine_layout
49
+ table_width > TTY::Screen.width ? :vertical : :horizontal
50
+ end
51
+
52
+ def table_width
53
+ [
54
+ headers.map(&:size).sum,
55
+ horizontal_cells.map { |row| row.map(&:size).sum }.max
56
+ ].max
57
+ end
58
+
30
59
  def formatters
31
60
  @formatters ||= Nazar.formatters.tap do |formatters|
32
61
  formatters << Nazar::Formatter::Generic if use_generic_formatter
@@ -42,18 +71,45 @@ module Nazar
42
71
  end
43
72
 
44
73
  def add_summary
74
+ colspan = horizontal? ? headers.size - 1 : 1
75
+
45
76
  table.add_separator
46
- table.add_row [pastel.bold('Total'), { value: summary, colspan: headers.size - 1 }]
77
+ table.add_row [pastel.bold('Total'), { value: summary, colspan: colspan }]
47
78
  end
48
79
 
49
80
  def table
50
81
  @table ||= Terminal::Table.new(
51
- headings: headers,
52
- rows: cells,
82
+ headings: display_headers,
83
+ rows: display_cells,
53
84
  style: { border: :unicode_thick_edge }
54
85
  )
55
86
  end
56
87
 
88
+ def display_headers
89
+ horizontal? ? formatter.headers : []
90
+ end
91
+
92
+ def display_cells
93
+ horizontal? ? horizontal_cells : vertical_cells
94
+ end
95
+
96
+ def horizontal_cells
97
+ formatter.cells
98
+ end
99
+
100
+ def vertical_cells
101
+ data = horizontal_cells.inject([]) do |output, items|
102
+ items.each.with_index do |item, index|
103
+ output << [headers[index], item]
104
+ end
105
+
106
+ output << :separator
107
+ end
108
+
109
+ data.pop # remove last separator
110
+ data
111
+ end
112
+
57
113
  def pastel
58
114
  @pastel ||= Pastel.new(enabled: Nazar.config.colors.enabled)
59
115
  end
data/lib/nazar.rb CHANGED
@@ -19,6 +19,8 @@ module Nazar # rubocop:disable Metrics/ModuleLength
19
19
  setting :formatter do
20
20
  setting :nil, default: '∅'
21
21
  setting :boolean, default: ['✓', '✗']
22
+ setting :layout, default: :auto
23
+ setting :paginate, default: true
22
24
  end
23
25
 
24
26
  setting :colors do
@@ -80,7 +82,8 @@ module Nazar # rubocop:disable Metrics/ModuleLength
80
82
  return unless defined?(Pry)
81
83
 
82
84
  proc do |output, value, instance|
83
- renderer = Nazar::Renderer.new(value)
85
+ renderer = Nazar::Renderer.new(value, layout: Nazar.config.formatter.layout,
86
+ paginate: Nazar.config.formatter.paginate)
84
87
  renderer.valid? ? renderer.render : @__original_pry_print.call(output, value, instance)
85
88
  end
86
89
  end
@@ -113,7 +116,8 @@ module Nazar # rubocop:disable Metrics/ModuleLength
113
116
  ::IRB::Irb.class_eval do
114
117
  alias_method :__original_output_value__, :output_value
115
118
  def output_value(omit = false) # rubocop:disable Style/OptionalBooleanParameter
116
- renderer = Nazar::Renderer.new(@context.last_value)
119
+ renderer = Nazar::Renderer.new(@context.last_value, layout: Nazar.config.formatter.layout,
120
+ paginate: Nazar.config.formatter.paginate)
117
121
  renderer.valid? ? renderer.render : __original_output_value__(omit)
118
122
  end
119
123
  end
@@ -137,8 +141,8 @@ module Nazar # rubocop:disable Metrics/ModuleLength
137
141
  @defined_shorthand_method = true
138
142
 
139
143
  Object.class_eval do
140
- def __(item)
141
- Nazar::Renderer.new(item, use_generic_formatter: true).render
144
+ def __(item, layout: Nazar.config.formatter.layout, paginate: Nazar.config.formatter.paginate)
145
+ Nazar::Renderer.new(item, use_generic_formatter: true, layout: layout, paginate: paginate).render
142
146
  end
143
147
  end
144
148
  end
data/nazar.gemspec CHANGED
@@ -2,17 +2,19 @@
2
2
 
3
3
  require_relative 'lib/nazar/version'
4
4
 
5
- Gem::Specification.new do |spec|
5
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
6
6
  spec.name = 'nazar'
7
7
  spec.version = Nazar::VERSION
8
8
  spec.authors = ['Michał Krzyżanowski']
9
9
  spec.email = ['michal.krzyzanowski+github@gmail.com']
10
+ spec.licenses = ['MIT']
10
11
 
11
12
  spec.summary = 'Nazar is a tool that enhances default IRB/Pry inspect output'
12
13
  spec.homepage = 'https://github.com/krzyzak/nazar'
13
14
  spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
14
15
 
15
16
  spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['rubygems_mfa_required'] = 'true'
16
18
 
17
19
  # Specify which files should be added to the gem when it is released.
18
20
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -36,4 +38,5 @@ Gem::Specification.new do |spec|
36
38
  spec.add_runtime_dependency 'pastel', '~> 0.8'
37
39
  spec.add_runtime_dependency 'terminal-table', '~> 3.0'
38
40
  spec.add_runtime_dependency 'tty-pager', '~> 0.14'
41
+ spec.add_runtime_dependency 'tty-screen', '~> 0.8'
39
42
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nazar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michał Krzyżanowski
@@ -11,32 +11,32 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEgjCCAuqgAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MTMwMQYDVQQDDCptaWNo
14
- YWwua3J6eXphbm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wHhcNMjEwOTE3
15
- MTYyMDMyWhcNMjIwOTE3MTYyMDMyWjA1MTMwMQYDVQQDDCptaWNoYWwua3J6eXph
14
+ YWwua3J6eXphbm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wHhcNMjIwOTE5
15
+ MTQwNDQyWhcNMjMwOTE5MTQwNDQyWjA1MTMwMQYDVQQDDCptaWNoYWwua3J6eXph
16
16
  bm93c2tpX2dpdGh1Yi9EQz1nbWFpbC9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUA
17
- A4IBjwAwggGKAoIBgQDEWgTDpbt17SytlzKcnFAeiNeL95n0/kwX6ubyXItTDKlG
18
- Tw4KuDrqp2rcEZZhbqVLfJX3NgAFpme6fC1sg6KfG6b5w6g+b9NBw4q1+gw1LS0J
19
- SITmgZJrMOqsX6YLeMWK5+guFuj8dhHb18IbLgS6q/+cLHQvfWMz9m0Nz6bh7p1D
20
- ydK1TaRk9QcSd9c0RoSQ8psqPoHMzqZ28+UceDMrpPPqzJXNfusibUvF/lETribm
21
- pKEiwybVh5IouMcWs5gplukkreJyjnCX19aFk3yPlQZaNp1Uly9qgO5Q5Z4gmD4M
22
- 24sZ5KxNrc7LCMC6D5KnkSPRo+nj7biIfAii6wrN7cdSValR3yJdczxSEiKBSr3Y
23
- kxQT9c53i+ouYerAGlmVmW1AfsIyt6S0eRHpeYpYo2PwX9jcnUsCfYkKBpV1ZgWr
24
- /unnOrhQT2noEzKHpi5A5kyj+woLMjHGZ8oSSwHNUurlgVGpj+K08Aci73KILTPd
25
- modoWl+EM350UUcektUCAwEAAaOBnDCBmTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
26
- sDAdBgNVHQ4EFgQUdFw+GB412vZ1HGQ7vuKqB09p45wwLwYDVR0RBCgwJoEkbWlj
17
+ A4IBjwAwggGKAoIBgQC22POIs4KtFipZ5W1nYbBu2iUck//fJrhyssXVxnljkZr/
18
+ 8P6/BH9SiWmyatDQ+LiYug72olUoMQ2wRoZzEn58ZllZlHfPJSQ5QnIjKjITWHJt
19
+ iBi/ou31T0/OU7KVnPzryMKBL9smbxhwRbBrQlT8nV5rfHXCrpvGdOElM3EvNWwR
20
+ HM7Klal/3zlr3q/X3BZQvOp8R8hmR6OYtgNrYclS6IkvqKpcD9Y3q8K4Snz6RZ3o
21
+ DGp0QW28cF5m6CJ+N7KpQkASPuFFMAjnqyhE6r5VsklxR7I083UI1JLVOq/+s6Yt
22
+ kbCBqscI55BwcYakszStNqJXiqrEOqUEdcg5tkzc0PFC+ZEzWbMU1RTox17N1pwG
23
+ VGtdE/3OxK2A/hm6GM/sFPR2ig7wRSBs6AI9bwbv259RzHvm4wr1yQDAQzuNWeyZ
24
+ Wd3/SkNDN3nEF9mTEF1pyRC4UO2+tvQc5YOoW66a6W/gNyhGQk4QFT39Pt1Mq/VX
25
+ Ec8+0b1uEAKvD+z9xPcCAwEAAaOBnDCBmTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
26
+ sDAdBgNVHQ4EFgQUSu4g81ThKkq44UAqzDkZQAEi4eUwLwYDVR0RBCgwJoEkbWlj
27
27
  aGFsLmtyenl6YW5vd3NraStnaXRodWJAZ21haWwuY29tMC8GA1UdEgQoMCaBJG1p
28
28
  Y2hhbC5rcnp5emFub3dza2krZ2l0aHViQGdtYWlsLmNvbTANBgkqhkiG9w0BAQsF
29
- AAOCAYEAw0q3kANMgrsHJ76bt86tTfJhMFhqldTzlXE92nuM8wTonNTiuwNpbJW0
30
- sd2mK/n0Lm4kfe/wt5uwtvggtxhmoH8Sac1VyLiVOj+/7jfymYbxfMCC8uGDsPX0
31
- CU7u/Mp+Dr9U8PXIM+ICQ5PmhxZjK0BUXZlZ18shGI1mFY+v0FwjDNYgTgmiHAiW
32
- rH93qOM3GH6L1NykkBnmwZyLtIYhEvMpWebqojW+A3wrhxrVUG7XiqMrn2vy0pZW
33
- 9SRgzlg5M1H3rU+RJVp8ve5Nz1gfb0C5kXnOtvDQuLAX+8OzE/kPi8K0lCKvfJpC
34
- 3HPm1Il1fZp5WMnGj4zsIIESYj9j0Q12x9yygZGPksZrgcbdho1lBaZTt0+eqTVq
35
- JWaxXNTngvP87JEn1IlU2S+n2huSBtSd+h3UaubUMDUanTewtjfp1HOpGdN5qTsS
36
- FlwFUDGjWAe8lcsjyGp1dox0FK91TAHdZW1op8LYnOcO2DM8Mgzu4Gp7mibATEnx
37
- ooN2pwmH
29
+ AAOCAYEAfmM8QzJAfeZkmHonfleoiIIFNSeG84wK/MWBGKr0VMIalhNHpR6DQbao
30
+ 5kAQh7PMWjPr0n3ZHUT4QU7lqp1/eiErEXtKAExnxRefzWSHNm0WjXT/dIyFUbYQ
31
+ rRnKtabxRNWtRIrK3GecPBDtAVTRtYQQkCaSwbwE37sHJhntS/Dvnl8pw2THq7ef
32
+ XbhPDcqmP+yWRCszn9Hzda19+8VA6Sn+fIwevXMUgvb3VHqLYcIO2amHtnCeM8Q5
33
+ caYBi+Tx9EDFh04EE4rbUGX25RcLO43j3ShLLqfW6QHFUtJIKS7WhgBVoEGvNA35
34
+ 2KAZEiV7+ByRFKndeJmFtom0GMNBYPQW4l96aCrQJZyVhWSWGQZornxbH+hylJEp
35
+ on5yD3vJbVQXzwm0Z4I1IH5xc4YbEepCQRK6u/cT6NuiQqbqeW82BxjXMPu4HVBy
36
+ WXVb638bzH4OYBIYuGcw50jqBK1SyDx4exzThr6KxSiGwhAKj2xFqy51MIQjfUN0
37
+ TL5B7Buq
38
38
  -----END CERTIFICATE-----
39
- date: 2021-10-06 00:00:00.000000000 Z
39
+ date: 2022-09-19 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activerecord
@@ -170,6 +170,20 @@ dependencies:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0.14'
173
+ - !ruby/object:Gem::Dependency
174
+ name: tty-screen
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.8'
180
+ type: :runtime
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '0.8'
173
187
  description:
174
188
  email:
175
189
  - michal.krzyzanowski+github@gmail.com
@@ -205,9 +219,11 @@ files:
205
219
  - lib/nazar/view.rb
206
220
  - nazar.gemspec
207
221
  homepage: https://github.com/krzyzak/nazar
208
- licenses: []
222
+ licenses:
223
+ - MIT
209
224
  metadata:
210
225
  homepage_uri: https://github.com/krzyzak/nazar
226
+ rubygems_mfa_required: 'true'
211
227
  post_install_message:
212
228
  rdoc_options: []
213
229
  require_paths:
metadata.gz.sig CHANGED
Binary file