uh-layout 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bc665a4b5eaf5f27e1b2a502f86870fdf7cb1663
4
- data.tar.gz: 0bbd6a29f34427d05e932a55961cb6b93f6a4392
2
+ SHA256:
3
+ metadata.gz: ef2b61c35eeedd55a1603fac03070bedc0bac689b86eb82d92fbcacac621bfde
4
+ data.tar.gz: 02f86bd7bba57f9c92e9a76b6da891ba3afe5eaa2f89b309ef29797cd045fbfb
5
5
  SHA512:
6
- metadata.gz: 60f86b427c2c914f345629ef341cbac5471613a52988c96ce22db5176c832620b1f85745ca21ca3d933540e5a8df8569f3674b080969a039c36a614c3ce68edf
7
- data.tar.gz: 2073cd03b104efb678d2264b4fb5762527d5e47c0652b15321f912aa3eb34fb284b67bb240e0102ca0657bf54775964c89254448d2d3702a651e314cb983618c
6
+ metadata.gz: c360f3459be21bcc90c725546fc0da75dd51307a52088dc206a8254de71cb6275d339853605e9cc7b15aaed0325fb5a5934f5d96f50606dbdc0fa8ec6ad9e4f6
7
+ data.tar.gz: 5283d46abdffe520c3dff3c0295c26dcbb1a2234c2c0e7707a10e848a64adc5127bb73450c3ad28c3b845c4f1ebf91566fd910886eb2c8419772347ca0888dc8
data/README ADDED
@@ -0,0 +1,4 @@
1
+ uh-layout
2
+ =========
3
+
4
+ Tiling and stacking layout for `uh-wm' ruby gem.
@@ -15,9 +15,9 @@ require 'uh/layout/view'
15
15
 
16
16
  module Uh
17
17
  class Layout
18
- Error = Class.new(StandardError)
19
- RuntimeError = Class.new(RuntimeError)
20
- ArgumentError = Class.new(Error)
18
+ Error = Class.new StandardError
19
+ RuntimeError = Class.new RuntimeError
20
+ ArgumentError = Class.new Error
21
21
 
22
22
  COLORS = {
23
23
  fg: 'rgb:d0/d0/d0'.freeze,
@@ -44,7 +44,7 @@ module Uh
44
44
  @colors = @colors.merge options[:colors] if options.key? :colors
45
45
  end
46
46
 
47
- def register(display)
47
+ def register display
48
48
  Registrant.register self, display
49
49
  end
50
50
 
@@ -56,7 +56,7 @@ module Uh
56
56
  current_column and current_column.current_client
57
57
  end
58
58
 
59
- def include?(client)
59
+ def include? client
60
60
  screens.any? { |screen| screen.include? client }
61
61
  end
62
62
 
@@ -69,7 +69,7 @@ module Uh
69
69
  (current_column or current_view).geo.dup
70
70
  end
71
71
 
72
- def <<(client)
72
+ def << client
73
73
  current_view.current_column_or_create << client
74
74
  current_column.current_client = client
75
75
  current_column.arrange_clients
@@ -80,7 +80,7 @@ module Uh
80
80
  end
81
81
  alias push <<
82
82
 
83
- def remove(client)
83
+ def remove client
84
84
  screen, view, column = find_client client
85
85
  column.remove client
86
86
  view.arrange_columns
@@ -89,29 +89,29 @@ module Uh
89
89
  update_widgets
90
90
  end
91
91
 
92
- def update(client = nil)
92
+ def update client = nil
93
93
  return if client && client.hidden?
94
94
  update_widgets
95
95
  end
96
96
 
97
- def expose(window)
97
+ def expose window
98
98
  update_widgets
99
99
  end
100
100
 
101
- def handle_screen_sel(direction)
101
+ def handle_screen_sel direction
102
102
  screens.sel direction
103
103
  current_client.focus if current_client
104
104
  update_widgets
105
105
  end
106
106
 
107
- def handle_screen_set(direction)
107
+ def handle_screen_set direction
108
108
  return unless current_client
109
109
  remove client = current_client
110
110
  screens.sel direction
111
111
  push client
112
112
  end
113
113
 
114
- def handle_view_sel(view_id)
114
+ def handle_view_sel view_id
115
115
  view_id = view_id.to_s
116
116
  return unless current_view.id != view_id
117
117
  @history.record_view current_view
@@ -122,7 +122,7 @@ module Uh
122
122
  update_widgets
123
123
  end
124
124
 
125
- def handle_view_set(view_id)
125
+ def handle_view_set view_id
126
126
  return unless current_client && current_view.id != view_id
127
127
  previous_view_id = current_view.id
128
128
  remove client = current_client
@@ -131,7 +131,7 @@ module Uh
131
131
  handle_view_sel previous_view_id
132
132
  end
133
133
 
134
- def handle_column_sel(direction)
134
+ def handle_column_sel direction
135
135
  return unless current_view.columns.any?
136
136
  current_view.columns.sel direction
137
137
  current_client.focus
@@ -145,7 +145,7 @@ module Uh
145
145
  current_column.show_hide_clients
146
146
  end
147
147
 
148
- def handle_client_sel(direction)
148
+ def handle_client_sel direction
149
149
  return unless current_client
150
150
  current_column.clients.sel direction
151
151
  current_column.show_hide_clients
@@ -153,13 +153,13 @@ module Uh
153
153
  update_widgets
154
154
  end
155
155
 
156
- def handle_client_swap(direction)
156
+ def handle_client_swap direction
157
157
  return unless current_client && current_column.clients.size >= 2
158
158
  current_column.client_swap direction
159
159
  update_widgets
160
160
  end
161
161
 
162
- def handle_client_column_set(direction, mover: client_mover_for_current_view)
162
+ def handle_client_column_set direction, mover: client_mover_for_current_view
163
163
  return unless current_client
164
164
  mover.move_current direction
165
165
  current_view.arrange_columns
@@ -171,10 +171,9 @@ module Uh
171
171
  handle_view_sel @history.last_view.id
172
172
  end
173
173
 
174
+ private
174
175
 
175
- private
176
-
177
- def find_client(client)
176
+ def find_client client
178
177
  screens.each do |screen|
179
178
  screen.views.each do |view|
180
179
  view.each_column do |column|
@@ -186,7 +185,7 @@ module Uh
186
185
  end
187
186
  end
188
187
 
189
- def find_view_or_create(view_id)
188
+ def find_view_or_create view_id
190
189
  current_screen.views.find do
191
190
  |e| e.id == view_id
192
191
  end or View.new(view_id, current_screen.geo).tap do |view|
@@ -4,7 +4,7 @@ module Uh
4
4
  class FixedWidth
5
5
  DEFAULT_WIDTH = 484
6
6
 
7
- def initialize(entries, geo, width: DEFAULT_WIDTH)
7
+ def initialize entries, geo, width: DEFAULT_WIDTH
8
8
  @entries = entries
9
9
  @geo = geo
10
10
  @width = width
@@ -2,7 +2,7 @@ module Uh
2
2
  class Layout
3
3
  module Arrangers
4
4
  class Stack
5
- def initialize(entries, geo)
5
+ def initialize entries, geo
6
6
  @entries = entries
7
7
  @geo = geo
8
8
  end
@@ -2,7 +2,7 @@ module Uh
2
2
  class Layout
3
3
  module Arrangers
4
4
  class VertTile
5
- def initialize(entries, geo)
5
+ def initialize entries, geo
6
6
  @entries = entries
7
7
  @geo = geo
8
8
  end
@@ -13,7 +13,7 @@ module Uh
13
13
  attr_reader :screen
14
14
  attr_writer :active, :status
15
15
 
16
- def initialize(display, screen, colors)
16
+ def initialize display, screen, colors
17
17
  @display = display
18
18
  @screen = screen
19
19
  @geo = build_geo @screen.geo
@@ -27,7 +27,7 @@ module Uh
27
27
  !!@active
28
28
  end
29
29
 
30
- def on_update(&block)
30
+ def on_update &block
31
31
  @on_update = block
32
32
  end
33
33
 
@@ -58,15 +58,14 @@ module Uh
58
58
  self
59
59
  end
60
60
 
61
-
62
- private
61
+ private
63
62
 
64
63
  def blit
65
64
  @pixmap.copy @window
66
65
  self
67
66
  end
68
67
 
69
- def build_geo(layout_geo)
68
+ def build_geo layout_geo
70
69
  bar_height = text_line_height * 2 + BORDER_HEIGHT + BORDER_PADDING_Y
71
70
 
72
71
  Uh::Geo.new(
@@ -85,15 +84,15 @@ module Uh
85
84
  @display.font.height + TEXT_PADDING_Y * 2
86
85
  end
87
86
 
88
- def text_width(text, padding_x: TEXT_PADDING_X)
87
+ def text_width text, padding_x: TEXT_PADDING_X
89
88
  text.length * @display.font.width + padding_x * 2
90
89
  end
91
90
 
92
- def column_offset_x(column)
91
+ def column_offset_x column
93
92
  column.x - x
94
93
  end
95
94
 
96
- def column_text(column)
95
+ def column_text column
97
96
  text = '%d/%d %s (%s)' % [
98
97
  column.clients.index(column.current_client),
99
98
  column.clients.size,
@@ -109,14 +108,14 @@ module Uh
109
108
  @pixmap.draw_rect 0, 0, width, BORDER_HEIGHT
110
109
  end
111
110
 
112
- def draw_columns(y_offset, columns, current_column)
111
+ def draw_columns y_offset, columns, current_column
113
112
  columns.each do |column|
114
113
  draw_column y_offset, column, column == current_column
115
114
  end
116
115
  end
117
116
 
118
- def draw_column(y_offset, column, current)
119
- x_offset = column_offset_x(column)
117
+ def draw_column y_offset, column, current
118
+ x_offset = column_offset_x column
120
119
  if current && active?
121
120
  @pixmap.gc_color @colors[:sel]
122
121
  @pixmap.draw_rect x_offset, y_offset, column.width, text_line_height
@@ -126,8 +125,8 @@ module Uh
126
125
  bg: current ? @colors[:hi] : @colors[:bg]
127
126
  end
128
127
 
129
- def draw_views(y_offset, views, current_view)
130
- views.sort_by(&:id).inject(0) do |x_offset, view|
128
+ def draw_views y_offset, views, current_view
129
+ views.sort_by(&:id).inject 0 do |x_offset, view|
131
130
  color = if view == current_view
132
131
  active_color
133
132
  elsif view.clients.any?
@@ -143,11 +142,11 @@ module Uh
143
142
  end
144
143
  end
145
144
 
146
- def draw_status(y_offset, status)
145
+ def draw_status y_offset, status
147
146
  draw_text status, width - text_width(status), y_offset
148
147
  end
149
148
 
150
- def draw_text(text, x, y, bg: nil, padding_x: TEXT_PADDING_X)
149
+ def draw_text text, x, y, bg: nil, padding_x: TEXT_PADDING_X
151
150
  text = text.to_s
152
151
  text_width = text_width text, padding_x: padding_x
153
152
  text_y = y + @display.font.ascent + TEXT_PADDING_Y
@@ -1,12 +1,12 @@
1
1
  module Uh
2
2
  class Layout
3
3
  class ClientColumnMover
4
- def initialize(columns, columns_max_count)
4
+ def initialize columns, columns_max_count
5
5
  @columns = columns
6
6
  @columns_max_count = columns_max_count
7
7
  end
8
8
 
9
- def move_current(direction)
9
+ def move_current direction
10
10
  @columns.current.remove client = @columns.current.current_client
11
11
  dest_column = get_or_create_column direction
12
12
  dest_column << client
@@ -14,7 +14,7 @@ module Uh
14
14
  @columns.current = dest_column
15
15
  end
16
16
 
17
- def get_or_create_column(direction)
17
+ def get_or_create_column direction
18
18
  if candidate = @columns.get(direction)
19
19
  candidate
20
20
  elsif @columns_max_count
@@ -22,8 +22,8 @@ module Uh
22
22
  else
23
23
  Column.new(Geo.new).tap do |o|
24
24
  case direction
25
- when :pred then @columns.unshift o
26
- when :succ then @columns << o
25
+ when :pred then @columns.unshift o
26
+ when :succ then @columns << o
27
27
  end
28
28
  end
29
29
  end
@@ -16,7 +16,7 @@ module Uh
16
16
 
17
17
  attr_reader :geo, :clients, :mode
18
18
 
19
- def initialize(geo, mode: :stack)
19
+ def initialize geo, mode: :stack
20
20
  @geo = geo.dup
21
21
  @clients = Container.new
22
22
  @mode = mode
@@ -26,7 +26,7 @@ module Uh
26
26
  "COL geo: #{@geo}"
27
27
  end
28
28
 
29
- def <<(client)
29
+ def << client
30
30
  client.geo = @geo.dup
31
31
  if @clients.current
32
32
  @clients.insert_after_current client
@@ -44,7 +44,7 @@ module Uh
44
44
  MODES[@mode].new @clients, @geo
45
45
  end
46
46
 
47
- def client_swap(direction)
47
+ def client_swap direction
48
48
  @clients.set direction
49
49
  if @mode == :tile
50
50
  arrange_clients
@@ -57,7 +57,7 @@ module Uh
57
57
  clients.each &:moveresize
58
58
  end
59
59
 
60
- def show_hide_clients(arranger: self.arranger)
60
+ def show_hide_clients arranger: self.arranger
61
61
  arranger.each_visible { |client| client.show if client.hidden? }
62
62
  arranger.each_hidden { |client| client.hide unless client.hidden? }
63
63
  end
@@ -7,7 +7,7 @@ module Uh
7
7
  def_delegators :@entries, :<<, :[], :each, :empty?, :fetch, :first,
8
8
  :index, :last, :size, :unshift
9
9
 
10
- def initialize(entries = [])
10
+ def initialize entries = []
11
11
  @entries = entries
12
12
  @current_index = 0
13
13
  end
@@ -18,28 +18,23 @@ module Uh
18
18
  @entries[@current_index]
19
19
  end
20
20
 
21
- def current=(entry)
21
+ def current= entry
22
22
  fail ArgumentError, 'unknown entry' unless include? entry
23
23
  @current_index = @entries.index entry
24
24
  end
25
25
 
26
- def insert_after_current(entry)
26
+ def insert_after_current entry
27
27
  fail RuntimeError, 'no current entry' unless current
28
28
  @entries.insert @current_index + 1, entry
29
29
  end
30
30
 
31
- def remove(entry)
32
- fail ArgumentError, 'unknown entry' unless include? entry
33
- @entries.delete_at @entries.index entry
34
- @current_index -= 1 unless @current_index == 0
31
+ def remove *entries
32
+ entries.each { |e| remove_entry e }
33
+ @entries.each { |e| remove_entry e if yield e } if block_given?
35
34
  self
36
35
  end
37
36
 
38
- def remove_if
39
- @entries.each { |e| remove e if yield e }
40
- end
41
-
42
- def get(direction, cycle: false)
37
+ def get direction, cycle: false
43
38
  index = @current_index.send direction
44
39
  if cycle
45
40
  @entries[index % @entries.size]
@@ -48,12 +43,12 @@ module Uh
48
43
  end
49
44
  end
50
45
 
51
- def sel(direction)
46
+ def sel direction
52
47
  @current_index = @current_index.send(direction) % @entries.size
53
48
  end
54
49
 
55
- def set(direction)
56
- raise RuntimeError unless @entries.size >= 2
50
+ def set direction
51
+ fail RuntimeError unless @entries.size >= 2
57
52
  new_index = @current_index.send direction
58
53
  if new_index.between? 0, @entries.size - 1
59
54
  swap @current_index, new_index
@@ -64,17 +59,24 @@ module Uh
64
59
  end
65
60
  end
66
61
 
67
- def swap(a, b)
62
+ def swap a, b
68
63
  @entries[a], @entries[b] = @entries[b], @entries[a]
69
64
  end
70
65
 
66
+ private
71
67
 
72
- private
68
+ def remove_entry entry
69
+ fail ArgumentError, 'unknown entry' unless include? entry
70
+ @entries.delete_at (index = @entries.index(entry))
71
+ if @current_index != 0 && @current_index > index
72
+ @current_index -= 1
73
+ end
74
+ end
73
75
 
74
- def rotate(direction)
75
- case direction
76
- when :pred then @entries = @entries.push @entries.shift
77
- when :succ then @entries = @entries.unshift @entries.pop
76
+ def rotate direction
77
+ @entries = @entries.rotate case direction
78
+ when :pred then 1
79
+ when :succ then -1
78
80
  end
79
81
  end
80
82
  end
@@ -1,22 +1,22 @@
1
1
  module Uh
2
2
  class Layout
3
3
  class Dumper
4
- def initialize(layout)
4
+ def initialize layout
5
5
  @layout = layout
6
6
  end
7
7
 
8
8
  def to_s
9
- @layout.screens.inject('') do |m, screen|
10
- m << "%s%s\n" % [@layout.current_screen?(screen) ? '*' : ' ', screen]
9
+ @layout.screens.inject '' do |m, screen|
10
+ m << "%s%s\n" % [@layout.current_screen?(screen) ? ?* : ' ', screen]
11
11
  screen.views.each do |view|
12
- m << " %s%s\n" % [screen.current_view?(view) ? '*' : ' ', view]
12
+ m << " %s%s\n" % [screen.current_view?(view) ? ?* : ' ', view]
13
13
  view.columns.each do |column|
14
14
  m << " %s%s\n" % [
15
- view.current_column?(column) ? '*' : ' ', column
15
+ view.current_column?(column) ? ?* : ' ', column
16
16
  ]
17
17
  column.clients.each do |client|
18
18
  m << " %s%s\n" % [
19
- column.current_client?(client) ? '*' : ' ',
19
+ column.current_client?(client) ? ?* : ' ',
20
20
  client
21
21
  ]
22
22
  end
@@ -5,12 +5,12 @@ module Uh
5
5
 
6
6
  attr_reader :views, :views_size_max
7
7
 
8
- def initialize(views = [], views_size_max: VIEWS_SIZE_MAX)
8
+ def initialize views = [], views_size_max: VIEWS_SIZE_MAX
9
9
  @views = views
10
10
  @views_size_max = views_size_max
11
11
  end
12
12
 
13
- def record_view(view)
13
+ def record_view view
14
14
  @views << view
15
15
  if @views.size > @views_size_max
16
16
  @views = @views.drop @views.size - @views_size_max
@@ -2,7 +2,7 @@ module Uh
2
2
  class Layout
3
3
  module Registrant
4
4
  class << self
5
- def register(layout, display)
5
+ def register layout, display
6
6
  display.screens.each do |screen|
7
7
  layout.screens << scr = Screen.new(screen.id, screen.geo)
8
8
  bar = Bar.new(display, scr, layout.colors).tap do |b|
@@ -9,22 +9,22 @@ module Uh
9
9
 
10
10
  attr_reader :id, :views, :geo
11
11
 
12
- def initialize(id, geo)
12
+ def initialize id, geo
13
13
  @id = id
14
14
  @geo = geo.dup
15
- @views = Container.new([View.new('1', @geo)])
15
+ @views = Container.new [View.new(?1, @geo)]
16
16
  end
17
17
 
18
18
  def to_s
19
19
  "SCREEN ##{@id}, geo: #{@geo}"
20
20
  end
21
21
 
22
- def height=(value)
22
+ def height= value
23
23
  @geo.height = value
24
24
  @views.each { |view| view.height = value }
25
25
  end
26
26
 
27
- def include?(client)
27
+ def include? client
28
28
  @views.any? { |view| view.include? client }
29
29
  end
30
30
  end
@@ -1,5 +1,5 @@
1
1
  module Uh
2
2
  class Layout
3
- VERSION = '0.4.3'.freeze
3
+ VERSION = '0.5.0'.freeze
4
4
  end
5
5
  end
@@ -13,7 +13,7 @@ module Uh
13
13
 
14
14
  attr_reader :id, :geo, :columns
15
15
 
16
- def initialize(id, geo)
16
+ def initialize id, geo
17
17
  unless id.kind_of? String
18
18
  fail ArgumentError, "expect `id' to be a String, #{id.class} given"
