branding 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3688ed4157906260e426018c08b5236dbcf7a75b
4
+ data.tar.gz: 3914f9b09f648a42dc171727409fb66ac35867f5
5
+ SHA512:
6
+ metadata.gz: ad2c13b8bba0648fd37e98a19e36e83ab17314ba96570738417d3d4257559eb018e3f499976676de023117afa4be2d23163dc220aad4611ba953fa4f804266a9
7
+ data.tar.gz: 853164e000f97ce4101213e664eec010a05bce557c099f2fdc116f7ff7cd46dc618f9a59ddc803e3620b43ba4ac6386723ce80d5c4bd053e7d4fb57487c5a5ec
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in branding.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 Stefan Natchev
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,33 @@
1
+ # Branding
2
+
3
+ Proud of your code? Add some bling to your terminal.
4
+
5
+ ## Perks
6
+
7
+ * No dependencies!
8
+ * Pure Ruby PNG decoding in < 200 LoC
9
+ * Loads of fun!
10
+
11
+ ## Quality
12
+
13
+ Much quality:
14
+
15
+ ## How it works
16
+
17
+ Branding will detect your Rails application's favicon. It adds a small
18
+ initializer in development and testing environments that draws the favicon with
19
+ ANSI control characters.
20
+
21
+ ## Installation
22
+
23
+ Add this line to your application's Gemfile:
24
+
25
+ gem 'branding'
26
+
27
+ ## Usage
28
+
29
+ Continue your normal workflow.
30
+
31
+ ## Contributing
32
+
33
+ Have a good idea to make Branding more awesome? Make a pull request and share your thoughts!
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'branding'
4
+
5
+ cli = Branding::CLI.new(ARGV)
6
+ cli.run
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'branding/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'branding'
8
+ spec.version = Branding::VERSION
9
+ spec.authors = ['Stefan Natchev']
10
+ spec.email = ['stefan.natchev@gmail.com']
11
+ spec.summary = 'Print your logo to the terminal.'
12
+ spec.description = 'Proud of your work? Add some branding bling with Branding.rb'
13
+ spec.homepage = 'https://github.com/snatchev/branding.rb'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.5'
22
+ spec.add_development_dependency 'pry', '~> 0.10'
23
+ spec.add_development_dependency 'rake', '~> 11.1'
24
+ spec.add_development_dependency 'rspec', '~> 3.4'
25
+ spec.add_development_dependency 'rubocop', '~> 0.40'
26
+ end
@@ -0,0 +1,12 @@
1
+ require 'branding/ansi'
2
+ require 'branding/canvas'
3
+ require 'branding/cli'
4
+ require 'branding/logo'
5
+ require 'branding/pixel'
6
+ require 'branding/png'
7
+ require 'branding/version'
8
+ require 'branding/railtie' if defined?(Rails)
9
+
10
+ module Branding
11
+
12
+ end
@@ -0,0 +1,80 @@
1
+ module Branding
2
+ module ANSI
3
+ ATTRS = (0..8).map{|i| "\e[#{i}m".to_sym }.freeze
4
+ FGCOLORS = (0..256).map{|i| "\e[38;5;#{i}m".to_sym }.freeze
5
+ BGCOLORS = (0..256).map{|i| "\e[48;5;#{i}m".to_sym }.freeze
6
+ #2580 - 259F
7
+ SHADERS = [:"\u2591", :"\u2592", :"\u2593"].freeze
8
+
9
+ module_function
10
+
11
+ def fg(r,g,b)
12
+ FGCOLORS[rgb_offset(r,g,b)]
13
+ end
14
+
15
+ def bg(r,g,b)
16
+ BGCOLORS[rgb_offset(r,g,b)]
17
+ end
18
+
19
+ def reset
20
+ ATTRS[0]
21
+ end
22
+
23
+ def clear
24
+ end
25
+
26
+ def up
27
+ end
28
+
29
+ def down
30
+ end
31
+
32
+ def left
33
+ end
34
+
35
+ def right
36
+ end
37
+
38
+ def save_cursor
39
+ :"\e[s"
40
+ end
41
+
42
+ def restore_cursor
43
+ :"\e[u"
44
+ end
45
+
46
+ # 0x10-0xE7: 6 × 6 × 6 = 216 colors
47
+ def rgb_offset(r,g,b)
48
+ 16 + (36 * scale_color(r)) + (6 * scale_color(g)) + scale_color(b)
49
+ end
50
+
51
+ ##
52
+ # scale an 8bit number to 0-5
53
+ # 5*51==255
54
+ def scale_color(uint8)
55
+ (uint8 / 51.0).round
56
+ end
57
+
58
+ # we probably shouldn't be passing in non-ints
59
+ def uint32_to_rgb(uint32)
60
+ return [0,0,0] unless uint32.is_a?(Integer)
61
+
62
+ r = (uint32 & 0xff000000) >> 24
63
+ g = (uint32 & 0x00ff0000) >> 16
64
+ b = (uint32 & 0x0000ff00) >> 8
65
+
66
+ [r,g,b]
67
+ end
68
+
69
+ # we probably shouldn't be passing in non-ints
70
+ def clamped(uint32)
71
+ return [0,0,0] unless uint32.is_a?(Integer)
72
+
73
+ r = (uint32 & 0xff000000) >> 24
74
+ g = (uint32 & 0x00ff0000) >> 16
75
+ b = (uint32 & 0x0000ff00) >> 8
76
+
77
+ scale_color(r) & scale_color(g) & scale_color(b)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,37 @@
1
+ require 'branding/ansi'
2
+
3
+ module Branding
4
+ class Canvas
5
+ attr_reader :width, :height, :rows, :cols
6
+
7
+ def initialize(width:,height:)
8
+ @width, @height = width, height
9
+ @rows, @cols = `stty size`.split.map { |x| x.to_i }
10
+ @pixel_buffer = []
11
+ end
12
+
13
+ def load(pixels)
14
+ Pixel2x.load_strategy(pixels, width: width, height: height) do |pixel|
15
+ @pixel_buffer << pixel
16
+ end
17
+ end
18
+
19
+ def print
20
+ @pixel_buffer.each_with_index do |pixel, idx|
21
+ if (idx % width * pixel.width) >= cols
22
+ next
23
+ end
24
+
25
+ if idx % max_width == 0
26
+ STDOUT.puts(ANSI.reset)
27
+ end
28
+
29
+ STDOUT.print(pixel)
30
+ end
31
+ end
32
+
33
+ def max_width
34
+ @max_width ||= [@width, @cols].min
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'optparse'
2
+ require 'ostruct'
3
+
4
+ module Branding
5
+ class CLI
6
+ def initialize(args)
7
+ @options = OpenStruct.new
8
+
9
+ @options.command = :print_logo
10
+ @options.file = args.last
11
+
12
+ @parser = OptionParser.new do |opts|
13
+ opts.banner = 'Usage: branding FILE'
14
+ opts.on('-a') do |algo|
15
+ @options = algo
16
+ end
17
+
18
+ opts.on_tail('-h', '--help', 'Show this message') do
19
+ puts opts
20
+ exit
21
+ end
22
+ end
23
+
24
+ @parser.parse!(args)
25
+ @options
26
+ end
27
+
28
+ def run
29
+ send(@options.command)
30
+ end
31
+
32
+ def print_logo
33
+ logo = Branding::Logo.new(@options.file)
34
+ logo.print
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,14 @@
1
+ module Branding
2
+ class Logo
3
+ def initialize(path)
4
+ @img = PNG.from_file(path)
5
+ @canvas = Canvas.new(width: @img.width, height: @img.height)
6
+ end
7
+
8
+ def print
9
+ @canvas.load(@img.pixels)
10
+ @canvas.print
11
+ nil
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,133 @@
1
+ # encoding: UTF-8
2
+ require 'matrix'
3
+
4
+ module Branding
5
+ ##
6
+ #
7
+ #
8
+ class Pixel
9
+ def self.load_strategy(pixels, height:, width:)
10
+ pixels.each do |pixel_value|
11
+ yield self.new(pixel_value)
12
+ end
13
+ end
14
+
15
+ def self.rgb(r,g,b)
16
+ self.new((r << 24) | (g << 16) | b << 8)
17
+ end
18
+
19
+ attr_accessor :uint32
20
+
21
+ ##
22
+ # basic 2-space with background color per pixel
23
+ def initialize(*opts)
24
+ opts = opts.first if opts.size == 1
25
+
26
+ case opts
27
+ when self.class
28
+ @uint32 = opts.uint32
29
+ when Fixnum
30
+ @uint32 = opts
31
+ when Array
32
+ r,g,b,a = opts
33
+ a ||= 0xff # alpha is optional. If it is not supplied, assume full-alpha.
34
+ @uint32 = (r << 24) | (g << 16) | b << 8 | a
35
+ when Hash
36
+ #(r << 24) | (g << 16) | b << 8)
37
+ else
38
+ raise "Cannot initialize Pixel with #{opts.inspect}."
39
+ end
40
+ end
41
+
42
+ def inspect
43
+ "0x%0.8x" % @uint32
44
+ end
45
+
46
+ def ==(value)
47
+ case value
48
+ when self.class
49
+ @uint32 == value.uint32
50
+ when Fixnum
51
+ @uint32 == value
52
+ else
53
+ @uint32 == value
54
+ end
55
+ end
56
+
57
+ def to_i
58
+ uint32
59
+ end
60
+
61
+ def r
62
+ @uint32 & 0xff000000
63
+ end
64
+
65
+ def g
66
+ @uint32 & 0x00ff0000
67
+ end
68
+
69
+ def b
70
+ @uint32 & 0x0000ff00
71
+ end
72
+
73
+ def a
74
+ @uint32 & 0x000000ff
75
+ end
76
+
77
+ def to_rgb
78
+ {r: r, g: g, b: b}
79
+ end
80
+
81
+ def to_rgba
82
+ {r: r, g: g, b: b, a: a}
83
+ end
84
+
85
+ def to_s
86
+ "#{ANSI.bg(*ANSI.uint32_to_rgb(@uint32))} "
87
+ end
88
+
89
+ def width
90
+ 2
91
+ end
92
+ end
93
+
94
+ class PixelHiColor < Pixel
95
+ def to_s
96
+ "#{ANSI.bg(*ANSI.uint32_to_rgb(@uint32))} "
97
+ end
98
+ end
99
+
100
+ class Pixel2x < Pixel
101
+
102
+ def self.load_strategy(pixels, height:, width:)
103
+ matrix = Matrix.build(height, width) do |row, col|
104
+ pixels[col + row*width]
105
+ end
106
+
107
+ (0..height).step(2) do |row|
108
+ matrix.minor(row, 2, 0, width).transpose.to_a.each do |top, bottom|
109
+ yield self.new(top.to_i, bottom.to_i)
110
+ end
111
+ end
112
+ end
113
+
114
+ def initialize(top, bottom)
115
+ @top, @bot = top, bottom
116
+
117
+ @top ||= 0x000000ff
118
+ @bot ||= 0x000000ff
119
+ end
120
+
121
+ def width
122
+ 1
123
+ end
124
+
125
+ def to_s
126
+ if ANSI.clamped(@top) == ANSI.clamped(@bot)
127
+ return "#{ANSI.bg(*ANSI.uint32_to_rgb(@top))} "
128
+ end
129
+
130
+ "#{ANSI.fg(*ANSI.uint32_to_rgb(@bot))}#{ANSI.bg(*ANSI.uint32_to_rgb(@top))}▄"
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,236 @@
1
+ module Branding
2
+ ##
3
+ # This is a simple PNG decoder, inspired and adapted from ChunkyPNG
4
+ class PNG
5
+ SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10].pack('C8').force_encoding('BINARY')
6
+
7
+ attr_reader :width, :height, :depth, :color, :compression, :filtering, :interlace
8
+
9
+ ##
10
+ # Private class for holding and deflating image data
11
+ #
12
+ class Imagedata
13
+ include Enumerable
14
+
15
+ def initialize(data:, scanline_width:, color_channels: )
16
+ @scanline_width = scanline_width
17
+ @color_channels = color_channels
18
+
19
+ zstream = Zlib::Inflate.new
20
+ zstream << data
21
+ @inflated = zstream.finish
22
+ zstream.close
23
+ end
24
+
25
+ ##
26
+ # yields byte
27
+ def each
28
+ @inflated.each_byte do |byte|
29
+ yield byte
30
+ end
31
+ end
32
+
33
+ def each_scanline
34
+ bytes_in_scanline = @scanline_width * @color_channels + 1 #the number of bytes is +1 because of the filter byte
35
+ previous_scanline = nil
36
+
37
+ each_slice(bytes_in_scanline) do |scanline|
38
+ filter_bit, *rest = *scanline
39
+ filter = Filter.new(filter_bit, rest, previous_scanline, @color_channels)
40
+
41
+ recon = filter.reconstructed_scanline
42
+ yield recon
43
+ previous_scanline = recon
44
+ end
45
+ end
46
+
47
+ def each_pixel
48
+ each_scanline do |scanline|
49
+ scanline.each_slice(@color_channels) do |*rgba|
50
+ yield Pixel.new(*rgba)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ ##
57
+ # private class to handle reconstructing filtered data
58
+ # https://www.w3.org/TR/PNG/#9Filters
59
+ class Filter
60
+ ##
61
+ #
62
+ def initialize(filter_bit, filtered_scanline, previous_scanline, color_channels)
63
+ @type = filter_bit
64
+ @filtered = filtered_scanline
65
+ @previous = previous_scanline || []
66
+ @pixel_width = color_channels
67
+ @position = 0
68
+ end
69
+
70
+ ##
71
+ # yields a reconstructed byte
72
+ def reconstructed_scanline
73
+ @reconstructed_scanline = []
74
+ @filtered.each do |byte|
75
+ recon = case @type
76
+ when 0
77
+ none(byte)
78
+ when 1
79
+ sub(byte)
80
+ when 2
81
+ up(byte)
82
+ when 3
83
+ average(byte)
84
+ when 4
85
+ paeth(byte)
86
+ end
87
+
88
+ @reconstructed_scanline << (recon % 256)
89
+ @position += 1
90
+ end
91
+
92
+ @reconstructed_scanline
93
+ end
94
+
95
+ # a: the byte corresponding to x in the pixel immediately before the pixel
96
+ # containing x (or the byte immediately before x, when the bit depth is
97
+ # less than 8)
98
+ def a
99
+ offset = @position - @pixel_width
100
+ return 0x00 if offset < 0
101
+
102
+ @reconstructed_scanline[offset]
103
+ end
104
+
105
+ def b
106
+ @previous[@position] || 0x00
107
+ end
108
+
109
+ def c
110
+ offset = @position - @pixel_width
111
+ return 0x00 if offset < 0
112
+
113
+ @previous[offset]
114
+ end
115
+
116
+ def none(x)
117
+ x
118
+ end
119
+
120
+ def sub(x)
121
+ x + a
122
+ end
123
+
124
+ def up(x)
125
+ x + b
126
+ end
127
+
128
+ def average(x)
129
+ x + ((a + b) / 2.0).floor
130
+ end
131
+
132
+ # https://www.w3.org/TR/PNG/#9Filter-type-4-Paeth
133
+ def paeth(x)
134
+ x + paeth_predictor(a,b,c)
135
+ end
136
+
137
+ def paeth_predictor(a,b,c)
138
+ p = a + b - c
139
+ pa = (p - a).abs
140
+ pb = (p - b).abs
141
+ pc = (p - c).abs
142
+
143
+ return a if pa <= pb && pa <= pc
144
+
145
+ return b if pb <= pc
146
+
147
+ c
148
+ end
149
+ end
150
+
151
+ def self.from_file(path)
152
+ new(File.open(path, 'rb'))
153
+ end
154
+
155
+ def initialize(io)
156
+ signature = io.read(SIGNATURE.length)
157
+ raise 'Signature mismatch' unless signature == SIGNATURE
158
+
159
+ @data = ''
160
+
161
+ until io.eof?
162
+ type, content = read_chunk(io)
163
+
164
+ case type
165
+ when 'IHDR'
166
+ fields = content.unpack('NNC5')
167
+ @width, @height, @depth, @color, @compression, @filtering, @interlace = fields
168
+
169
+ when 'IDAT'
170
+ @data << content
171
+ end
172
+ end
173
+
174
+ unless depth == 8
175
+ raise NotImplementedError, 'only supporting 8bit color depth'
176
+ end
177
+
178
+ unless color == 2 || color == 6
179
+ raise NotImplementedError, 'only supporting true color, with or without alpha'
180
+ end
181
+
182
+ unless filtering == 0
183
+ raise NotImplementedError, 'does not supporting filtering'
184
+ end
185
+
186
+ unless compression == 0
187
+ raise NotImplementedError, 'only supporting deflate compression'
188
+ end
189
+ end
190
+
191
+ def pixels
192
+ if block_given?
193
+ imagedata.each_pixel
194
+ else
195
+ imagedata.enum_for(:each_pixel).to_a
196
+ end
197
+ end
198
+
199
+ ##
200
+ # the number of color channels. Not the PNG "color mode"
201
+ def color_channels
202
+ color == 2 ? 3 : 4
203
+ end
204
+
205
+ private
206
+
207
+ def imagedata
208
+ Imagedata.new(data: @data, scanline_width: width, color_channels: color_channels)
209
+ end
210
+
211
+ def read_chunk(io)
212
+ length, type = read_bytes(io, 8).unpack('Na4')
213
+
214
+ content = read_bytes(io, length)
215
+ crc = read_bytes(io, 4).unpack('N').first
216
+ verify_crc(type, content, crc)
217
+
218
+ [type, content]
219
+ end
220
+
221
+ def read_bytes(io, length)
222
+ data = io.read(length)
223
+
224
+ if data.nil? || data.bytesize != length
225
+ raise "Could not read #{length} bytes from io"
226
+ end
227
+
228
+ data
229
+ end
230
+
231
+ def verify_crc(type, content, found_crc)
232
+ expected_crc = Zlib.crc32(content, Zlib.crc32(type))
233
+ raise 'Chuck CRC mismatch!' if found_crc != expected_crc
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,23 @@
1
+ module Branding
2
+ class Railtie < Rails::Railtie
3
+
4
+ unless Rails.env.production?
5
+ initializer('branding.print_logo') do
6
+ logo = Branding::Logo.new(Branding::Railtie.favicons)
7
+ logo.print
8
+ end
9
+ end
10
+
11
+ ##
12
+ # find the best suited icon in a rails app
13
+ def self.favicons
14
+ paths = ["#{Rails.root}/public/", "#{Rails.root}/app/assets/images/"]
15
+ file_patterns = ['favicon*.png', 'apple-touch-icon*.png']
16
+ patterns = paths.product(file_patterns).map(&:join)
17
+
18
+ matches = Dir.glob(patterns)
19
+
20
+ matches.sort_by{|path| File.stat(path).size }.first
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Branding
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Branding do
4
+ it 'should have a version number' do
5
+ Branding::VERSION.should_not be_nil
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Branding::Pixel do
4
+ it 'shows its value as a uint32 hex number' do
5
+ pixel = Branding::Pixel.new(0x00112200)
6
+ expect(pixel.inspect).to eq('0x00112200')
7
+ end
8
+
9
+ it 'initializes with a hex value' do
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Branding::PNG do
4
+ it 'returns a pixel matrix' do
5
+ png = Branding::PNG.from_file(fixture_file('test3x3.png'))
6
+ expect(png.pixels).to eq(
7
+ [
8
+ [0x111111, 0xc6c6c6, 0xffffff],
9
+ [0xc6c6c6, 0x111111, 0xc6c6c6],
10
+ [0xffffff, 0xc6c6c6, 0x111111]
11
+ ]
12
+ )
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'branding'
3
+
4
+ def fixture_file(path)
5
+ File.join(File.expand_path('../fixtures', __FILE__), path)
6
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: branding
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefan Natchev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '11.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '11.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.40'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.40'
83
+ description: Proud of your work? Add some branding bling with Branding.rb
84
+ email:
85
+ - stefan.natchev@gmail.com
86
+ executables:
87
+ - branding
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - bin/branding
99
+ - branding.gemspec
100
+ - lib/branding.rb
101
+ - lib/branding/ansi.rb
102
+ - lib/branding/canvas.rb
103
+ - lib/branding/cli.rb
104
+ - lib/branding/logo.rb
105
+ - lib/branding/pixel.rb
106
+ - lib/branding/png.rb
107
+ - lib/branding/railtie.rb
108
+ - lib/branding/version.rb
109
+ - spec/branding_spec.rb
110
+ - spec/pixel_spec.rb
111
+ - spec/png_spec.rb
112
+ - spec/spec_helper.rb
113
+ homepage: https://github.com/snatchev/branding.rb
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.4.5.1
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Print your logo to the terminal.
137
+ test_files:
138
+ - spec/branding_spec.rb
139
+ - spec/pixel_spec.rb
140
+ - spec/png_spec.rb
141
+ - spec/spec_helper.rb
142
+ has_rdoc: