yamg 0.0.5 → 0.0.7

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: 07b978bbab7904b6f351c73369b99c0ebe73aba4
4
- data.tar.gz: d61104395d6d0b0a4183a2f59cea154fe914a9e1
3
+ metadata.gz: 9f878b0990d8eaae671edba9ac0a0838d8af4ca4
4
+ data.tar.gz: 5ad0cdcd21efd6c019cf9c8237a774e0e63d444e
5
5
  SHA512:
6
- metadata.gz: 0b0fb6c6605da534052839b5c190f795f698024c6e4a584be5a80be4314ade72bbafc991fde4e024191b262006380af03391feb3755eb5cd7e6addb48396bf08
7
- data.tar.gz: 754417d1dcd6e6b23f2626638a6708502f4d33e80066b0290a15bac718140cade9401125ce09cb8f714ed1d045c77b9be77ba04c78042708f093a298a7e6232e
6
+ metadata.gz: 9a60a46898ebd5b85c1ea6210e62e25d0899442c4873dee4ec13182eec3b7ae9c9a89752a8b7d1f2e62b35d2e183a7f09d61902134291d3f2113593b03fb4f9c
7
+ data.tar.gz: 917579ddbe4b7549e0de1ea83c7e37f1c6ecc50fb0ad90b6d7db8a3b44efef6247c81661e9606f4220561ad8aa2fcbb8b35334ecc7dd4c3c2e5262f024ace79d
data/README.md CHANGED
@@ -1,28 +1,91 @@
1
1
  # YAMG
2
2
 
3
3
 
4
- _____ _____ _____ ______ _______ _____
5
- |\ \ / /| ___|\ \ | \/ \ ___|\ \
6
- | \ \ / / | / /\ \ / /\ \ / /\ \
7
- | \____\/ / /| | | | / /\ / /\ || | |____|
8
- \ | / / / | |__| | / /\ \_/ / / /|| | ____
9
- \|___/ / / | .--. || | \|_|/ / / || | | |
10
- / / / | | | || | | | || | |_, |
11
- /____/ / |____| |____||\____\ |____| /|\ ___\___/ /|
12
- |` | / | | | || | | | | / | | /____ / |
13
- |_____|/ |____| |____| \|____| |____|/ \|___| | /
14
- \|____|/
4
+ _____ _____ _____ ______ _______ _____
5
+ |\ \ / /| ___|\ \ | \/ \ ___|\ \
6
+ | \ \ / / | / /\ \ / /\ \ / /\ \
7
+ | \____\/ / /| | | | / /\ / /\ || | |____|
8
+ \ | / / / | |__| | / /\ \_/ / / /|| | ____
9
+ \|___/ / / | .--. || | \|_|/ / / || | | |
10
+ / / / | | | || | | | || | |_, |
11
+ /____/ / |____| |____||\____\ |____| /|\ ___\___/ /|
12
+ |` | / | | | || | | | | / | | /____ / |
13
+ |_____|/ |____| |____| \|____| |____|/ \|___| | /
14
+ \|____|/
15
15
 
16
16
 