19
19
  end
@@ -30,7 +30,7 @@ module Uh
30
30
  @columns.inject([]) { |m, column| m + column.clients }
31
31
  end
32
32
 
33
- def include?(client)
33
+ def include? client
34
34
  @columns.any? { |column| column.include? client }
35
35
  end
36
36
 
@@ -41,11 +41,11 @@ module Uh
41
41
  end
42
42
 
43
43
  def arranger
44
- Arrangers::FixedWidth.new(@columns, @geo)
44
+ Arrangers::FixedWidth.new @columns, @geo
45
45
  end
46
46
 
47
47
  def arrange_columns
48
- @columns.remove_if &:empty?
48
+ @columns.remove &:empty?
49
49
  arranger.arrange
50
50
  @columns.each &:arrange_clients
51
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uh-layout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thibault Jouan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-31 00:00:00.000000000 Z
11
+ date: 2017-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uh
@@ -24,34 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
- - !ruby/object:Gem::Dependency
28
- name: uh-wm
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 0.0.9
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 0.0.9
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - "~>"
31
+ - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: '10.4'
33
+ version: '0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - "~>"
38
+ - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: '10.4'
40
+ version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -71,9 +57,9 @@ email: tj@a13.fr
71
57
  executables: []
72
58
  extensions: []
