badges2svg 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/bin/badges2svg +26 -0
  3. data/lib/badges2svg.rb +104 -0
  4. data/tests/tests.rb +245 -0
  5. metadata +118 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 85ed3f975ac572f368e96138a1faffed45c08879
4
+ data.tar.gz: 4b03e753f135fcebc11ef4a6ddfc24f26169017f
5
+ SHA512:
6
+ metadata.gz: 8914c8c2e49d53b73f8ee53159c731b082827d076203bbcd12b76cf8369b69e47b9d746cc9226dcb3551a27bc672eb91aee33ec37ab12bdc9ca4babe351d9dd6
7
+ data.tar.gz: 1871ed4504be163892781a8393fa76534fe2fe5c95da957d089351cd301f2a277faf4458b678071d0479f609e8fbb5dbed242cfcd8f359df79dc9d31854839e9
data/bin/badges2svg ADDED
@@ -0,0 +1,26 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ require 'trollop'
5
+ require 'badges2svg'
6
+
7
+ opts = Trollop.options do
8
+ version "badges2svg #{BadgesToSVG.version}"
9
+ banner <<-EOS
10
+ badges2svg is a tool to replace your PNG GitHub badges into SVG ones.
11
+
12
+ Usage:
13
+ badges2svg <file>
14
+ EOS
15
+ end
16
+
17
+ if ARGV.empty?
18
+ puts 'Error: No file provided. Use -h or --help to see the help.'
19
+ exit 1
20
+ end
21
+
22
+ content = File.read(ARGV[0])
23
+
24
+ File.open(ARGV[0], 'w') do |f|
25
+ f.write(BadgesToSVG.replace(content))
26
+ end
data/lib/badges2svg.rb ADDED
@@ -0,0 +1,104 @@
1
+ module BadgesToSVG
2
+ class << self
3
+
4
+ ROOT = 'https://img.shields.io'
5
+
6
+ # see http://shields.io/
7
+ RULES = [
8
+ { :name => :travis_branch,
9
+ :pattern => 'https?://(?:secure.)?travis-ci.org/%{user}/%{repo}.png' +
10
+ '\\?branch=%{branch}',
11
+ :string => '/travis/%{user}/%{repo}/%{branch}.svg'
12
+ },
13
+ {
14
+ :name => :travis,
15
+ :pattern => 'https?://(?:secure.)?travis-ci.org/%{user}/%{repo}.png',
16
+ :string => '/travis/%{user}/%{repo}.svg'
17
+ },
18
+ {
19
+ :name => :gittip,
20
+ :pattern => 'https?://img.shields.io/gittip/%{user}.png',
21
+ :string => '/gittip/%{user}.svg'
22
+ },
23
+ {
24
+ :name => :coveralls_branch,
25
+ :pattern => 'https?://coveralls.io/repos/%{user}/%{repo}/badge.png' +
26
+ '\\?branch=%{branch}',
27
+ :string => '/coveralls/%{user}/%{repo}/%{branch}.svg'
28
+ },
29
+ {
30
+ :name => :coveralls,
31
+ :pattern => 'https?://coveralls.io/repos/%{user}/%{repo}/badge.png',
32
+ :string => '/coveralls/%{user}/%{repo}.svg'
33
+ },
34
+ {
35
+ :name => :gemnasium,
36
+ :pattern => 'https?://gemnasium.com/%{user}/%{repo}.png',
37
+ :string => '/gemnasium/%{user}/%{repo}.svg'
38
+ },
39
+ {
40
+ :name => :code_climate,
41
+ :pattern => 'https://codeclimate.com/github/%{user}/%{repo}.png',
42
+ :string => '/codeclimate/github/%{user}/%{repo}.svg'
43
+ },
44
+
45
+ {
46
+ :name => :gem_version,
47
+ :pattern => 'https?://badge.fury.io/rb/%{repo}(?:@2x)?.png',
48
+ :string => '/gem/v/%{repo}.svg'
49
+ },
50
+ {
51
+ :name => :npm_version,
52
+ :pattern => 'https?://badge.fury.io/js/%{repo}(?:@2x)?.png',
53
+ :string => '/npm/v/%{repo}.svg'
54
+ },
55
+ {
56
+ :name => :pypi_version,
57
+ :pattern => 'https?://badge.fury.io/py/%{repo}(?:@2x)?.png',
58
+ :string => '/pypi/v/%{repo}.svg'
59
+ },
60
+ {
61
+ :name => :packagist_version,
62
+ :pattern => 'https?://poser.pugx.org/%{user}/%{repo}/version.png',
63
+ :string => '/packagist/v/%{user}/%{repo}.svg'
64
+ },
65
+
66
+ {
67
+ :name => :packagist_downloads,
68
+ :pattern => 'https?://poser.pugx.org/%{user}/%{repo}/d/total.png',
69
+ :string => '/packagist/dm/%{user}/%{repo}.svg'
70
+ },
71
+ {
72
+ :name => :pypi_downloads,
73
+ :pattern => 'https?://pypip.in/d/%{repo}/badge.png',
74
+ :string => '/pypi/dm/%{repo}.svg'
75
+ },
76
+
77
+ {
78
+ :name => :misc_png,
79
+ :pattern => 'https?://img.shields.io/%{path}.png',
80
+ :string => '/%{path}.svg'
81
+ },
82
+ ]
83
+
84
+ def version
85
+ '0.1.0'
86
+ end
87
+
88
+ def compile_pattern(pat, *a)
89
+ pat = pat.gsub(/\./, '\\.')
90
+ Regexp.new ("\\b#{pat.gsub(/%\{(\w+)\}/, "(?<\\1>.+?)")}\\b")
91
+ end
92
+
93
+ def replace ct
94
+ content = ct.clone
95
+ RULES.each do |r|
96
+ content.gsub!(compile_pattern(r[:pattern]),
97
+ ROOT + r[:string].gsub(/%\{(\w+)\}/, "\\\\k<\\1>"))
98
+ end
99
+
100
+ content
101
+ end
102
+
103
+ end
104
+ end
data/tests/tests.rb ADDED
@@ -0,0 +1,245 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+
7
+ require 'test/unit'
8
+ require 'simplecov'
9
+
10
+ test_dir = File.expand_path( File.dirname(__FILE__) )
11
+
12
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
13
+ SimpleCov.start { add_filter '/tests/' }
14
+
15
+ require 'badges2svg'
16
+
17
+ for t in Dir.glob( File.join( test_dir, '*_tests.rb' ) )
18
+ require t
19
+ end
20
+
21
+ class BadgesToSVGTests < Test::Unit::TestCase
22
+
23
+ # == BadgesToSVG#version == #
24
+
25
+ def test_version
26
+ assert(BadgesToSVG.version =~ /^\d+\.\d+\.\d+/)
27
+ end
28
+
29
+ # == BadgesToSVG#compile_pattern == #
30
+
31
+ def test_compile_pattern_empty
32
+ assert_equal(/\b\b/, BadgesToSVG.compile_pattern(""))
33
+ end
34
+
35
+ def test_compile_pattern_no_special_chars
36
+ assert_equal(/\bfoobar\b/, BadgesToSVG.compile_pattern("foobar"))
37
+ assert_equal(/\bq-a yo\b/, BadgesToSVG.compile_pattern("q-a yo"))
38
+ end
39
+
40
+ def test_compile_pattern_with_special_chars
41
+ assert_equal(/\bfoo\.bar\b/, BadgesToSVG.compile_pattern("foo.bar"))
42
+ assert_equal(/\ba?\b/, BadgesToSVG.compile_pattern("a?"))
43
+ end
44
+
45
+ def test_compile_pattern_with_one_field_name
46
+ assert_equal(/\b(?<abc>.+?)\b/, BadgesToSVG.compile_pattern("%{abc}"))
47
+ assert_equal(/\ba?\b/, BadgesToSVG.compile_pattern("a?"))
48
+ end
49
+
50
+ def test_compile_pattern_with_multiple_field_names
51
+ assert_equal(/\b(?<a>.+?)\/(?<b>.+?)\b/,
52
+ BadgesToSVG.compile_pattern("%{a}/%{b}"))
53
+ end
54
+
55
+ # == BadgesToSVG#replace == #
56
+
57
+ def test_replace_empty_file
58
+ assert_equal("", BadgesToSVG.replace(""))
59
+ end
60
+
61
+ def test_replace_simple_file
62
+ ct = "# README\n\nHello World!"
63
+ assert_equal(ct, BadgesToSVG.replace(ct))
64
+ end
65
+
66
+ ## travis
67
+
68
+ def test_replace_one_travis_https
69
+ ct1 = "# README\n\nHello ![](https://secure.travis-ci.org/usr/re.png)"
70
+ ct2 = "# README\n\nHello ![](https://img.shields.io/travis/usr/re.svg)"
71
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
72
+ end
73
+
74
+ def test_replace_one_travis_http
75
+ ct1 = "# README\n\nHello ![](http://travis-ci.org/usr/re.png)"
76
+ ct2 = "# README\n\nHello ![](https://img.shields.io/travis/usr/re.svg)"
77
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
78
+ end
79
+
80
+ ## travis_branch
81
+
82
+ def test_replace_one_travis_branch_https
83
+ ct1 = "# README\n\nHello ![](https://secure.travis-ci.org/usr/re.png?branch=bx)"
84
+ ct2 = "# README\n\nHello ![](https://img.shields.io/travis/usr/re/bx.svg)"
85
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
86
+ end
87
+
88
+ def test_replace_one_travis_branch_http
89
+ ct1 = "# README\n\nHello ![](http://travis-ci.org/usr/re.png?branch=aa)"
90
+ ct2 = "# README\n\nHello ![](https://img.shields.io/travis/usr/re/aa.svg)"
91
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
92
+ end
93
+
94
+ ## gittip
95
+
96
+ def test_replace_one_gittip_http
97
+ ct1 = "here is a badge: ![](http://img.shields.io/gittip/sferik.png)"
98
+ ct2 = "here is a badge: ![](https://img.shields.io/gittip/sferik.svg)"
99
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
100
+ end
101
+
102
+ def test_replace_one_gittip_https
103
+ ct1 = "here is a badge: ![](https://img.shields.io/gittip/sferik.png)"
104
+ ct2 = "here is a badge: ![](https://img.shields.io/gittip/sferik.svg)"
105
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
106
+ end
107
+
108
+ ## coveralls
109
+
110
+ def test_replace_one_coveralls_http
111
+ ct1 = "hello ![](http://coveralls.io/repos/sferik/t/badge.png)"
112
+ ct2 = "hello ![](https://img.shields.io/coveralls/sferik/t.svg)"
113
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
114
+ end
115
+
116
+ def test_replace_one_coveralls_https
117
+ ct1 = "hello ![](https://coveralls.io/repos/sferik/t/badge.png)"
118
+ ct2 = "hello ![](https://img.shields.io/coveralls/sferik/t.svg)"
119
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
120
+ end
121
+
122
+ ## coveralls_branch
123
+
124
+ def test_replace_one_coveralls_branch_http
125
+ ct1 = "hello ![](http://coveralls.io/repos/sferik/t/badge.png?branch=abc)"
126
+ ct2 = "hello ![](https://img.shields.io/coveralls/sferik/t/abc.svg)"
127
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
128
+ end
129
+
130
+ def test_replace_one_coveralls_branch_https
131
+ ct1 = "hello ![](https://coveralls.io/repos/sferik/t/badge.png?branch=abc)"
132
+ ct2 = "hello ![](https://img.shields.io/coveralls/sferik/t/abc.svg)"
133
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
134
+ end
135
+
136
+ ## gemnasium
137
+
138
+ def test_replace_one_gemnasium_http
139
+ ct1 = "![](http://gemnasium.com/sferik/t.png)"
140
+ ct2 = "![](https://img.shields.io/gemnasium/sferik/t.svg)"
141
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
142
+ end
143
+
144
+ def test_replace_one_gemnasium_https
145
+ ct1 = "![](https://gemnasium.com/sferik/t.png)"
146
+ ct2 = "![](https://img.shields.io/gemnasium/sferik/t.svg)"
147
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
148
+ end
149
+
150
+ ## code_climate
151
+
152
+ def test_replace_one_code_climate
153
+ ct1 = "![](https://codeclimate.com/github/rails/rails.png)"
154
+ ct2 = "![](https://img.shields.io/codeclimate/github/rails/rails.svg)"
155
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
156
+ end
157
+
158
+ ## *_version
159
+
160
+ ### gem
161
+
162
+ def test_replace_one_gem_version
163
+ ct1 = "![](https://badge.fury.io/rb/t.png)"
164
+ ct2 = "![](https://img.shields.io/gem/v/t.svg)"
165
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
166
+ end
167
+
168
+ def test_replace_one_gem_version_retina
169
+ ct1 = "![](https://badge.fury.io/rb/t@2x.png)"
170
+ ct2 = "![](https://img.shields.io/gem/v/t.svg)"
171
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
172
+ end
173
+
174
+ ### pypi
175
+
176
+ def test_replace_one_pypi_version
177
+ ct1 = '![](https://badge.fury.io/py/gnuplot-py.png)'
178
+ ct2 = '![](https://img.shields.io/pypi/v/gnuplot-py.svg)'
179
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
180
+ end
181
+
182
+ def test_replace_one_pypi_version_retina
183
+ ct1 = '![](https://badge.fury.io/py/gnuplot-py@2x.png)'
184
+ ct2 = '![](https://img.shields.io/pypi/v/gnuplot-py.svg)'
185
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
186
+ end
187
+
188
+ ### npm
189
+
190
+ def test_replace_one_npm_version
191
+ ct1 = '![](https://badge.fury.io/js/tp.png)'
192
+ ct2 = '![](https://img.shields.io/npm/v/tp.svg)'
193
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
194
+ end
195
+
196
+ def test_replace_one_npm_version_retina
197
+ ct1 = '![](https://badge.fury.io/js/tp@2x.png)'
198
+ ct2 = '![](https://img.shields.io/npm/v/tp.svg)'
199
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
200
+ end
201
+
202
+ ### packagist
203
+
204
+ def test_replace_one_packagist_version
205
+ ct1 = '![](https://poser.pugx.org/foo/bar/version.png)'
206
+ ct2 = '![](https://img.shields.io/packagist/v/foo/bar.svg)'
207
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
208
+ end
209
+
210
+ ## *_downloads
211
+
212
+ ### pypi
213
+
214
+ def test_replace_one_pypi_downloads
215
+ ct1 = '![](https://pypip.in/d/cpe/badge.png)'
216
+ ct2 = '![](https://img.shields.io/pypi/dm/cpe.svg)'
217
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
218
+ end
219
+
220
+ ### packagist
221
+
222
+ def test_replace_one_packagist_downloads
223
+ ct1 = '![](https://poser.pugx.org/foo/bar/d/total.png)'
224
+ ct2 = '![](https://img.shields.io/packagist/dm/foo/bar.svg)'
225
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
226
+ end
227
+
228
+ ## misc
229
+
230
+ def test_replace_misc_png_http
231
+ ct1 = "![](http://img.shields.io/foo/bar-qux/zzz.png)"
232
+ ct2 = ct1.sub(/\.png/, '.svg').sub(/http:/, 'https:')
233
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
234
+ end
235
+
236
+ def test_replace_misc_png_https
237
+ ct1 = "![](https://img.shields.io/foo/bar-qux/zzz.png)"
238
+ ct2 = ct1.sub(/\.png/, '.svg').sub(/http:/, 'https:')
239
+ assert_equal(ct2, BadgesToSVG.replace(ct1))
240
+ end
241
+
242
+ end
243
+
244
+
245
+ exit Test::Unit::AutoRunner.run
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: badges2svg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Baptiste Fontaine
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: trollop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '0.8'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '0.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '10.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '10.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
83
+ description: Parse a markdown file and replace PNG badges with SVG ones.
84
+ email: b@ptistefontaine.fr
85
+ executables:
86
+ - badges2svg
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - bin/badges2svg
91
+ - lib/badges2svg.rb
92
+ - tests/tests.rb
93
+ homepage: https://github.com/bfontaine/badges2svg
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.2.1
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Replace GitHub PNG badges into SVG ones
117
+ test_files:
118
+ - tests/tests.rb