17
17
  [![Gem Version](https://badge.fury.io/rb/yamg.png)](http://badge.fury.io/rb/yamg)
18
18
  [![Dependency Status](https://gemnasium.com/nofxx/yamg.svg)](https://gemnasium.com/nofxx/yamg)
19
19
  [![Build Status](https://travis-ci.org/nofxx/yamg.png?branch=master)](https://travis-ci.org/nofxx/yamg)
20
20
 
21
- YAMG
21
+ YAMG - Yet Another Media Generator
22
+
22
23
 
23
24
  ## Install
24
25
 
25
- gem 'yamg'
26
+ Linux
27
+
28
+ nice-pkg-manager install imagemagick phantomjs ruby
29
+ gem install yamg
30
+
31
+ OSX
32
+
33
+ brew install imagemagick phantomjs ruby
34
+ gem install yamg
35
+
36
+
37
+ ## Features
38
+
39
+ * Find best version (size) to use from icons folder.
40
+ * Splash screen/banner generation with gravity.
41
+ * Works with iOS/Android/Other mobile with Phonegap or Cordova.
26
42
 
27
43
 
28
44
  ## Use
45
+
46
+ yamg
47
+
48
+ A `.yamg.yml` will be created on the folder.
49
+
50
+ ### Icons
51
+
52
+ Multiple sizes:
53
+ Just save your files with the size in pixels first, example:
54
+ In the 'icons/' folder: '16-icon.png', '32-icon.png', '512-icon.png'.
55
+ YAMG will choose the best size for the case, and don't touch
56
+ the icon if sizes are a match.
57
+
58
+ It's ok to (or if you) have only one icon, make it >512px.
59
+
60
+
61
+ ### Splash
62
+
63
+ The main splash image must be named 'center'.
64
+ Gravity!
65
+ Just save you files with the names: 'north', 'northeast', 'south'...
66
+ Gravity will put em in the correct place, with a lil padding.
67
+
68
+
69
+ ### Media
70
+
71
+ Addional media.
72
+ There's also media generator for app stores.
73
+
74
+
75
+ ## Screenshots (phantomjs)
76
+
77
+ Soon.
78
+
79
+ ### Support
80
+
81
+ * Web
82
+ * Rails
83
+ * iOS Project
84
+ * Android Project
85
+ * Cordova (platforms/*)
86
+ * Phonegap (www/res)
87
+ * App Store
88
+ * Play Store
89
+ * Facebook
90
+ * Twitter
91
+ * Write your own (really easy, fork and change yml)
data/bin/yamg CHANGED
@@ -1,9 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
-
4
3
  require 'yamg'
5
- puts Rainbow('Starting YAMG!').red
6
-
7
- y = YAMG.new
8
- y.compile
9
- y.screenshot
4
+ YAMG::CLI.new(ARGV)
data/lib/yamg/cli.rb ADDED
@@ -0,0 +1,79 @@
1
+ module YAMG
2
+ # Command line interface
3
+ class CLI
4
+ attr_accessor :works
5
+
6
+ def initialize(argv)
7
+ puts
8
+ puts Rainbow(' Y A M G').red
9
+ puts
10
+
11
+ return YAMG.init if argv.join =~ /init/
12
+ YAMG.load_config # (argv)
13
+ @works = YAMG.config['compile']
14
+ compile
15
+ screenshot
16
+ end
17
+
18
+ def setup_for(opts)
19
+ case opts
20
+ when Hash then opts
21
+ when String then { 'path' => opts }
22
+ when TrueClass then { 'path' => './media' }
23
+ else fail
24
+ end
25
+ end
26
+
27
+ def compile_icon(i, size, setup)
28
+ folder = setup['icon'] || YAMG.config['icon']['path']
29
+ round = setup['rounded'] || YAMG.config['icon']['rounded']
30
+ icon = Icon.new(folder, size, setup).image
31
+ to = File.join(setup['path'], i)
32
+ YAMG.write_out(icon, to)
33
+ # puts Rainbow("Icon #{size}px #{i} #{setup['path']}").black
34
+ print Rainbow('I').black
35
+ end
36
+
37
+ def compile_splash(s, size, setup)
38
+ path = setup['splash'] || YAMG.config['splash']['path']
39
+ splash = Splash.new(path, size, YAMG.config['splash']['background']).image
40
+ to = File.join(setup['path'], s)
41
+ YAMG.write_out(splash, to)
42
+ # puts Rainbow("Splash #{size.join('x')}px #{s} -> #{setup['path']}").black
43
+ print Rainbow('S').black
44
+ end
45
+
46
+ def compile_work(scope, opts)
47
+ setup = setup_for(opts)
48
+
49
+ if (task = YAMG::TEMPLATES[scope])
50
+ #Thread.new do # 200% speed up with 8 cores
51
+ task['icons'].each { |i, d| Thread.new { compile_icon(i, d, setup) }}
52
+ return unless task['splash']
53
+ task['splash'].each { |s, d| Thread.new { compile_splash(s, d, setup) }}
54
+ #end
55
+ else
56
+ # puts 'Custom job!'
57
+ end
58
+ end
59
+
60
+ def compile(scope = nil)
61
+ time = Time.now
62
+ works.select! { |w| w =~ scope } if scope
63
+ works.each { |out, opts| compile_work(out, opts) }
64
+ works.select! { |w| w =~ scope } if scope
65
+ puts Rainbow("Working on #{works.keys.join(', ')}").yellow
66
+
67
+ YAMG.config['screenshots'].each do |ss|
68
+ Thread.new { Screenshot.new(ss).work('./media') }
69
+ end
70
+ puts Rainbow(Thread.list.size.to_s + ' jobs').black
71
+ Thread.list.reject { |t| t == Thread.current }.each(&:join)
72
+ puts Rainbow('-' * 59).black
73
+ puts Rainbow("Done compile #{Time.now - time}").red
74
+ end
75
+
76
+ def screenshot
77
+ end
78
+ end
79
+ end
data/lib/yamg/icon.rb ADDED
@@ -0,0 +1,77 @@
1
+ module YAMG
2
+ #
3
+ # ICONS
4
+ #
5
+ #
6
+ class Icon
7
+ attr_accessor :src, :size, :rounded, :icons
8
+
9
+ def initialize(src, size, rounded = false)
10
+ fail if src.nil? || src.empty?
11
+ @src = src
12
+ @size = size
13
+ @rounded = rounded
14
+ @icons = YAMG.load_images(src)
15
+ end
16
+
17
+ def find_closest_gte_icon
18
+ return icons.max_by(&:to_i) if icons.map(&:to_i).max < size
19
+ icons.min_by do |f|
20
+ # n = x.match(/\d+/).to_s.to_i
21
+ n = f.to_i
22
+ size > n ? Float::INFINITY : n
23
+ end
24
+ end
25
+
26
+ def image
27
+ path = File.join(src, find_closest_gte_icon)
28
+ img = MiniMagick::Image.open(path)
29
+ img.resize size # "NxN"
30
+ rounded ? round(img) : img
31
+ end
32
+
33
+ #
34
+ # Maybe this can be smaller, terminal equivalent:
35
+ # convert
36
+ # -size 512x512 xc:none
37
+ # -draw "roundrectangle 0,0,512,512,55,55" mask.png
38
+ # convert icon.png
39
+ # -matte mask.png
40
+ # -compose DstIn
41
+ # -composite picture_with_rounded_corners.png
42
+ # https://gist.github.com/artemave/c20e7450af866f5e7735
43
+ def round(img, r = 14)
44
+ size = img.dimensions.join(',')
45
+ r = img.dimensions.max / r
46
+ radius = [r, r].join(',')
47
+
48
+ mask = MiniMagick::Image.open(img.path)
49
+ mask.format 'png'
50
+
51
+ mask.combine_options do |m|
52
+ m.alpha 'transparent'
53
+ m.background 'none'
54
+ m.draw "roundrectangle 0,0,#{size},#{radius}"
55
+ end
56
+
57
+ overlay = ::MiniMagick::Image.open img.path
58
+ overlay.format 'png'
59
+
60
+ overlay.combine_options do |o|
61
+ o.alpha 'transparent'
62
+ o.background 'none'
63
+ o.draw "roundrectangle 0,0,#{size},#{radius}"
64
+ end
65
+
66
+ masked = img.composite(mask, 'png') do |i|
67
+ i.alpha 'set'
68
+ i.compose 'DstIn'
69
+ end
70
+
71
+ masked.composite(overlay, 'png') do |i|
72
+ i.compose 'Over'
73
+ end
74
+ masked
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,35 @@
1
+ require 'screencap'
2
+ # require 'smartshot'
3
+
4
+ module YAMG
5
+ #
6
+ # Screenshot from multiple providers
7
+ #
8
+ class Screenshot
9
+ # include Capybara::DSL
10
+ attr_accessor :url, :size, :command
11
+
12
+ # Uses PhantomJS
13
+ def initialize(ss)
14
+ require 'smartshot'
15
+ require 'capybara'
16
+ require 'capybara/poltergeist'
17
+ @name, opts = *ss
18
+ uri = URI.parse(opts['url'])
19
+ @url = "http://#{uri}"
20
+ @size = opts['size'].split(/\s?,\s?/)
21
+ # @fetcher = Smartshot::Screenshot.new(window_size: @size)
22
+ @fetcher = Screencap::Fetcher.new(@url)
23
+
24
+ end
25
+
26
+ def work(path)
27
+ # visit(url)
28
+ # page.save_screenshot("#{path}/#{@name}.png")
29
+ # @fetcher.take_screenshot!(url: url, output: "#{path}/#{@name}.png")
30
+ @fetcher.fetch(output: "#{path}/#{@name}.png", width: @size[0], height: @size[1])
31
+ puts Rainbow("SS #{url} #{size}").black
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,58 @@
1
+ module YAMG
2
+ #
3
+ # SPLASH
4
+ #
5
+ #
6
+ class Splash
7
+ attr_accessor :src, :bg, :size, :icons, :img
8
+
9
+ def initialize(src, size, background)
10
+ @src = src
11
+ @size = size
12
+ @bg = background
13
+ @icons = YAMG.load_images(src)
14
+ end
15
+
16
+ #
17
+ # Center image
18
+ #
19
+ def splash_center(center)
20
+ icon_size = size.max / 4
21
+ img.resize icon_size if img.dimensions.max >= icon_size
22
+ img.background bg if bg
23
+ img.combine_options do |o|
24
+ o.gravity 'center'
25
+ o.extent size.join('x') # "WxH"
26
+ end
27
+ end
28
+
29
+ def compose(other, name)
30
+ img.composite(other) do |o|
31
+ o.compose 'Over'
32
+ o.gravity File.basename(name, '.*')
33
+ o.geometry '+40%+40%'
34
+ end
35
+ end
36
+
37
+ #
38
+ # Composite 9 gravity
39
+ #
40
+ def splash_composite(base)
41
+ max = base.dimensions.min / 9
42
+ icons.reduce(base) do |img, over|
43
+ other = MiniMagick::Image.open(File.join(src, over))
44
+ other.resize(max) if other.dimensions.max >= max
45
+ compose(other, over)
46
+ end
47
+ base
48
+ end
49
+
50
+ def image
51
+ center = icons.find { |i| i =~ /center/ }
52
+ icons.delete(center)
53
+ self.img = MiniMagick::Image.open(File.join(src, center))
54
+
55
+ splash_composite(splash_center(center))
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,197 @@
1
+ android:
2
+ icons:
3
+ 'res/drawable/icon.png': 96
4
+ 'res/drawable-ldpi/icon.png': 36
5
+ 'res/drawable-mdpi/icon.png': 48
6
+ 'res/drawable-hdpi/icon.png': 72
7
+ 'res/drawable-xhdpi/icon.png': 96
8
+ 'res/drawable-xxhdpi/icon.png': 256
9
+ 'bin/res/drawable/icon.png': 96
10
+ 'bin/res/drawable-ldpi/icon.png': 36
11
+ 'bin/res/drawable-mdpi/icon.png': 48
12
+ 'bin/res/drawable-hdpi/icon.png': 72
13
+ 'bin/res/drawable-xhdpi/icon.png': 96
14
+ 'ant-build/res/drawable/icon.png': 96
15
+ 'ant-build/res/drawable-ldpi/icon.png': 36
16
+ 'ant-build/res/drawable-mdpi/icon.png': 48
17
+ 'ant-build/res/drawable-hdpi/icon.png': 72
18
+ 'ant-build/res/drawable-xhdpi/icon.png': 96
19
+ splash:
20
+ 'res/drawable-port-ldpi/screen.png': [200, 320]
21
+ 'res/drawable-port-mdpi/screen.png': [320, 480]
22
+ 'res/drawable-port-hdpi/screen.png': [480, 800]
23
+ 'res/drawable-port-xhdpi/screen.png': [720, 1280]
24
+ 'res/drawable-land-ldpi/screen.png': [320, 200]
25
+ 'res/drawable-land-mdpi/screen.png': [480, 320]
26
+ 'res/drawable-land-hdpi/screen.png': [800, 480]
27
+ 'res/drawable-land-xhdpi/screen.png': [1280, 720]
28
+ 'bin/res/drawable-port-ldpi/screen.png': [200, 320]
29
+ 'bin/res/drawable-port-mdpi/screen.png': [320, 480]
30
+ 'bin/res/drawable-port-hdpi/screen.png': [480, 800]
31
+ 'bin/res/drawable-port-xhdpi/screen.png': [720, 1280]
32
+ 'bin/res/drawable-land-ldpi/screen.png': [320, 200]
33
+ 'bin/res/drawable-land-mdpi/screen.png': [480, 320]
34
+ 'bin/res/drawable-land-hdpi/screen.png': [800, 480]
35
+ 'bin/res/drawable-land-xhdpi/screen.png': [1280, 720]
36
+ 'ant-build/res/drawable-port-ldpi/screen.png': [200, 320]
37
+ 'ant-build/res/drawable-port-mdpi/screen.png': [320, 480]
38
+ 'ant-build/res/drawable-port-hdpi/screen.png': [480, 800]
39
+ 'ant-build/res/drawable-port-xhdpi/screen.png': [720, 1280]
40
+ 'ant-build/res/drawable-land-ldpi/screen.png': [320, 200]
41
+ 'ant-build/res/drawable-land-mdpi/screen.png': [480, 320]
42
+ 'ant-build/res/drawable-land-hdpi/screen.png': [800, 480]
43
+ 'ant-build/res/drawable-land-xhdpi/screen.png': [1280, 720]
44
+
45
+
46
+ ios:
47
+ icons:
48
+ 'Resources/icons/icon.png': 57
49
+ 'Resources/icons/icon@2x.png': 114
50
+ 'Resources/icons/icon-40.png': 40
51
+ 'Resources/icons/icon-40@2x.png': 80
52
+ 'Resources/icons/icon-40@3x.png': 120
53
+ 'Resources/icons/icon-50.png': 50
54
+ 'Resources/icons/icon-50@2x.png': 100
55
+ 'Resources/icons/icon-60.png': 60
56
+ 'Resources/icons/icon-60@2x.png': 120
57
+ 'Resources/icons/icon-60@3x.png': 180
58
+ 'Resources/icons/icon-72.png': 72
59
+ 'Resources/icons/icon-72@2x.png': 144
60
+ 'Resources/icons/icon-76.png': 76
61
+ 'Resources/icons/icon-76@2x.png': 152
62
+ 'Resources/icons/icon-120.png': 120
63
+ 'Resources/icons/icon-small.png': 29
64
+ 'Resources/icons/icon-small@2x.png': 58
65
+ 'Resources/icons/icon-small@3x.png': 87
66
+ splash:
67
+ 'Resources/splash/Default~iphone.png': [320, 480]
68
+ 'Resources/splash/Default@2x~iphone.png': [640, 960]
69
+ 'Resources/splash/Default-Landscape@2x~ipad.png': [2048, 1536]
70
+ 'Resources/splash/Default-Landscape~ipad.png': [1024, 768]
71
+ 'Resources/splash/Default-Portrait@2x~ipad.png': [1536, 2048]
72
+ 'Resources/splash/Default-Portrait~ipad.png': [768, 1024]
73
+ 'Resources/splash/Default-568h@2x~iphone.png': [640, 1136]
74
+ 'Resources/splash/Default-667h.png': [750, 1344]
75
+ 'Resources/splash/Default-736h.png': [1242, 2208]
76
+ 'Resources/splash/Default-Landscape-736h.png' : [2208, 1242]
77
+
78
+
79
+ phonegap:
80
+ icon:
81
+ 'icon/android/icon-36-ldpi.png': 36
82
+ 'icon/android/icon-48-mdpi.png': 48
83
+ 'icon/android/icon-72-hdpi.png': 72
84
+ 'icon/android/icon-96-xhdpi.png': 96
85
+ 'icon/blackberry/icon-80.png': 80
86
+ 'icon/ios/icon-57.png': 57
87
+ 'icon/ios/icon-57-2x.png': 114
88
+ 'icon/ios/icon-72.png': 72
89
+ 'icon/webos/icon-64.png': 64
90
+ 'icon/windows-phone/icon-173-tile.png': 173
91
+ 'icon/windows-phone/icon-62-tile.png': 62
92
+ 'icon/windows-phone/icon-48.png': 48
93
+ splash:
94
+ 'screen/android/screen-ldpi-landscape.png': [200, 320]
95
+ 'screen/android/screen-mdpi-landscape.png': [320, 480]
96
+ 'screen/android/screen-hdpi-landscape.png': [480, 800]
97
+ 'screen/android/screen-xhdpi-landscape.png': [720, 1280]
98
+ 'screen/android/screen-ldpi-portrait.png': [320, 200]
99
+ 'screen/android/screen-mdpi-portrait.png': [480, 320]
100
+ 'screen/android/screen-hdpi-portrait.png': [800, 480]
101
+ 'screen/android/screen-xhdpi-portrait.png': [1280, 720]
102
+ 'screen/blackberry/screen-225': [225]
103
+ 'screen/ios/screen-ipad-landscape-2x.png': [2048, 1536]
104
+ 'screen/ios/screen-ipad-landscape.png': [1024, 768]
105
+ 'screen/ios/screen-ipad-portrait-2x.png': [1536, 2048]
106
+ 'screen/ios/screen-ipad-portrait.png': [768, 1024]
107
+ 'screen/ios/screen-iphone-landscape.png': [480, 320]
108
+ 'screen/ios/screen-iphone-landscape-2x.png': [960, 640]
109
+ 'screen/ios/screen-iphone-portrait-2x.png': [640, 960]
110
+ 'screen/ios/screen-iphone-portrait-568h-2x.png': [640, 1136]
111
+ 'screen/ios/screen-iphone-portrait.png': [320, 480]
112
+ 'screen/ios/screen-iDefault~iphone.png': [320, 480]
113
+ 'screen/ios/screen-iDefault-667h.png': [750, 1344]
114
+ 'screen/ios/screen-iDefault-736h.png': [1242, 2208]
115
+ 'screen/ios/screen-iDefault-Landscape-736h.png': [2208, 1242]
116
+ 'screen/windows-phone/screen-portrait.jpg': [720, 1280]
117
+
118
+
119
+ web:
120
+ icons:
121
+ 'icon.png': 256
122
+ media:
123
+ 'media.png': 256
124
+
125
+
126
+ rails:
127
+ icons:
128
+ 'public/favicon.png': 16
129
+ 'public/favicon.ico': 16
130
+ 'public/icon.png': 512
131
+ 'app/assets/images/icon.png': 512
132
+ 'app/assets/images/favicon.png': 16
133
+ media:
134
+ 'public/logo.png': 512
135
+
136
+
137
+ twitter:
138
+ icons:
139
+ 'icon.png': 256
140
+
141
+
142
+ google:
143
+ icons:
144
+ 'icon.png': 512
145
+ 'icon1024.png': 1024
146
+ '180.png': 180
147
+ splash:
148
+ 'splash.png': [1024, 768]
149
+
150
+ apple:
151
+ icons:
152
+ 'icon.png': 1024
153
+ 'icon16.png': 16
154
+ splash:
155
+ 'splash.png': [1024, 768]
156
+ screenshots:
157
+
158
+ {filename: "android-10in-1280x720-land", width: 1280, height: 720, savePath: 'Media/android/screenshots/10in'},
159
+ {filename: "android-10in-2048x1152-land", width: 2048, height: 1152, savePath: 'Media/android/screenshots/10in'},
160
+ {filename: "android-7in-1280x800-land", width: 1280, height: 800, savePath: 'Media/android/screenshots/7in'},
161
+ {filename: "android-10in-1280x720-port", width: 720, height: 1280, savePath: 'Media/android/screenshots/10in'},
162
+ {filename: "android-10in-2048x1152-port", width: 1152, height: 2048, savePath: 'Media/android/screenshots/10in'},
163
+ {filename: "android-7in-1280x800-port", width: 800, height: 1280, savePath: 'Media/android/screenshots/7in'},
164
+ {filename: "android-4in-1280x720-land", width: 1920, height: 1080, savePath: 'Media/android/screenshots/4in'},
165
+ {filename: "android-4in-1280x720-port", width: 1080, height: 1920, savePath: 'Media/android/screenshots/4in'},
166
+ {filename: "ipad-1024x768-land", width: 1024, height: 768, savePath: 'Media/ios/screenshots/ipad'},
167
+ {
168
+ filename: "ipadretina-2048x1536-land",
169
+ width: 2048,
170
+ height: 1536,
171
+ devicePixelRatio: 2,
172
+ savePath: 'Media/ios/screenshots/ipadRetina'
173
+ },
174
+ {filename: "iphone4-960x640-land", width: 960, height: 640, savePath: 'Media/ios/screenshots/iphone4'},
175
+ {filename: "iphone5-1136x640-land", width: 1136, height: 640, savePath: 'Media/ios/screenshots/iphone5'},
176
+ {filename: "ipad-1024x768-port", width: 768, height: 1024, savePath: 'Media/ios/screenshots/ipad'},
177
+ {
178
+ filename: "ipadretina-2048x1536-port",
179
+ width: 1536,
180
+ height: 2048,
181
+ devicePixelRatio: 2,
182
+ savePath: 'Media/ios/screenshots/ipadRetina'
183
+ },
184
+ {filename: "iphone4-640x960-port", width: 640, height: 960, savePath: 'Media/ios/screenshots/iphone4'},
185
+ {filename: "iphone5-640x1136-port", width: 640, height: 1136, savePath: 'Media/ios/screenshots/iphone5'},
186
+ {filename: "iphone6p-1080x1920-port", width: 1080, height: 1920, savePath: 'Media/ios/screenshots/iphone6p'},
187
+ {filename: "iphone6p-1920x1080-land", width: 1920, height: 1080, savePath: 'Media/ios/screenshots/iphone6p'},
188
+ {filename: "iphone6-1334x750-land", width: 1334, height: 750, savePath: 'Media/ios/screenshots/iphone6'},
189
+ {filename: "iphone6-750x1334-port", width: 750, height: 1334, savePath: 'Media/ios/screenshots/iphone6'}
190
+ ]
191
+
192
+ facebook:
193
+ icons:
194
+ 'icon.png': 1024
195
+ 'icon16.png': 16
196
+ splash:
197
+ 'splash.png': [1024, 768]
data/lib/yamg/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # :nodoc:
2
2
  module YAMG
3
- VERSION = '0.0.5'
3
+ VERSION = '0.0.7'
4
4
  end
data/lib/yamg/yamg.yml ADDED
@@ -0,0 +1,61 @@
1
+ #
2
+ # YAMG Configuration
3
+ #
4
+
5
+ # Main icon
6
+ icon:
7
+ path: 'icons' # path to icons folder
8
+ rounded: true # defaults to false
9
+ background: false # or color RGB
10
+
11
+ # Splash screen
12
+ splash:
13
+ path: 'splash'
14
+ background: '#fff6d5' # or color RGB
15
+
16
+ # Icon + name for instance
17
+ media:
18
+ path: 'media.png'
19
+ background: false
20
+
21
+ #
22
+ # What to do?
23
+ #
24
+ compile:
25
+
26
+ # Web projects
27
+ #
28
+ web: true
29
+ # Ruby on rails
30
+ rails:
31
+ path: '/path/to/rails/proj'
32
+ icon: './alpha' # Using another icon src folder
33
+
34
+ # Mobile
35
+ #
36
+ # phonegap: '../path/to/project/www/res'
37
+ # cordova: 'soon shortcut'
38
+ # Cordova/iOS project
39
+ ios: '/path/to/project/platforms/ios/ProjectName/'
40
+ # Cordova/Android project
41
+ android: '/path/to/project/platforms/android/'
42
+ # winos: '../proj'
43
+
44
+ # Assets for web stores/players
45
+ #
46
+ # Compiles to media/playstore
47
+ apple: true
48
+ # Compiles to media/playstore
49
+ google: true
50
+ # Compiles to media/playstore
51
+ twitter: true
52
+ # Compiles to media/playstore
53
+ facebook: true
54
+ # Compiles to media/custom
55
+ custom:
56
+ icons: [32, 64, 128]
57
+ medias: [400, 800]
58
+
59
+ screenshots:
60
+ home:
61
+ url: 'notabe.com'
data/lib/yamg.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'rainbow'
3
+ require 'screencap'
3
4
  require 'mini_magick'
4
5
 
5
6
  MiniMagick.processor = :gm if ENV['gm']
@@ -7,394 +8,59 @@ MiniMagick.processor = :gm if ENV['gm']
7
8
  #
8
9
  # Yet Another Media Generator
9
10
  #
10
- class YAMG
11
- attr_accessor :config
12
-
13
- TEMPLATES = {
14
-
15
- #
16
- # Android Cordova/Phonegap
17
- #
18
- android: {
19
- # TODO: check if we really need this duplication on android
20
- icons: {
21
- 'res/drawable/icon.png' => 96,
22
- 'res/drawable-ldpi/icon.png' => 36,
23
- 'res/drawable-mdpi/icon.png' => 48,
24
- 'res/drawable-hdpi/icon.png' => 72,
25
- 'res/drawable-xhdpi/icon.png' => 96,
26
- 'res/drawable-xxhdpi/icon.png' => 256,
27
- 'bin/res/drawable/icon.png' => 96,
28
- 'bin/res/drawable-ldpi/icon.png' => 36,
29
- 'bin/res/drawable-mdpi/icon.png' => 48,
30
- 'bin/res/drawable-hdpi/icon.png' => 72,
31
- 'bin/res/drawable-xhdpi/icon.png' => 96,
32
- 'ant-build/res/drawable/icon.png' => 96,
33
- 'ant-build/res/drawable-ldpi/icon.png' => 36,
34
- 'ant-build/res/drawable-mdpi/icon.png' => 48,
35
- 'ant-build/res/drawable-hdpi/icon.png' => 72,
36
- 'ant-build/res/drawable-xhdpi/icon.png' => 96
37
- },
38
- splash: {
39
- 'res/drawable-port-ldpi/screen.png' => [200, 320],
40
- 'res/drawable-port-mdpi/screen.png' => [320, 480],
41
- 'res/drawable-port-hdpi/screen.png' => [480, 800],
42
- 'res/drawable-port-xhdpi/screen.png' => [720, 1280],
43
- 'res/drawable-land-ldpi/screen.png' => [320, 200],
44
- 'res/drawable-land-mdpi/screen.png' => [480, 320],
45
- 'res/drawable-land-hdpi/screen.png' => [800, 480],
46
- 'res/drawable-land-xhdpi/screen.png' => [1280, 720],
47
- 'bin/res/drawable-port-ldpi/screen.png' => [200, 320],
48
- 'bin/res/drawable-port-mdpi/screen.png' => [320, 480],
49
- 'bin/res/drawable-port-hdpi/screen.png' => [480, 800],
50
- 'bin/res/drawable-port-xhdpi/screen.png' => [720, 1280],
51
- 'bin/res/drawable-land-ldpi/screen.png' => [320, 200],
52
- 'bin/res/drawable-land-mdpi/screen.png' => [480, 320],
53
- 'bin/res/drawable-land-hdpi/screen.png' => [800, 480],
54
- 'bin/res/drawable-land-xhdpi/screen.png' => [1280, 720],
55
- 'ant-build/res/drawable-port-ldpi/screen.png' => [200, 320],
56
- 'ant-build/res/drawable-port-mdpi/screen.png' => [320, 480],
57
- 'ant-build/res/drawable-port-hdpi/screen.png' => [480, 800],
58
- 'ant-build/res/drawable-port-xhdpi/screen.png' => [720, 1280],
59
- 'ant-build/res/drawable-land-ldpi/screen.png' => [320, 200],
60
- 'ant-build/res/drawable-land-mdpi/screen.png' => [480, 320],
61
- 'ant-build/res/drawable-land-hdpi/screen.png' => [800, 480],
62
- 'ant-build/res/drawable-land-xhdpi/screen.png' => [1280, 720]
63
- }
64
- },
65
-
66
- #
67
- # iOS cordova/phonegap
68
- #
69
- ios: {
70
- icons: {
71
- 'Resources/icons/icon.png' => 57,
72
- 'Resources/icons/icon@2x.png' => 114,
73
- 'Resources/icons/icon-40.png' => 40,
74
- 'Resources/icons/icon-40@2x.png' => 80,
75
- 'Resources/icons/icon-40@3x.png' => 120,
76
- 'Resources/icons/icon-50.png' => 50,
77
- 'Resources/icons/icon-50@2x.png' => 100,
78
- 'Resources/icons/icon-60.png' => 60,
79
- 'Resources/icons/icon-60@2x.png' => 120,
80
- 'Resources/icons/icon-60@3x.png' => 180,
81
- 'Resources/icons/icon-72.png' => 72,
82
- 'Resources/icons/icon-72@2x.png' => 144,
83
- 'Resources/icons/icon-76.png' => 76,
84
- 'Resources/icons/icon-76@2x.png' => 152,
85
- 'Resources/icons/icon-120.png' => 120,
86
- 'Resources/icons/icon-small.png' => 29,
87
- 'Resources/icons/icon-small@2x.png' => 58,
88
- 'Resources/icons/icon-small@3x.png' => 87
89
- },
90
- splash: {
91
- 'Resources/splash/Default~iphone.png' => [320, 480],
92
- 'Resources/splash/Default@2x~iphone.png' => [640, 960],
93
- 'Resources/splash/Default-Landscape@2x~ipad.png' => [2048, 1536],
94
- 'Resources/splash/Default-Landscape~ipad.png' => [1024, 768],
95
- 'Resources/splash/Default-Portrait@2x~ipad.png' => [1536, 2048],
96
- 'Resources/splash/Default-Portrait~ipad.png' => [768, 1024],
97
- 'Resources/splash/Default-568h@2x~iphone.png' => [640, 1136],
98
- 'Resources/splash/Default-667h.png' => [750, 1344],
99
- 'Resources/splash/Default-736h.png' => [1242, 2208],
100
- 'Resources/splash/Default-Landscape-736h.png' => [2208, 1242]
101
- }
102
- },
103
-
104
- #
105
- # Phonegap www/res/
106
- #
107
- phonegap: {
108
- icon: {
109
- 'icon/android/icon-36-ldpi.png' => 36,
110
- 'icon/android/icon-48-mdpi.png' => 48,
111
- 'icon/android/icon-72-hdpi.png' => 72,
112
- 'icon/android/icon-96-xhdpi.png' => 96,
113
- 'icon/blackberry/icon-80.png' => 80,
114
- 'icon/ios/icon-57.png' => 57,
115
- 'icon/ios/icon-57-2x.png' => 114,
116
- 'icon/ios/icon-72.png' => 72,
117
- 'icon/webos/icon-64.png' => 64,
118
- 'icon/windows-phone/icon-173-tile.png' => 173,
119
- 'icon/windows-phone/icon-62-tile.png' => 62,
120
- 'icon/windows-phone/icon-48.png' => 48
121
- },
122
- splash: {
123
- 'screen/android/screen-ldpi-landscape.png' => [200, 320],
124
- 'screen/android/screen-mdpi-landscape.png' => [320, 480],
125
- 'screen/android/screen-hdpi-landscape.png' => [480, 800],
126
- 'screen/android/screen-xhdpi-landscape.png' => [720, 1280],
127
- 'screen/android/screen-ldpi-portrait.png' => [320, 200],
128
- 'screen/android/screen-mdpi-portrait.png' => [480, 320],
129
- 'screen/android/screen-hdpi-portrait.png' => [800, 480],
130
- 'screen/android/screen-xhdpi-portrait.png' => [1280, 720],
131
- 'screen/blackberry/screen-225' => [225],
132
- 'screen/ios/screen-ipad-landscape-2x.png' => [2048, 1536],
133
- 'screen/ios/screen-ipad-landscape.png' => [1024, 768],
134
- 'screen/ios/screen-ipad-portrait-2x.png' => [1536, 2048],
135
- 'screen/ios/screen-ipad-portrait.png' => [768, 1024],
136
- 'screen/ios/screen-iphone-landscape.png' => [480, 320],
137
- 'screen/ios/screen-iphone-landscape-2x.png' => [960, 640],
138
- 'screen/ios/screen-iphone-portrait-2x.png' => [640, 960],
139
- 'screen/ios/screen-iphone-portrait-568h-2x.png' => [640, 1136],
140
- 'screen/ios/screen-iphone-portrait.png' => [320, 480],
141
- 'screen/ios/screen-iDefault~iphone.png' => [320, 480],
142
- 'screen/ios/screen-iDefault-667h.png' => [750, 1344],
143
- 'screen/ios/screen-iDefault-736h.png' => [1242, 2208],
144
- 'screen/ios/screen-iDefault-Landscape-736h.png' => [2208, 1242],
145
- 'screen/windows-phone/screen-portrait.jpg' => [720, 1280]
146
- }
147
- },
148
-
149
- #
150
- # WWW
151
- #
152
- web: {
153
- icons: {
154
- 'icon.png' => 256
155
- },
156
- media: {
157
- 'media.png' => 256
158
- }
159
- },
160
-
161
- rails: {
162
- icons: {
163
- 'public/favicon.png' => 16,
164
- 'public/favicon.ico' => 16,
165
- 'public/icon.png' => 512,
166
- 'app/assets/images/icon.png' => 512,
167
- 'app/assets/images/favicon.png' => 16
168
- },
169
- media: {
170
- 'public/logo.png' => 512
171
- }
172
- },
173
-
174
- twitter: {
175
- icons: {
176
- 'icon.png' => 256
177
- }
178
- },
179
-
180
- #
181
- # Play Store
182
- #
183
- google: {
184
- icons: {
185
- 'icon.png' => 512,
186
- 'icon1024.png' => 1024, # [1024, 500]
187
- '180.png' => 180, # 180, 120
188
- },
189
- splash: {
190
- 'splash.png' => [1024, 768]
191
- }
192
- },
193
-
194
- #
195
- # App Store
196
- #
197
- apple: {
198
- icons: {
199
- 'icon.png' => 1024,
200
- 'icon16.png' => 16
201
- },
202
- splash: {
203
- 'splash.png' => [1024, 768]
204
- }
205
- },
206
-
207
- facebook: {
208
- icons: {
209
- 'icon.png' => 1024,
210
- 'icon16.png' => 16
211
- },
212
- splash: {
213
- 'splash.png' => [1024, 768]
214
- }
215
- }
216
- }
217
-
218
- def initialize
219
- load_config
220
- end
221
-
222
- def load_config
223
- self.config = YAML.load_file('./.yamg.yml').freeze
224
- rescue Errno::ENOENT
225
- puts 'Create config!'
226
- exit 1
227
- end
228
-
229
- def setup_for(opts)
230
- case opts
231
- when Hash then opts
232
- when String then { 'path' => opts }
233
- when TrueClass then { 'path' => './media' }
234
- else fail
235
- end
236
- end
237
-
238
- #
239
- # Writes image to disk
240
- #
241
- def write_out(img, path)
242
- img.format File.extname(path)
243
- FileUtils.mkdir_p File.dirname(path)
244
- img.write(path)
245
- rescue Errno::ENOENT
246
- puts
247
- puts Rainbow("Path not found '#{path}'").red
248
- exit 1
249
- end
250
-
251
- def compile_work(scope, opts)
252
- puts Rainbow("Working on #{scope}'").blue
253
- setup = setup_for(opts)
254
-
255
- if (t = TEMPLATES[scope.to_sym])
256
- Thread.new do # 200% speed up with 8 cores
257
- icon_work(t[:icons], setup)
258
- splash_work(t[:splash], setup) if t[:splash]
11
+ module YAMG
12
+ autoload :CLI, 'yamg/cli'
13
+ autoload :Icon, 'yamg/icon'
14
+ autoload :Splash, 'yamg/splash'
15
+ autoload :Screenshot, 'yamg/screenshot'
16
+
17
+ # Load template works
18
+ TEMPLATES = YAML.load_file(
19
+ File.join(File.dirname(__FILE__), 'yamg', 'templates.yaml')
20
+ )
21
+
22
+ # def initialize(conf = './.yamg.yml')
23
+ # load_config(conf)
24
+ # end
25
+ class << self
26
+ attr_accessor :config
27
+
28
+ def init
29
+ file = './.yamg.yml'
30
+ if File.exist?(file)
31
+ puts "File exists: '#{file}'"
32
+ exit 1
259
33
  end
260
- else
261
- puts 'Custom job!'
34
+ puts Rainbow('Creating your configuration').black
35
+ src = File.join(File.dirname(__FILE__), 'yamg', 'yamg.yml')
36
+ FileUtils.cp(src, file)
262
37
  end
263
- end
264
-
265
- def compile(scope = nil)
266
- time = Time.now
267
- works = config['compile']
268
- works.select! { |w| w =~ scope } if scope
269
- works.each { |out, opts| compile_work(out, opts) }
270
- Thread.list.reject { |t| t == Thread.current }.each(&:join)
271
- puts Rainbow("Done compile #{Time.now - time}").red
272
- end
273
-
274
- #
275
- #
276
- # ICONS
277
- #
278
- #
279
- def load_icons(path)
280
- return [path] unless File.extname(path).empty?
281
- Dir["#{path}/*.png"].map { |f| File.basename(f) }
282
- end
283
-
284
- def find_closest_gte_icon(size, icons)
285
- return icons.max_by(&:to_i) if icons.map(&:to_i).max < size
286
- icons.min_by do |f|
287
- # n = x.match(/\d+/).to_s.to_i
288
- n = f.to_i
289
- size > n ? Float::INFINITY : n
290
- end
291
- end
292
-
293
- def icon_work(files, setup)
294
- path = setup['icon'] || config['icon']['path']
295
- rounded = setup['rounded'] || config['icon']['rounded']
296
- icons = load_icons(path)
297
- puts Rainbow("Starting in #{path} with #{icons} | #{setup}").blue
298
- files.each do |file, size|
299
- from = File.join(path, find_closest_gte_icon(size, icons))
300
- to = File.join(setup['path'], file)
301
- puts "#{File.basename from} -> #{to} (#{size}px)"
302
- image = MiniMagick::Image.open(from)
303
- image.resize size # "NxN"
304
- image = round(image) if rounded
305
- write_out(image, to)
306
- end
307
- end
308
-
309
- # https://gist.github.com/artemave/c20e7450af866f5e7735
310
- def round(img, r = 14)
311
- size = img.dimensions.join(',')
312
- r = img.dimensions.max / r
313
- radius = [r, r].join(',')
314
-
315
- mask = MiniMagick::Image.open(img.path)
316
- mask.format 'png'
317
-
318
- mask.combine_options do |m|
319
- m.alpha 'transparent'
320
- m.background 'none'
321
- m.draw "roundrectangle 0,0,#{size},#{radius}"
322
- end
323
-
324
- overlay = ::MiniMagick::Image.open img.path
325
- overlay.format 'png'
326
38
 
327
- overlay.combine_options do |o|
328
- o.alpha 'transparent'
329
- o.background 'none'
330
- o.draw "roundrectangle 0,0,#{size},#{radius}"
39
+ def load_config(conf = './.yamg.yml')
40
+ self.config = YAML.load_file(conf).freeze
41
+ rescue Errno::ENOENT
42
+ puts Rainbow('Create config! Run: `yamg init`').red
43
+ exit 1
331
44
  end
332
45
 
333
- masked = img.composite(mask, 'png') do |i|
334
- i.alpha 'set'
335
- i.compose 'DstIn'
46
+ def load_images(dir)
47
+ return [dir] unless File.extname(dir).empty?
48
+ Dir["#{dir}/*.png"].map { |f| File.basename(f) }
336
49
  end
337
50
 
338
- masked.composite(overlay, 'png') do |i|
339
- i.compose 'Over'
340
- end
341
- masked
342
-
343
- # convert
344
- # -size 512x512 xc:none
345
- # -draw "roundrectangle 0,0,512,512,55,55" mask.png
346
- # convert icon.png
347
- # -matte mask.png
348
- # -compose DstIn
349
- # -composite picture_with_rounded_corners.png
350
- end
351
-
352
- #
353
- #
354
- # SPLASH
355
- #
356
- #
357
- def splash_center(path, size, bg = config['splash']['background'])
358
- icon_size = size.max / 4
359
- image = MiniMagick::Image.open(path)
360
- image.resize icon_size if image.dimensions.max >= icon_size
361
- image.background bg if bg
362
- image.combine_options do |o|
363
- o.gravity 'center'
364
- o.extent size.join('x') # "WxH"
365
- end
366
- end
367
-
368
- def splash_composite(base, icons)
369
- max = base.dimensions.min / 9
370
- icons.reduce(base) do |img, over|
371
- oimg = MiniMagick::Image.open(File.join(config['splash']['path'], over))
372
- oimg.resize(max) if oimg.dimensions.max >= max
373
- img.composite(oimg) do |o|
374
- o.compose 'Over'
375
- o.gravity File.basename(over, '.*')
376
- o.geometry '+40%+40%'
377
- end
378
- end
379
- end
380
-
381
- def splash_work(screens, setup)
382
- path = config['splash']['path']
383
- icons = load_icons(path)
384
- center = icons.find { |i| i =~ /center/ }
385
- icons.delete(center)
386
-
387
- puts Rainbow("Starting splashes | #{setup}").blue
388
- screens.each do |file, size|
389
- to = File.join(setup['path'], file)
390
- image = splash_center(File.join(path, center), size)
391
- write_out(splash_composite(image, icons), to)
51
+ #
52
+ # Writes image to disk
53
+ #
54
+ def write_out(img, path)
55
+ img.format File.extname(path)
56
+ FileUtils.mkdir_p File.dirname(path)
57
+ img.write(path)
58
+ rescue Errno::ENOENT
59
+ puts
60
+ puts Rainbow("Path not found '#{path}'").red
61
+ exit 1
392
62
  end
393
63
  end
394
-
395
- def screenshot
396
- puts 'SS'
397
- end
398
64
  end
399
65
 
400
66
  # },
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ # require 'pry'
3
+ begin
4
+ require 'spec'
5
+ rescue LoadError
6
+ require 'rspec'
7
+ end
8
+
9
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+
12
+ require 'yamg'
13
+
14
+ if ENV['CI']
15
+ require 'coveralls'
16
+ Coveralls.wear!
17
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe YAMG do
4
+ it 'should instantiate' do
5
+ stub_const('YAML', y = class_double('YAML'))
6
+ expect(y).to receive(:load_file).and_return({})
7
+
8
+ expect { YAMG.new }.to_not raise_error
9
+ end
10
+
11
+ describe 'stubbed' do
12
+ let :conf do
13
+ stub_const('YAML', class_double('YAML'))
14
+ end
15
+
16
+ it 'should read conf icon' do
17
+ expect(conf).to receive(:load_file).and_return(icon: {})
18
+ expect(YAMG.new.config).to eq(icon: {})
19
+ end
20
+
21
+ describe 'simple setup' do
22
+ it 'should map true to media' do
23
+ expect(conf).to receive(:load_file).and_return({})
24
+ expect(YAMG.new.setup_for(true)).to eq('path' => './media')
25
+ end
26
+ end
27
+ end
28
+ end
data/yamg.gemspec CHANGED
@@ -21,5 +21,6 @@ Gem::Specification.new do |s|
21
21
  s.require_paths = ['lib']
22
22
 
23
23
  s.add_dependency 'mini_magick'
24
+ s.add_dependency 'screencap'
24
25
  s.add_dependency 'rainbow'
25
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yamg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcos Piccinini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-26 00:00:00.000000000 Z
11
+ date: 2015-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mini_magick
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: screencap
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rainbow
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -57,7 +71,15 @@ files:
57
71
  - Rakefile
58
72
  - bin/yamg
59
73
  - lib/yamg.rb
74
+ - lib/yamg/cli.rb
75
+ - lib/yamg/icon.rb
76
+ - lib/yamg/screenshot.rb
77
+ - lib/yamg/splash.rb
78
+ - lib/yamg/templates.yaml
60
79
  - lib/yamg/version.rb
80
+ - lib/yamg/yamg.yml
81
+ - spec/spec_helper.rb
82
+ - spec/yamg/yamg_spec.rb
61
83
  - yamg.gemspec
62
84
  homepage: http://github.com/nofxx/yamg
63
85
  licenses:
@@ -83,4 +105,6 @@ rubygems_version: 2.4.7
83
105
  signing_key:
84
106
  specification_version: 4
85
107
  summary: Yet another media generator
86
- test_files: []
108
+ test_files:
109
+ - spec/spec_helper.rb
110
+ - spec/yamg/yamg_spec.rb