polymer 1.0.0.beta.3
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.
- data/Gemfile +8 -0
- data/History.md +126 -0
- data/LICENSE +28 -0
- data/README.md +229 -0
- data/Rakefile +186 -0
- data/bin/polymer +10 -0
- data/lib/polymer/cache.rb +106 -0
- data/lib/polymer/cli.rb +340 -0
- data/lib/polymer/core_ext.rb +78 -0
- data/lib/polymer/css_generator.rb +32 -0
- data/lib/polymer/deviant_finder.rb +76 -0
- data/lib/polymer/dsl.rb +283 -0
- data/lib/polymer/man/polymer-bond.1 +60 -0
- data/lib/polymer/man/polymer-bond.1.txt +66 -0
- data/lib/polymer/man/polymer-init.1 +33 -0
- data/lib/polymer/man/polymer-init.1.txt +42 -0
- data/lib/polymer/man/polymer-optimise.1 +23 -0
- data/lib/polymer/man/polymer-optimise.1.txt +25 -0
- data/lib/polymer/man/polymer-position.1 +39 -0
- data/lib/polymer/man/polymer-position.1.txt +42 -0
- data/lib/polymer/man/polymer.1 +50 -0
- data/lib/polymer/man/polymer.1.txt +60 -0
- data/lib/polymer/man/polymer.5 +130 -0
- data/lib/polymer/man/polymer.5.txt +145 -0
- data/lib/polymer/optimisation.rb +130 -0
- data/lib/polymer/project.rb +164 -0
- data/lib/polymer/sass_generator.rb +38 -0
- data/lib/polymer/source.rb +55 -0
- data/lib/polymer/sprite.rb +130 -0
- data/lib/polymer/templates/polymer.tt +28 -0
- data/lib/polymer/templates/sass_mixins.erb +29 -0
- data/lib/polymer/templates/sources/one/book.png +0 -0
- data/lib/polymer/templates/sources/one/box-label.png +0 -0
- data/lib/polymer/templates/sources/one/calculator.png +0 -0
- data/lib/polymer/templates/sources/one/calendar-month.png +0 -0
- data/lib/polymer/templates/sources/one/camera.png +0 -0
- data/lib/polymer/templates/sources/one/eraser.png +0 -0
- data/lib/polymer/templates/sources/two/inbox-image.png +0 -0
- data/lib/polymer/templates/sources/two/magnet.png +0 -0
- data/lib/polymer/templates/sources/two/newspaper.png +0 -0
- data/lib/polymer/templates/sources/two/television.png +0 -0
- data/lib/polymer/templates/sources/two/wand-hat.png +0 -0
- data/lib/polymer/templates/sources/two/wooden-box-label.png +0 -0
- data/lib/polymer/version.rb +4 -0
- data/lib/polymer.rb +49 -0
- data/polymer.gemspec +94 -0
- metadata +206 -0
data/Gemfile
ADDED
data/History.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
v1.0.0 / HEAD (Unreleased)
|
2
|
+
--------------------------
|
3
|
+
|
4
|
+
* Montage has been renamed to Polymer and is now released under the BSD
|
5
|
+
three-clause license.
|
6
|
+
|
7
|
+
* The Polymer configuration must now be located at the project root and
|
8
|
+
should be named either ".polymer" or, for Windows users, "polymer.yml".
|
9
|
+
You should rename your existing ".montage" file to ".polymer", and
|
10
|
+
".montage\_cache" should be changed to ".polymer-cache".
|
11
|
+
|
12
|
+
* The Polymer configuration file no longer uses YAML, but instead opts
|
13
|
+
for a simple Ruby-based DSL. See `polymer help .polymer` for full
|
14
|
+
documentation.
|
15
|
+
|
16
|
+
* The Sass mixin has changed slightly; instead of generating separate
|
17
|
+
mixins for each of your sprites, all of your sprites are available
|
18
|
+
using the global "polymer()" mixin. This should be called as such:
|
19
|
+
|
20
|
+
.my_selector
|
21
|
+
+polymer("sprite_name/source_name")
|
22
|
+
|
23
|
+
Mixins still permit you to supply an optional x-offset and y-offset as
|
24
|
+
the second and third parameters. the "polymer-pos()" mixin is also
|
25
|
+
available as an alternative to the old "sprite-name-pos()" mixins.
|
26
|
+
|
27
|
+
* A new "position" command shows information about a source within a
|
28
|
+
sprite, and provides useful CSS for use when building your own
|
29
|
+
styleesheets.
|
30
|
+
|
31
|
+
* Documentation of each command is now available by running `polymer
|
32
|
+
help` or `polymer help [COMMAND]`.
|
33
|
+
|
34
|
+
* The Polymer configuration no longer allows a "config.root" option and
|
35
|
+
the library will not work correctly if this is present in your config
|
36
|
+
file. Please move your ".polymer" file to your project root and remove
|
37
|
+
this option.
|
38
|
+
|
39
|
+
* The library internals have been substantially changed with Thor now
|
40
|
+
being used to handle all CLI commands.
|
41
|
+
|
42
|
+
* When creating a new Polymer project, you may suppress the copying of
|
43
|
+
example sources by passing the --no-examples option.
|
44
|
+
|
45
|
+
* The polymer init command no longer uses Highline to prompt for your
|
46
|
+
preferred paths to your source and output files. If you need to change
|
47
|
+
the defaults you may instead use the --source and --sprites options.
|
48
|
+
|
49
|
+
* All CLI commands are now tested with Cucumber.
|
50
|
+
|
51
|
+
* Jeweler has been replaced with plain rake tasks inspired by Rakegem --
|
52
|
+
[http://github.com/mojombo/rakegem](http://github.com/mojombo/rakegem).
|
53
|
+
|
54
|
+
v0.4.0 (18th August, 2010)
|
55
|
+
--------------------------
|
56
|
+
|
57
|
+
* You no longer need to specify a :name option in your sprite defintions
|
58
|
+
when supplying a full output filename.
|
59
|
+
|
60
|
+
v0.3.0 (12th April, 2010)
|
61
|
+
-------------------------
|
62
|
+
|
63
|
+
* The "montage.yml" file has been replaced with ".montage" which should
|
64
|
+
be located in your project root. In addition, the file is now rather
|
65
|
+
different, and in most cases will never need to be edited when you
|
66
|
+
want to add new sources to the sprite.
|
67
|
+
|
68
|
+
* By default Montage will now save sprites to public/images, expected
|
69
|
+
source images to be in public/images/subdir -- where "subdir" will
|
70
|
+
become the name of the sprite. All sources in a subdirectory will be
|
71
|
+
added to the same sprite.
|
72
|
+
|
73
|
+
This behavior is entirely customisable in the .montage file.
|
74
|
+
|
75
|
+
* The ".montage\_cache" file which was previously saved in the same
|
76
|
+
directory as sprites is now saved in the project root.
|
77
|
+
|
78
|
+
* The `montage` command now allows you to specify a path to a Montage
|
79
|
+
configuration file; for example `montage path/to/montage.yml`. When
|
80
|
+
using a non-standard directory structure, you can specify a
|
81
|
+
"config.root" option in the configuration file, containing the path to
|
82
|
+
the project root.
|
83
|
+
|
84
|
+
v0.2.0 (8th April, 2010)
|
85
|
+
------------------------
|
86
|
+
|
87
|
+
* Running `montage` will now generate `_montage.sass` in the specified
|
88
|
+
config.sass directory. A separate mixin will be generated for each
|
89
|
+
sprite, with the mixin accepting three arguments: the name of the
|
90
|
+
source image, an optional horizontal offset, and an optional vertical
|
91
|
+
offset. Disable the Sass generation by setting config.sass to false.
|
92
|
+
|
93
|
+
* If pngout or pngout-darwin is available (run `which pngout
|
94
|
+
pngout-darwin` to find out), Montage will compress the generated
|
95
|
+
sprites. Installing pngout is strongly recommended; significant
|
96
|
+
savings can be made on larger PNGs.
|
97
|
+
|
98
|
+
* The `montage` command accepts a '--force' option which will regenerate
|
99
|
+
all sprites even if they haven't been changed since the last run.
|
100
|
+
|
101
|
+
* Sprites will be regenerated if the file has been deleted.
|
102
|
+
|
103
|
+
v0.1.2 (6th April, 2010)
|
104
|
+
------------------------
|
105
|
+
|
106
|
+
* Sprites will only be regenerated when their definition (in
|
107
|
+
montage.yml) has changed, or if the contents of the source files have
|
108
|
+
changed.
|
109
|
+
|
110
|
+
* The `montage init` command now uses the highline gem to ask for the
|
111
|
+
paths to a project's source files, and the intended sprite output
|
112
|
+
directory.
|
113
|
+
|
114
|
+
* Running `montage init` will copy some sample source files into the
|
115
|
+
source directory. This allows running `montage` immediately after
|
116
|
+
creating the project, to see how things work.
|
117
|
+
|
118
|
+
v0.1.1 (5th April, 2010)
|
119
|
+
------------------------
|
120
|
+
|
121
|
+
* Small fix for Ruby 1.9.1, which doesn't define String#inject.
|
122
|
+
|
123
|
+
v0.1.0 (5th April, 2010)
|
124
|
+
------------------------
|
125
|
+
|
126
|
+
* Initial release. Supports creation of sprites and not much else.
|
data/LICENSE
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Copyright (c) 2009-2010, Anthony Williams
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright
|
11
|
+
notice, this list of conditions and the following disclaimer in the
|
12
|
+
documentation and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the Anthony Williams nor the names of its
|
15
|
+
contributors may be used to endorse or promote products derived from
|
16
|
+
this software without specific prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL ANTHONY WILLIAMS BE LIABLE FOR ANY DIRECT,
|
22
|
+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
23
|
+
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
24
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
25
|
+
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
26
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
27
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
|
data/README.md
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
POLYMER
|
2
|
+
=======
|
3
|
+
|
4
|
+
DESCRIPTION
|
5
|
+
-----------
|
6
|
+
|
7
|
+
Polymer is a tool for creating sprite images which combine many smaller
|
8
|
+
sources into a single larger image. Spriting allows you to reduce the
|
9
|
+
number of HTTP requests required to load a web page, and as such can
|
10
|
+
result in reduced load times.
|
11
|
+
|
12
|
+
Polymer also creates the necessary CSS to position the sprite within an
|
13
|
+
HTML element so that only the desired source appears. Those writing
|
14
|
+
their website or application in Ruby can make use of Polymer's Sass
|
15
|
+
builder which creates a Sass mixin, further simplifying the use of your
|
16
|
+
sprites.
|
17
|
+
|
18
|
+
In order to reduce the amount of data transferred to clients loading
|
19
|
+
your pages, Polymer optimises the sprites it generates using PNGOUT,
|
20
|
+
OptiPNG, and PNGCrush.
|
21
|
+
|
22
|
+
INSTALLATION
|
23
|
+
------------
|
24
|
+
|
25
|
+
The recommended way to install Polymer is with Rubygems:
|
26
|
+
|
27
|
+
$ [sudo] gem install polymer
|
28
|
+
|
29
|
+
Polymer currently uses RMagick/ImageMagick in order to read and write
|
30
|
+
images. Eventually, I want to offer support for ChunkyPNG also, which
|
31
|
+
should substantially ease installation.
|
32
|
+
|
33
|
+
Most Linux and BSD distributions include ImageMagick in their packaging
|
34
|
+
system; while Mac OS X users can install it with [Homebrew][homebrew]:
|
35
|
+
|
36
|
+
$ brew install ghostscript
|
37
|
+
$ brew install imagemagick
|
38
|
+
|
39
|
+
If you wish to install Polymer from source:
|
40
|
+
|
41
|
+
$ git clone http://github.com/antw/polymer.git && cd polymer
|
42
|
+
$ gem build polymer.gemspec
|
43
|
+
$ [sudo] gem install --local polymer-VERSION.gem
|
44
|
+
|
45
|
+
(Where "VERSION" is the current version of Polymer). If you do not have
|
46
|
+
Git installed, the latest versions can be [downloaded instead][download].
|
47
|
+
|
48
|
+
GETTING STARTED
|
49
|
+
---------------
|
50
|
+
|
51
|
+
In order for Polymer to create sprites from your source images, it must
|
52
|
+
first create a "project" -- this is a `.polymer` file which is placed
|
53
|
+
into your project's root directory. This file comes with some sensible
|
54
|
+
defaults which should suffice for most cases. This file is generated by
|
55
|
+
running `polymer init`.
|
56
|
+
|
57
|
+
1. Run `polymer init` to create a ".polymer" file in the current
|
58
|
+
directory. Prior to running the command, you may want to glance at
|
59
|
+
the [polymer-init(1)][polymer-init] manpage to get an overview of the
|
60
|
+
supported options. `polymer init` also places some example source
|
61
|
+
images into your project.
|
62
|
+
|
63
|
+
2. Run `polymer bond`: this is the main task which converts the source
|
64
|
+
images into the final sprites. If you have PNGOUT, OptiPNG, or
|
65
|
+
PNGCrush installed, Polymer will also optimise the generates sprites
|
66
|
+
to reduce them to the smallest possible filesize.
|
67
|
+
|
68
|
+
3. Run `polymer bond` again. Nothing happens! Polymer maintains a cache
|
69
|
+
of your sprite images so that it only generates them again if any of
|
70
|
+
the sources have changed; pretty handy since optimising large sprites
|
71
|
+
can take some time. See [polymer(5)][polymer-5] to learn how to
|
72
|
+
disable this.
|
73
|
+
|
74
|
+
USING YOUR SPRITES
|
75
|
+
------------------
|
76
|
+
|
77
|
+
### Updating Sprites
|
78
|
+
|
79
|
+
Having created some example sprites in "Getting Started", you can now
|
80
|
+
add completely new sprites by adding new directories alongside "one" and
|
81
|
+
"two", alter existing sprites by adding, changing, or removing source
|
82
|
+
images, then once again running `polymer bond`.
|
83
|
+
|
84
|
+
If this isn't sufficiently flexible, see [polymer(5)][polymer-5] to
|
85
|
+
learn how to define your own sprites in the ".polymer" file.
|
86
|
+
|
87
|
+
### Sass / SCSS Stylesheets
|
88
|
+
|
89
|
+
Out-of-the-box, Polymer generates a Sass stylesheet containing a mixin.
|
90
|
+
This stylesheet is created at the path given to "config.sass" in
|
91
|
+
".polymer".
|
92
|
+
|
93
|
+
This mixin can be used thusly: (in this case, "main" is the name of the
|
94
|
+
sprite, "home" and "products" are the names of source images
|
95
|
+
sans-extension).
|
96
|
+
|
97
|
+
Assuming directory structure:
|
98
|
+
|
99
|
+
public/images/sprites/
|
100
|
+
messages/
|
101
|
+
new.png
|
102
|
+
reply.png
|
103
|
+
|
104
|
+
Your Sass stylesheet like:
|
105
|
+
|
106
|
+
@import polymer.sass
|
107
|
+
|
108
|
+
.buttons
|
109
|
+
a#compose, a#reply
|
110
|
+
+polymer("messages/new")
|
111
|
+
a#reply
|
112
|
+
+polymer-pos("messages/reply")
|
113
|
+
|
114
|
+
Which creates:
|
115
|
+
|
116
|
+
.buttons a#compose, .buttons a#reply {
|
117
|
+
background: url(/path/to/sprite.ext) 0 0 no-repeat; }
|
118
|
+
|
119
|
+
.buttons a#products {
|
120
|
+
background-position: 0 -40px; }
|
121
|
+
|
122
|
+
With the latest versions of the Haml library, you may use SCSS instead:
|
123
|
+
|
124
|
+
@import("polymer.sass")
|
125
|
+
|
126
|
+
.buttons {
|
127
|
+
a#compose, a#reply {
|
128
|
+
@include polymer("messages/new") }
|
129
|
+
a#reply {
|
130
|
+
@include polymer-pos("messages/reply") } }
|
131
|
+
|
132
|
+
You can disable creation of the Sass mixin file by setting `config.sass
|
133
|
+
false` in the ".polymer" file.
|
134
|
+
|
135
|
+
### CSS Stylesheets
|
136
|
+
|
137
|
+
... are not yet implemented. Hold tight; these should be around before
|
138
|
+
Polymer hits v1.0.
|
139
|
+
|
140
|
+
PNG OPTIMISATION
|
141
|
+
----------------
|
142
|
+
|
143
|
+
... needs to be written up.
|
144
|
+
|
145
|
+
CONTRIBUTING
|
146
|
+
------------
|
147
|
+
|
148
|
+
A Bundler Gemfile is provided to simplify installing Polymer's
|
149
|
+
dependencies. Running `bundle install` will install everything needed to
|
150
|
+
contribute. Bundler is not used in the Polymer library itself.
|
151
|
+
|
152
|
+
* Fork the project, taking care not to get any in your eyes.
|
153
|
+
|
154
|
+
* Make your feature addition or bug fix.
|
155
|
+
|
156
|
+
* Add tests for it. This is especially important not only because it
|
157
|
+
helps ensure that I don't unintentionally break it in a future
|
158
|
+
version, but also since it appeases Epidity, God of Potatoes, who has
|
159
|
+
been known to shower rancid cucumbers upon those who fail to test.
|
160
|
+
|
161
|
+
* Commit, but please do not mess with the Rakefile or history. If you
|
162
|
+
want to have your own version, _that is fine_, but bump the version in
|
163
|
+
a commit by itself so that I can ignore it when I pull.
|
164
|
+
|
165
|
+
* Send me a pull request. Bonus points for topic branches (although
|
166
|
+
"everything is made up, and the points don't matter...").
|
167
|
+
|
168
|
+
Polymer specs are run against:
|
169
|
+
|
170
|
+
* Ruby (MRI) 1.8.7 p302,
|
171
|
+
* Ruby (YARV) 1.9.1 p378,
|
172
|
+
* Ruby (YARV) 1.9.2 p0.
|
173
|
+
|
174
|
+
GETTING HELP
|
175
|
+
------------
|
176
|
+
|
177
|
+
Polymer comes complete with some manpages which document the various
|
178
|
+
commands:
|
179
|
+
|
180
|
+
* **[polymer(1)][polymer-1]** -- `polymer help`
|
181
|
+
* **[polymer(5)][polymer-5]** -- `polymer help .polymer`
|
182
|
+
* **[polymer-init(1)][polymer-init]** -- `polymer help init`
|
183
|
+
* **[polymer-bond(1)][polymer-bond]** -- `polymer help bond`
|
184
|
+
* **[polymer-optimise(1)][polymer-optimise]** -- `polymer help optimise`
|
185
|
+
* **[polymer-position(1)][polymer-position]** -- `polymer help position`
|
186
|
+
|
187
|
+
If you've encountered a bug, or Polymer isn't behaving as you expect,
|
188
|
+
please [file an issue report][issues].
|
189
|
+
|
190
|
+
DETAILS
|
191
|
+
-------
|
192
|
+
|
193
|
+
**Source**
|
194
|
+
: [http://github.com/antw/polymer][polymer]
|
195
|
+
|
196
|
+
**Author**
|
197
|
+
: Anthony Williams
|
198
|
+
|
199
|
+
**Copyright**
|
200
|
+
: 2009-2010
|
201
|
+
|
202
|
+
**License**
|
203
|
+
: BSD License
|
204
|
+
|
205
|
+
Polymer © 2009-2010 by [Anthony Williams](mailto:hi@antw.me).
|
206
|
+
Polymer is free software, released under the BSD license. Please see the
|
207
|
+
LICENSE file for more information.
|
208
|
+
|
209
|
+
The sample sources in lib/polymer/templates/sources are courtesy of
|
210
|
+
[Yusuke Kamiyamane][yusuke], whose extraordinary generosity in releasing
|
211
|
+
three-thousand royalty-free icons cannot be stated enough.
|
212
|
+
|
213
|
+
[montage]: http://github.com/antw/montage
|
214
|
+
[polymer]: http://github.com/antw/polymer
|
215
|
+
[homebrew]: http://mxcl.github.com/homebrew/
|
216
|
+
[pngout]: http://advsys.net/ken/utils.htm
|
217
|
+
[download]: http://github.com/antw/polymer/downloads
|
218
|
+
[kin]: http://github.com/antw/kin
|
219
|
+
[semver]: http://semver.org/
|
220
|
+
[yard]: http://yardoc.org/
|
221
|
+
[issues]: http://github.com/antw/polymer/issues
|
222
|
+
[yusuke]: http://p.yusukekamiyamane.com
|
223
|
+
|
224
|
+
[polymer-1]: http://antw.github.com/polymer/polymer.1.html
|
225
|
+
[polymer-5]: http://antw.github.com/polymer/polymer.5.html
|
226
|
+
[polymer-init]: http://antw.github.com/polymer/polymer-init.1.html
|
227
|
+
[polymer-bond]: http://antw.github.com/polymer/polymer-bond.1.html
|
228
|
+
[polymer-optimise]: http://antw.github.com/polymer/polymer-optimise.1.html
|
229
|
+
[polymer-position]: http://antw.github.com/polymer/polymer-position.1.html
|
data/Rakefile
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
5
|
+
require 'polymer/version'
|
6
|
+
|
7
|
+
CLOBBER.include %w( pkg *.gem documentation coverage
|
8
|
+
measurements lib/polymer/man )
|
9
|
+
|
10
|
+
# === Helpers ================================================================
|
11
|
+
|
12
|
+
require 'date'
|
13
|
+
|
14
|
+
def replace_header(head, header_name, value)
|
15
|
+
head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{value}'" }
|
16
|
+
end
|
17
|
+
|
18
|
+
# === Tasks ==================================================================
|
19
|
+
|
20
|
+
# --- Build ------------------------------------------------------------------
|
21
|
+
|
22
|
+
desc 'Build the gem, and push to Github'
|
23
|
+
task :release => :build do
|
24
|
+
unless system('git branch') =~ /^\* master$/
|
25
|
+
puts "You must be on the master branch to release!"
|
26
|
+
exit!
|
27
|
+
end
|
28
|
+
|
29
|
+
sh "git commit --allow-empty -a -m 'Release #{Polymer::VERSION}'"
|
30
|
+
sh "git tag v#{Polymer::VERSION}"
|
31
|
+
sh "git push origin master"
|
32
|
+
sh "git push origin v#{Polymer::VERSION}"
|
33
|
+
|
34
|
+
puts "Push to Rubygems.org with"
|
35
|
+
puts " gem push pkg/polymer-#{Polymer::VERSION}.gem"
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Builds the gem'
|
39
|
+
task :build => [:man, :gemspec] do
|
40
|
+
sh "mkdir -p pkg"
|
41
|
+
sh "gem build polymer.gemspec"
|
42
|
+
sh "mv polymer-#{Polymer::VERSION}.gem pkg"
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Create a fresh gemspec'
|
46
|
+
task :gemspec => :validate do
|
47
|
+
gemspec_file = File.expand_path('../polymer.gemspec', __FILE__)
|
48
|
+
|
49
|
+
# Read spec file and split out the manifest section.
|
50
|
+
spec = File.read(gemspec_file)
|
51
|
+
head, manifest, tail = spec.split(" # = MANIFEST =\n")
|
52
|
+
|
53
|
+
# Replace name version and date.
|
54
|
+
replace_header head, :name, 'polymer'
|
55
|
+
replace_header head, :rubyforge_project, 'polymer'
|
56
|
+
replace_header head, :version, Polymer::VERSION
|
57
|
+
replace_header head, :date, Date.today.to_s
|
58
|
+
|
59
|
+
# Determine file list from git ls-files.
|
60
|
+
files = `git ls-files`.
|
61
|
+
split("\n").
|
62
|
+
sort.
|
63
|
+
reject { |file| file =~ /^\./ }.
|
64
|
+
reject { |file| file =~ /^(rdoc|pkg|spec|tasks|features|man)/ }
|
65
|
+
|
66
|
+
# Add man pages.
|
67
|
+
files += Dir['lib/polymer/man/*']
|
68
|
+
|
69
|
+
# Format list for the gemspec.
|
70
|
+
files = files.map { |file| " #{file}" }.join("\n")
|
71
|
+
|
72
|
+
# Piece file back together and write.
|
73
|
+
manifest = " s.files = %w[\n#{files}\n ]\n"
|
74
|
+
spec = [head, manifest, tail].join(" # = MANIFEST =\n")
|
75
|
+
File.open(gemspec_file, 'w') { |io| io.write(spec) }
|
76
|
+
|
77
|
+
puts "Updated #{gemspec_file}"
|
78
|
+
end
|
79
|
+
|
80
|
+
task :validate do
|
81
|
+
unless Dir['lib/*'] - %w(lib/polymer.rb lib/polymer)
|
82
|
+
puts 'The lib/ directory should only contain a polymer.rb file, and a ' \
|
83
|
+
'polymer/ directory'
|
84
|
+
exit!
|
85
|
+
end
|
86
|
+
|
87
|
+
unless Dir['VERSION*'].empty?
|
88
|
+
puts 'A VERSION file at root level violates Gem best practices'
|
89
|
+
exit!
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# --- Tests ------------------------------------------------------------------
|
94
|
+
|
95
|
+
require 'rspec/core/rake_task'
|
96
|
+
require 'cucumber/rake/task'
|
97
|
+
|
98
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
99
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
100
|
+
end
|
101
|
+
|
102
|
+
Cucumber::Rake::Task.new(:features) do |features|
|
103
|
+
features.cucumber_opts = '--format progress --tag ~@pending'
|
104
|
+
end
|
105
|
+
|
106
|
+
desc 'Run RSpec examples followed by the Cucumber features'
|
107
|
+
task :test => [:spec, :features]
|
108
|
+
task :default => :test
|
109
|
+
|
110
|
+
# --- Man Pages --------------------------------------------------------------
|
111
|
+
|
112
|
+
desc 'Builds the Polymer manual pages'
|
113
|
+
task :man do
|
114
|
+
require 'pathname'
|
115
|
+
|
116
|
+
source_dir = Pathname.new('man')
|
117
|
+
dest_dir = Pathname.new('lib/polymer/man')
|
118
|
+
|
119
|
+
dest_dir.rmtree if dest_dir.directory?
|
120
|
+
dest_dir.mkpath
|
121
|
+
|
122
|
+
Pathname.glob(source_dir + '*.ronn').each do |source|
|
123
|
+
destination = dest_dir + source.basename('.ronn')
|
124
|
+
|
125
|
+
# Create the man page.
|
126
|
+
sh "ronn --roff --manual='Polymer Manual' " \
|
127
|
+
"--organization='POLYMER #{Polymer::VERSION.upcase}' " \
|
128
|
+
"--pipe #{source} > #{destination}"
|
129
|
+
|
130
|
+
# Set man pages to be left-aligned (not justified).
|
131
|
+
sh "sed -i '' -e '3i\\\n.ad l\n' #{destination}"
|
132
|
+
|
133
|
+
# Create a text-only version of the man page.
|
134
|
+
sh "groff -Wall -mtty-char -mandoc -Tascii " \
|
135
|
+
"#{destination} | col -b > #{destination}.txt"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
desc 'Builds HTML for Github Pages, then publishes'
|
140
|
+
task :pages do
|
141
|
+
# Cheers to rtomayko/ronn/Rakefile
|
142
|
+
sh "ronn -5 --manual='Polymer Manual' " \
|
143
|
+
"--organization='POLYMER #{Polymer::VERSION.upcase}' " \
|
144
|
+
"-s toc -w man/*.ronn"
|
145
|
+
|
146
|
+
puts '-' * 50
|
147
|
+
puts 'Rebuilding pages ...'
|
148
|
+
|
149
|
+
verbose(false) do
|
150
|
+
rm_rf 'pages'
|
151
|
+
push_url = `git remote show origin`.lines.grep(/Push.*URL/).first[/git@.*/]
|
152
|
+
sh 'git fetch -q origin'
|
153
|
+
sh 'rev=$(git rev-parse origin/gh-pages)'
|
154
|
+
sh 'git clone -q -b gh-pages . pages'
|
155
|
+
cd 'pages'
|
156
|
+
sh 'git reset --hard $rev'
|
157
|
+
sh 'rm -f polymer*.html index.html'
|
158
|
+
sh 'cp -rp ../man/polymer*.html ../man/index.html ./'
|
159
|
+
sh 'git add *.html'
|
160
|
+
sh 'git commit -m "Rebuild manual."'
|
161
|
+
sh "git push #{push_url} gh-pages"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# --- YARD -------------------------------------------------------------------
|
166
|
+
|
167
|
+
begin
|
168
|
+
require 'yard'
|
169
|
+
YARD::Rake::YardocTask.new do |doc|
|
170
|
+
doc.options << '--no-highlight'
|
171
|
+
end
|
172
|
+
rescue LoadError
|
173
|
+
desc 'yard task requires that the yard gem is installed'
|
174
|
+
task :yard do
|
175
|
+
abort 'YARD is not available. In order to run yard, you must: gem ' \
|
176
|
+
'install yard'
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# --- Console ----------------------------------------------------------------
|
181
|
+
|
182
|
+
desc 'Open an irb session preloaded with Polymer'
|
183
|
+
task :console do
|
184
|
+
sh 'irb -I ./lib -rubygems -r ./lib/polymer.rb'
|
185
|
+
end
|
186
|
+
|
data/bin/polymer
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module Polymer
|
2
|
+
# Represents a cache file. Keeps track of the contents of each sprite and
|
3
|
+
# provides an easy means of determining if the sprite has been changed since
|
4
|
+
# the cache was last generated.
|
5
|
+
class Cache
|
6
|
+
|
7
|
+
# Returns the path to the cache file.
|
8
|
+
#
|
9
|
+
# @return [Pathname]
|
10
|
+
#
|
11
|
+
attr_reader :path
|
12
|
+
|
13
|
+
# Creates a new Cache.
|
14
|
+
#
|
15
|
+
# If the given +path+ does not exist, an empty cache instance will be
|
16
|
+
# created, and calling +write+ will create a new file at +path+.
|
17
|
+
#
|
18
|
+
# @param [Pathname] path
|
19
|
+
# Path to the cache file to be loaded. If no +path+ is given, the cache
|
20
|
+
# will operate in-memory only and +write+ is disabled.
|
21
|
+
#
|
22
|
+
def initialize(path = nil)
|
23
|
+
@path = path
|
24
|
+
|
25
|
+
if @path and @path.file?
|
26
|
+
@cache = YAML.load_file @path
|
27
|
+
else
|
28
|
+
@cache = { :cache_version => 2, :sprites => {} }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Checks whether the given +sprite+ is different to the cached version.
|
33
|
+
#
|
34
|
+
# @param [Polymer::Sprite] sprite
|
35
|
+
# The sprite whose "freshness" is to be checked.
|
36
|
+
#
|
37
|
+
# @return [Boolean]
|
38
|
+
#
|
39
|
+
def stale?(sprite)
|
40
|
+
not fresh?(sprite)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Checks whether the given +sprite+ is identical to the cached version.
|
44
|
+
#
|
45
|
+
# @param [Polymer::Sprite] sprite
|
46
|
+
# The sprite whose "freshness" is to be checked.
|
47
|
+
#
|
48
|
+
# @return [Boolean]
|
49
|
+
#
|
50
|
+
def fresh?(sprite)
|
51
|
+
sprite.save_path.file? and
|
52
|
+
@cache[:sprites].has_key?(sprite.name) and
|
53
|
+
@cache[:sprites][sprite.name] == sprite.digest
|
54
|
+
end
|
55
|
+
|
56
|
+
# Updates the cached value of +sprite+.
|
57
|
+
#
|
58
|
+
# @param [Polymer::Sprite] sprite
|
59
|
+
# The sprite whose digest is to be stored in the cache.
|
60
|
+
#
|
61
|
+
def set(sprite)
|
62
|
+
@cache[:sprites][sprite.name] = sprite.digest
|
63
|
+
end
|
64
|
+
|
65
|
+
# Removes a +sprite+'s cached values.
|
66
|
+
#
|
67
|
+
# @param [Polymer::Sprite] sprite
|
68
|
+
# The sprite whose digest is to be removed from the cache.
|
69
|
+
#
|
70
|
+
def remove(sprite)
|
71
|
+
@cache[:sprites].delete(sprite.name)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Removes all sprite cache entries, except those in +retain+.
|
75
|
+
#
|
76
|
+
# @param [Array<Polymer::Cache>] retain
|
77
|
+
# An array of cache entries which are _not_ to be removed.
|
78
|
+
#
|
79
|
+
def remove_all_except(retain)
|
80
|
+
names = retain.map { |sprite| sprite.name }
|
81
|
+
|
82
|
+
@cache[:sprites].delete_if do |key, _|
|
83
|
+
not names.include?(key)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Writes the cache file to disk.
|
88
|
+
#
|
89
|
+
# @return [true]
|
90
|
+
# Returnss true once the file has been written.
|
91
|
+
# @return [false]
|
92
|
+
# Returns false if the Cache was initialized without a path (and, as
|
93
|
+
# such, nothing can be saved).
|
94
|
+
#
|
95
|
+
def write
|
96
|
+
return false unless @path
|
97
|
+
|
98
|
+
@path.open('w') do |file|
|
99
|
+
file.puts YAML.dump(@cache)
|
100
|
+
end
|
101
|
+
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
105
|
+
end # Cache
|
106
|
+
end # Polymer
|