73
59
  extra_rdoc_files:
74
- - README.md
60
+ - README
75
61
  files:
76
- - README.md
62
+ - README
77
63
  - lib/uh/layout.rb
78
64
  - lib/uh/layout/arrangers/fixed_width.rb
79
65
  - lib/uh/layout/arrangers/stack.rb
@@ -108,9 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
94
  version: '0'
109
95
  requirements: []
110
96
  rubyforge_project:
111
- rubygems_version: 2.4.5
97
+ rubygems_version: 2.7.3
112
98
  signing_key:
113
99
  specification_version: 4
114
100
  summary: simple tiling and stacking layout for uh-wm
115
101
  test_files: []
116
- has_rdoc:
data/README.md DELETED
@@ -1,18 +0,0 @@
1
- uh-layout
2
- =========
3
-
4
- [![Version ][badge-version-img]][badge-version-uri]
5
- [![Build status ][badge-build-img]][badge-build-uri]
6
- [![Code Climate ][badge-cclimate-img]][badge-cclimate-uri]
7
-
8
-
9
- Tiling and stacking layout for `uh-wm` ruby gem.
10
-
11
-
12
-
13
- [badge-version-img]: https://img.shields.io/gem/v/uh-layout.svg?style=flat-square
14
- [badge-version-uri]: https://rubygems.org/gems/uh-layout
15
- [badge-build-img]: https://img.shields.io/travis/tjouan/uh-layout/master.svg?style=flat-square
16
- [badge-build-uri]: https://travis-ci.org/tjouan/uh-layout
17
- [badge-cclimate-img]: https://img.shields.io/codeclimate/github/tjouan/uh-layout.svg?style=flat-square
18
- [badge-cclimate-uri]: https://codeclimate.com/github/tjouan/uh-layout