sprites 0.0.1.pre

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.
Files changed (329) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +12 -0
  4. data/Rakefile +41 -0
  5. data/bin/sprites +18 -0
  6. data/features/cli.feature +11 -0
  7. data/features/step_definitions/common_steps.rb +36 -0
  8. data/features/support/env.rb +5 -0
  9. data/lib/sprites/application.rb +44 -0
  10. data/lib/sprites/cli/cli_application.rb +11 -0
  11. data/lib/sprites/cli/command_line_option_parser.rb +70 -0
  12. data/lib/sprites/cli.rb +4 -0
  13. data/lib/sprites/configuration.rb +59 -0
  14. data/lib/sprites/core_ext/pathname.rb +7 -0
  15. data/lib/sprites/notifier.rb +9 -0
  16. data/lib/sprites/sprite.rb +127 -0
  17. data/lib/sprites/sprite_generators/chunky_png_generator.rb +114 -0
  18. data/lib/sprites/sprite_piece.rb +36 -0
  19. data/lib/sprites/sprite_pieces.rb +47 -0
  20. data/lib/sprites/sprites.rb +61 -0
  21. data/lib/sprites/stylesheet.rb +22 -0
  22. data/lib/sprites/test/sprite_generator_tester.rb +78 -0
  23. data/lib/sprites/version.rb +3 -0
  24. data/lib/sprites.rb +24 -0
  25. data/spec/fixtures/known_good/sprite_images/buttons/.DS_Store +0 -0
  26. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-28.png +0 -0
  27. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-cap-28.png +0 -0
  28. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default-cap-long.png +0 -0
  29. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-default.png +0 -0
  30. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-28.png +0 -0
  31. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-cap-28.png +0 -0
  32. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick-cap-long.png +0 -0
  33. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-onclick.png +0 -0
  34. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-28.png +0 -0
  35. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-cap-28.png +0 -0
  36. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover-cap-long.png +0 -0
  37. data/spec/fixtures/known_good/sprite_images/buttons/btn-black-rollover.png +0 -0
  38. data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-default.png +0 -0
  39. data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-onclick.png +0 -0
  40. data/spec/fixtures/known_good/sprite_images/buttons/btn-blackarrow-rollover.png +0 -0
  41. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-cap.png +0 -0
  42. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-drop.png +0 -0
  43. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default-edge.png +0 -0
  44. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-default.png +0 -0
  45. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-cap.png +0 -0
  46. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-drop.png +0 -0
  47. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick-edge.png +0 -0
  48. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-onclick.png +0 -0
  49. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-cap.png +0 -0
  50. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-drop.png +0 -0
  51. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover-edge.png +0 -0
  52. data/spec/fixtures/known_good/sprite_images/buttons/btn-blue-rollover.png +0 -0
  53. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-cap.png +0 -0
  54. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-drop.png +0 -0
  55. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default-edge.png +0 -0
  56. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-default.png +0 -0
  57. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-cap.png +0 -0
  58. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-drop.png +0 -0
  59. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick-edge.png +0 -0
  60. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-onclick.png +0 -0
  61. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-cap.png +0 -0
  62. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-drop.png +0 -0
  63. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover-edge.png +0 -0
  64. data/spec/fixtures/known_good/sprite_images/buttons/btn-green-rollover.png +0 -0
  65. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-cap.png +0 -0
  66. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-drop.png +0 -0
  67. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default-edge.png +0 -0
  68. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-default.png +0 -0
  69. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-cap.png +0 -0
  70. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-drop.png +0 -0
  71. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick-edge.png +0 -0
  72. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-onclick.png +0 -0
  73. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-cap.png +0 -0
  74. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-drop.png +0 -0
  75. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover-edge.png +0 -0
  76. data/spec/fixtures/known_good/sprite_images/buttons/btn-red-rollover.png +0 -0
  77. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-cap.png +0 -0
  78. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-drop.png +0 -0
  79. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default-edge.png +0 -0
  80. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-default.png +0 -0
  81. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-cap.png +0 -0
  82. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-drop.png +0 -0
  83. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick-edge.png +0 -0
  84. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-onclick.png +0 -0
  85. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-cap.png +0 -0
  86. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-drop.png +0 -0
  87. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover-edge.png +0 -0
  88. data/spec/fixtures/known_good/sprite_images/buttons/btn-trans-rollover.png +0 -0
  89. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-cap.png +0 -0
  90. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-drop.png +0 -0
  91. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default-edge.png +0 -0
  92. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-default.png +0 -0
  93. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-cap.png +0 -0
  94. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-drop.png +0 -0
  95. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick-edge.png +0 -0
  96. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-onclick.png +0 -0
  97. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-cap.png +0 -0
  98. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-drop.png +0 -0
  99. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover-edge.png +0 -0
  100. data/spec/fixtures/known_good/sprite_images/buttons/btn-white-rollover.png +0 -0
  101. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-cap.png +0 -0
  102. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-drop.png +0 -0
  103. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default-edge.png +0 -0
  104. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-default.png +0 -0
  105. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-cap.png +0 -0
  106. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-drop.png +0 -0
  107. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick-edge.png +0 -0
  108. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-onclick.png +0 -0
  109. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-cap.png +0 -0
  110. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-drop.png +0 -0
  111. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover-edge.png +0 -0
  112. data/spec/fixtures/known_good/sprite_images/buttons/btn-yellow-rollover.png +0 -0
  113. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-default-28.png +0 -0
  114. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-default-cap-28.png +0 -0
  115. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-onclick-28.png +0 -0
  116. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-onclick-cap-28.png +0 -0
  117. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-rollover-28.png +0 -0
  118. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-black-rollover-cap-28.png +0 -0
  119. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-default-cap.png +0 -0
  120. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-default.png +0 -0
  121. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-onclick-cap.png +0 -0
  122. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-onclick.png +0 -0
  123. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-rollover-cap.png +0 -0
  124. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-blue-rollover.png +0 -0
  125. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-cap.png +0 -0
  126. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-drop.png +0 -0
  127. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default-edge.png +0 -0
  128. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-default.png +0 -0
  129. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-cap.png +0 -0
  130. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-drop.png +0 -0
  131. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick-edge.png +0 -0
  132. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-onclick.png +0 -0
  133. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-cap.png +0 -0
  134. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-drop.png +0 -0
  135. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover-edge.png +0 -0
  136. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-green-rollover.png +0 -0
  137. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-default-cap.png +0 -0
  138. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-default.png +0 -0
  139. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-onclick-cap.png +0 -0
  140. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-onclick.png +0 -0
  141. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-rollover-cap.png +0 -0
  142. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-red-rollover.png +0 -0
  143. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-cap.png +0 -0
  144. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-drop.png +0 -0
  145. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default-edge.png +0 -0
  146. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-default.png +0 -0
  147. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-cap.png +0 -0
  148. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-drop.png +0 -0
  149. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick-edge.png +0 -0
  150. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-onclick.png +0 -0
  151. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-cap.png +0 -0
  152. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-drop.png +0 -0
  153. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover-edge.png +0 -0
  154. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-trans-rollover.png +0 -0
  155. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-default-cap.png +0 -0
  156. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-default.png +0 -0
  157. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-onclick-cap.png +0 -0
  158. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-onclick.png +0 -0
  159. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-rollover-cap.png +0 -0
  160. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-white-rollover.png +0 -0
  161. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-default-cap.png +0 -0
  162. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-default.png +0 -0
  163. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-onclick-cap.png +0 -0
  164. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-onclick.png +0 -0
  165. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-rollover-cap.png +0 -0
  166. data/spec/fixtures/known_good/sprite_images/buttons/dark_background/btn-yellow-rollover.png +0 -0
  167. data/spec/fixtures/known_good/sprites/buttons.png +0 -0
  168. data/spec/fixtures/known_good/stylesheets/buttons.css +1127 -0
  169. data/spec/fixtures/project1/config/sprites.rb +145 -0
  170. data/spec/fixtures/project1/public/images/sprite_images/buttons/.DS_Store +0 -0
  171. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-28.png +0 -0
  172. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-cap-28.png +0 -0
  173. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default-cap-long.png +0 -0
  174. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-default.png +0 -0
  175. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-28.png +0 -0
  176. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-cap-28.png +0 -0
  177. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick-cap-long.png +0 -0
  178. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-onclick.png +0 -0
  179. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-28.png +0 -0
  180. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-cap-28.png +0 -0
  181. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover-cap-long.png +0 -0
  182. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-black-rollover.png +0 -0
  183. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-default.png +0 -0
  184. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-onclick.png +0 -0
  185. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blackarrow-rollover.png +0 -0
  186. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-cap.png +0 -0
  187. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-drop.png +0 -0
  188. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default-edge.png +0 -0
  189. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-default.png +0 -0
  190. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-cap.png +0 -0
  191. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-drop.png +0 -0
  192. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick-edge.png +0 -0
  193. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-onclick.png +0 -0
  194. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-cap.png +0 -0
  195. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-drop.png +0 -0
  196. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover-edge.png +0 -0
  197. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-blue-rollover.png +0 -0
  198. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-cap.png +0 -0
  199. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-drop.png +0 -0
  200. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default-edge.png +0 -0
  201. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-default.png +0 -0
  202. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-cap.png +0 -0
  203. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-drop.png +0 -0
  204. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick-edge.png +0 -0
  205. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-onclick.png +0 -0
  206. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-cap.png +0 -0
  207. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-drop.png +0 -0
  208. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover-edge.png +0 -0
  209. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-green-rollover.png +0 -0
  210. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-cap.png +0 -0
  211. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-drop.png +0 -0
  212. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default-edge.png +0 -0
  213. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-default.png +0 -0
  214. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-cap.png +0 -0
  215. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-drop.png +0 -0
  216. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick-edge.png +0 -0
  217. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-onclick.png +0 -0
  218. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-cap.png +0 -0
  219. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-drop.png +0 -0
  220. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover-edge.png +0 -0
  221. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-red-rollover.png +0 -0
  222. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-cap.png +0 -0
  223. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-drop.png +0 -0
  224. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default-edge.png +0 -0
  225. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-default.png +0 -0
  226. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-cap.png +0 -0
  227. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-drop.png +0 -0
  228. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick-edge.png +0 -0
  229. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-onclick.png +0 -0
  230. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-cap.png +0 -0
  231. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-drop.png +0 -0
  232. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover-edge.png +0 -0
  233. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-trans-rollover.png +0 -0
  234. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-cap.png +0 -0
  235. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-drop.png +0 -0
  236. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default-edge.png +0 -0
  237. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-default.png +0 -0
  238. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-cap.png +0 -0
  239. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-drop.png +0 -0
  240. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick-edge.png +0 -0
  241. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-onclick.png +0 -0
  242. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-cap.png +0 -0
  243. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-drop.png +0 -0
  244. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover-edge.png +0 -0
  245. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-white-rollover.png +0 -0
  246. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-cap.png +0 -0
  247. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-drop.png +0 -0
  248. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default-edge.png +0 -0
  249. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-default.png +0 -0
  250. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-cap.png +0 -0
  251. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-drop.png +0 -0
  252. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick-edge.png +0 -0
  253. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-onclick.png +0 -0
  254. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-cap.png +0 -0
  255. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-drop.png +0 -0
  256. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover-edge.png +0 -0
  257. data/spec/fixtures/project1/public/images/sprite_images/buttons/btn-yellow-rollover.png +0 -0
  258. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-default-28.png +0 -0
  259. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-default-cap-28.png +0 -0
  260. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-onclick-28.png +0 -0
  261. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-onclick-cap-28.png +0 -0
  262. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-rollover-28.png +0 -0
  263. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-black-rollover-cap-28.png +0 -0
  264. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-default-cap.png +0 -0
  265. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-default.png +0 -0
  266. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-onclick-cap.png +0 -0
  267. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-onclick.png +0 -0
  268. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-rollover-cap.png +0 -0
  269. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-blue-rollover.png +0 -0
  270. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-cap.png +0 -0
  271. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-drop.png +0 -0
  272. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default-edge.png +0 -0
  273. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-default.png +0 -0
  274. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-cap.png +0 -0
  275. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-drop.png +0 -0
  276. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick-edge.png +0 -0
  277. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-onclick.png +0 -0
  278. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-cap.png +0 -0
  279. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-drop.png +0 -0
  280. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover-edge.png +0 -0
  281. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-green-rollover.png +0 -0
  282. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-default-cap.png +0 -0
  283. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-default.png +0 -0
  284. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-onclick-cap.png +0 -0
  285. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-onclick.png +0 -0
  286. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-rollover-cap.png +0 -0
  287. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-red-rollover.png +0 -0
  288. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-cap.png +0 -0
  289. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-drop.png +0 -0
  290. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default-edge.png +0 -0
  291. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-default.png +0 -0
  292. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-cap.png +0 -0
  293. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-drop.png +0 -0
  294. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick-edge.png +0 -0
  295. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-onclick.png +0 -0
  296. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-cap.png +0 -0
  297. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-drop.png +0 -0
  298. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover-edge.png +0 -0
  299. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-trans-rollover.png +0 -0
  300. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-default-cap.png +0 -0
  301. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-default.png +0 -0
  302. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-onclick-cap.png +0 -0
  303. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-onclick.png +0 -0
  304. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-rollover-cap.png +0 -0
  305. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-white-rollover.png +0 -0
  306. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-default-cap.png +0 -0
  307. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-default.png +0 -0
  308. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-onclick-cap.png +0 -0
  309. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-onclick.png +0 -0
  310. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-rollover-cap.png +0 -0
  311. data/spec/fixtures/project1/public/images/sprite_images/buttons/dark_background/btn-yellow-rollover.png +0 -0
  312. data/spec/fixtures/sprite_images/foo/foo.png +0 -0
  313. data/spec/lib/sprites/application_spec.rb +60 -0
  314. data/spec/lib/sprites/cli/command_line_option_parser_spec.rb +5 -0
  315. data/spec/lib/sprites/configuration_spec.rb +52 -0
  316. data/spec/lib/sprites/core_ext/pathname_spec.rb +4 -0
  317. data/spec/lib/sprites/notifier_spec.rb +5 -0
  318. data/spec/lib/sprites/sprite_generators/chunky_png_generator_spec.rb +19 -0
  319. data/spec/lib/sprites/sprite_piece_spec.rb +41 -0
  320. data/spec/lib/sprites/sprite_pieces_spec.rb +32 -0
  321. data/spec/lib/sprites/sprite_spec.rb +146 -0
  322. data/spec/lib/sprites/sprites_spec.rb +100 -0
  323. data/spec/lib/sprites/stylesheet_spec.rb +25 -0
  324. data/spec/lib/sprites/test/sprite_generator_tester_spec.rb +17 -0
  325. data/spec/lib/sprites_spec.rb +19 -0
  326. data/spec/spec_helper.rb +12 -0
  327. data/spec/support/sprites_helper.rb +149 -0
  328. data/sprites.gemspec +29 -0
  329. metadata +802 -0
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ tmp
2
+ coverage
3
+ *.gem
4
+ .bundle
5
+ Gemfile.lock
6
+ pkg/*
7
+ doc
8
+ .rvmrc
9
+
10
+ spec/fixtures/project1/public/images/sprites/*.png
11
+ spec/fixtures/project1/public/stylesheets/sprites/*.css
12
+
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in sprites.gemspec
4
+ gemspec
5
+
6
+ platforms :mri_18 do
7
+ gem 'ruby-debug'
8
+ end
9
+
10
+ platforms :mri_19 do
11
+ gem 'ruby-debug19'
12
+ end
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+
5
+ desc "Run specs"
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
8
+ # Put spec opts in a file named .rspec in root
9
+ end
10
+
11
+ desc "Generate code coverage"
12
+ RSpec::Core::RakeTask.new(:coverage) do |t|
13
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
14
+ t.rcov = true
15
+ t.rcov_opts = ['--exclude', 'spec']
16
+ end
17
+
18
+ desc 'Default: run specs.'
19
+ task :default => :spec
20
+
21
+ namespace :spec do
22
+ desc 'Create spec'
23
+ task :create, :path do |t, args|
24
+ spec_path = File.join('spec', args[:path].gsub(%r{.rb$}, '_spec.rb'))
25
+ klass = File.basename(args[:path], File.extname(args[:path])).split('_').map {|s| "#{s[0,1].upcase}#{s[1..-1]}" }.join
26
+ mkdir_p File.dirname(spec_path)
27
+
28
+ spec_doc = <<-EOS
29
+ require 'spec_helper'
30
+
31
+ describe #{klass} do
32
+ end
33
+ EOS
34
+
35
+ File.open(spec_path, 'w+') do |f|
36
+ f.puts spec_doc
37
+ end
38
+
39
+ puts spec_doc
40
+ end
41
+ end
data/bin/sprites ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sprites'
4
+ require 'sprites/cli'
5
+
6
+ include Sprites
7
+
8
+ begin
9
+ options = CommandLineOptionParser.new(ARGV)
10
+ options.parse
11
+
12
+ sprite_definition_file_path = options.definition_file_path
13
+ configuration = Configuration.new_for_command_line_options(options.options)
14
+
15
+ CliApplication.run(sprite_definition_file_path, configuration)
16
+ rescue CliApplication::DefinitionFileNotFound
17
+ abort 'No Sprite Definition File found. Please supply a path or place your definition file in `pwd` or `pwd/config`'
18
+ end
@@ -0,0 +1,11 @@
1
+ Feature: Creating sprites and stylesheets
2
+ In order to avoid unnecessary image downloads
3
+ As a developer
4
+ I want to be able to generate image sprites
5
+
6
+ Scenario: Create some sprites
7
+ Given a project folder
8
+ And it contains a sprites dsl definition file
9
+ And it contains sprite images
10
+ When I run the executable "sprites"
11
+ Then I should get valid sprites
@@ -0,0 +1,36 @@
1
+ require 'sprites/test/sprite_generator_tester'
2
+ require 'sprites/cli/command_line_option_parser'
3
+
4
+ Given(/^a project folder$/) do
5
+ Dir.chdir 'spec/fixtures/project1'
6
+ end
7
+
8
+ Given(/^it contains a sprites dsl definition file$/) do
9
+ has_def = File.exists?('config/sprites.rb') || File.exists?('sprites.rb')
10
+ has_def.should be_true
11
+ end
12
+
13
+ Given(/^it contains sprite images$/) do
14
+ Dir['public/images/sprite_images/**/*.png'].should_not be_empty
15
+ end
16
+
17
+ When(/^I run the executable "([^"]*)"$/) do |bin|
18
+ `#{Sprites.gem_root}/bin/#{bin}`
19
+ $?.to_i.should be(0)
20
+ end
21
+
22
+ Then(/^I should get valid sprites$/) do
23
+ options = CommandLineOptionParser.new($*)
24
+ options.parse
25
+
26
+ sprite_definition_file_path = options.definition_file_path
27
+ configuration = Configuration.new_for_command_line_options(options.options)
28
+
29
+ load sprite_definition_file_path
30
+
31
+ tester = SpriteGeneratorTester.new(Sprites.application.sprites[:buttons], configuration)
32
+ tester.should be_accurate
33
+
34
+ FileUtils.rm Sprite.sprite_full_path(configuration, Sprites.application.sprites[:buttons])
35
+ FileUtils.rm Stylesheet.stylesheet_full_path(configuration, Sprites.application.sprites[:buttons].stylesheet)
36
+ end
@@ -0,0 +1,5 @@
1
+ $: << File.expand_path('../../../lib', __FILE__)
2
+ $: << File.expand_path('../../../spec', __FILE__)
3
+
4
+ require 'bundler/setup'
5
+ require 'spec_helper'
@@ -0,0 +1,44 @@
1
+ require 'sprites/sprites'
2
+
3
+ module Sprites
4
+
5
+ # This class provides top level access to the Sprites application.
6
+ # So far, three methods are available:
7
+ # 1. define (_define_)
8
+ # 2. sprite (_sprite_)
9
+ #
10
+ # Author:: Sam Woodard
11
+ #
12
+ # :title:Application
13
+
14
+ class Application
15
+ attr_reader :sprites
16
+
17
+ # The +new+ class method initializes the class.
18
+ # === Example
19
+ # sprites = Sprites.new
20
+ def initialize(configuration = ::Sprites.configuration)
21
+ @configuration = configuration
22
+ @sprites = Sprites.new
23
+ end
24
+
25
+ # The +define+ method provides access to the dsl
26
+ # === Example
27
+ # Sprites.application.define do
28
+ # ...
29
+ # end
30
+ def define(&blk)
31
+ instance_eval(&blk)
32
+ end
33
+
34
+
35
+ # The +sprite+ method adds sprites to the application
36
+ # === Example
37
+ # Sprites.application.define do
38
+ # ...
39
+ # end
40
+ def sprite(*args, &blk)
41
+ sprites.add(*args, &blk)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,11 @@
1
+ module Sprites
2
+ class CliApplication
3
+ class DefinitionFileNotFound < StandardError; end
4
+
5
+ def self.run(def_file, configuration)
6
+ load def_file
7
+ sprite_generator = ChunkyPngGenerator.new(configuration)
8
+ sprite_generator.generate(::Sprites.application.sprites)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,70 @@
1
+ require 'optparse'
2
+ require 'pathname'
3
+
4
+ module Sprites
5
+ class CommandLineOptionParser < OptionParser
6
+ PRIMARY_DEF_FILE_LOCATION = 'config/sprites.rb'
7
+ SECONDARY_DEF_FILE_LOCATION = 'sprites.rb'
8
+
9
+ attr_reader :definition_file_path, :options
10
+
11
+ def initialize(arguments)
12
+ @definition_file_path, @arguments = extract_sprite_definition_file_path(arguments.clone)
13
+ @options = Hash.new
14
+
15
+ super do |opts|
16
+ setup_parser(opts)
17
+ end
18
+ end
19
+
20
+ def parse
21
+ super(@arguments)
22
+ end
23
+
24
+ def extract_sprite_definition_file_path(arguments)
25
+ sprite_def_file_pathname = if arguments[0] =~ %r{^.+\.rb}
26
+ Pathname.new(arguments.shift)
27
+ elsif file_exists?('config/sprites.rb')
28
+ Pathname.new('config/sprites.rb')
29
+ else
30
+ raise
31
+ end
32
+
33
+ [sprite_def_file_pathname.realpath.to_s, arguments]
34
+ rescue
35
+ raise CliApplication::DefinitionFileNotFound
36
+ end
37
+
38
+ def file_exists?(path)
39
+ Pathname.new(path).exist?
40
+ end
41
+
42
+ def setup_parser(opts)
43
+ opts.banner = "Usage: sprites [defintion_file] [options]"
44
+
45
+ opts.separator ""
46
+ opts.separator "Specific options:"
47
+
48
+ opts.on("-s", "--sprites_path", <<-EOS
49
+ Define the path to where the sprites should be placed. DEFAULT: 'public/images/sprites'
50
+ EOS
51
+ ) do |path|
52
+ @options[:sprites_path] = path
53
+ end
54
+
55
+ opts.on("-c", "--sprite_stylesheets_path", <<-EOS
56
+ Define the path to where the sprites stylesheets should be placed. DEFAULT: 'public/stylesheets/sprites'
57
+ EOS
58
+ ) do |path|
59
+ @options[:sprite_stylesheets_path] = path
60
+ end
61
+
62
+ opts.on("-p", "--sprite_pieces_path", <<-EOS
63
+ Define the path to where the images needed to build the sprites are stored. DEFAULT: 'public/images/sprite_pieces'
64
+ EOS
65
+ ) do |path|
66
+ @options[:sprite_pieces_path] = path
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,4 @@
1
+ module Sprites
2
+ autoload :CommandLineOptionParser, "sprites/cli/command_line_option_parser"
3
+ autoload :CliApplication, "sprites/cli/cli_application"
4
+ end
@@ -0,0 +1,59 @@
1
+ module Sprites
2
+ class Configuration
3
+ FIELDS = %w{backend sprites_path sprite_stylesheets_path sprite_pieces_path}
4
+
5
+ DEFAULT_CONFIGURATION = {
6
+ 'backend' => :rmagick,
7
+ 'sprites_path' => 'public/images/sprites',
8
+ 'sprite_stylesheets_path' => 'public/stylesheets/sprites',
9
+ 'sprite_pieces_path' => 'public/images/sprite_images'
10
+ }
11
+
12
+ def initialize
13
+ DEFAULT_CONFIGURATION.each {|k,v| self.send(k, v)}
14
+ end
15
+
16
+ def configure(&blk)
17
+ instance_eval(&blk)
18
+ self
19
+ end
20
+
21
+ FIELDS.each do |meth|
22
+ eval <<-EVAL
23
+ def #{meth}(*args)
24
+ val, *_ = args
25
+
26
+ if val
27
+ @#{meth} = val
28
+ return self
29
+ end
30
+
31
+ @#{meth}
32
+ end
33
+ EVAL
34
+ end
35
+
36
+ alias_method :backend_without_override, :backend
37
+ def backend_with_override(*args)
38
+ val, *_ = args
39
+
40
+ if val
41
+ backend_without_override(val)
42
+ return self
43
+ end
44
+
45
+ backend_without_override && backend_without_override.to_sym
46
+ end
47
+ alias_method :backend, :backend_with_override
48
+
49
+ def self.new_for_command_line_options(options)
50
+ config = new
51
+ options.each do |k, v|
52
+ if FIELDS.include?(k.to_s)
53
+ config.send(k, v)
54
+ end
55
+ end
56
+ config
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,7 @@
1
+ require 'pathname'
2
+
3
+ class Pathname
4
+ def self.wrap(val)
5
+ val.is_a?(Pathname) ? val : Pathname.new(val)
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Sprites
2
+ class Notifier
3
+ def self.no_configured_or_imlicit_backend(print = true)
4
+ msg = "We were unable to load your configured backend or any supported backends"
5
+ $stdout << msg if print
6
+ msg
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,127 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'sprites/core_ext/pathname'
4
+ require 'active_support/core_ext/array/extract_options'
5
+ require 'active_support/core_ext/object/try'
6
+ require 'sprites/sprite_pieces'
7
+ require 'sprites/sprite_piece'
8
+ require 'sprites/stylesheet'
9
+
10
+ module Sprites
11
+ class Sprite
12
+ class InvalidOrientation < StandardError; end
13
+ module Orientations
14
+ VERTICAL = 1
15
+ HORIZONTAL = 2
16
+ end
17
+
18
+ OPTIONS = [:orientation]
19
+
20
+ DEFAULT_OPTIONS = {
21
+ :orientation => Orientations::VERTICAL
22
+ }
23
+
24
+ attr_reader :name, :sprite_pieces, :stylesheet
25
+
26
+ def initialize(name)
27
+ @name = name
28
+ @sprite_pieces = SpritePieces.new
29
+ @options = DEFAULT_OPTIONS.dup
30
+ set_options
31
+ end
32
+
33
+ def define(*args, &blk)
34
+ @options = @options.merge args.extract_options!
35
+ @path ||= Pathname.wrap(path_for_arguments(@options, *args))
36
+ @stylesheet ||= Stylesheet.new(css_path, self)
37
+ @options.delete(@path.to_s)
38
+ set_options
39
+
40
+ instance_eval(&blk) if block_given?
41
+ self
42
+ end
43
+
44
+ def define!
45
+ define unless is_defined?
46
+ end
47
+
48
+ def is_defined?
49
+ !@stylesheet.nil?
50
+ end
51
+
52
+ def path
53
+ define!
54
+ @path
55
+ end
56
+
57
+ def stylesheet
58
+ define!
59
+ @stylesheet
60
+ end
61
+
62
+ def write_stylesheet(configuration, sprite_pieces = @sprite_pieces)
63
+ path = Stylesheet.stylesheet_full_path(configuration, stylesheet)
64
+ FileUtils.mkdir_p(File.dirname(path))
65
+ File.open path, 'w+' do |f|
66
+ f << stylesheet.css(configuration, self, sprite_pieces)
67
+ end
68
+ end
69
+
70
+ def stylesheet_path
71
+ define!
72
+ @stylesheet.path
73
+ end
74
+
75
+ def sprite_piece(options)
76
+ @sprite_pieces.add(options)
77
+ end
78
+
79
+ def orientation(*args)
80
+ val, *_ = args
81
+ if val
82
+ unless [Orientations::VERTICAL, Orientations::HORIZONTAL].include?(val)
83
+ raise InvalidOrientation
84
+ end
85
+ @orientation = val
86
+ return self
87
+ end
88
+
89
+ @orientation
90
+ end
91
+
92
+ def self.sprite_full_path(configuration, sprite)
93
+ File.join(configuration.sprites_path, sprite.path)
94
+ end
95
+
96
+ def self.sprite_css_path(configuration, sprite)
97
+ "/#{sprite_full_path(configuration, sprite)}"
98
+ end
99
+
100
+ private
101
+
102
+ def css_path
103
+ @paths && @paths.last || @path.to_s.gsub(/png$/, 'css')
104
+ end
105
+
106
+ def paths_for_options(options)
107
+ @paths ||= options.find {|k,v| k.is_a?(String) }
108
+ end
109
+
110
+ def path_for_arguments(options, *args)
111
+ if args.first.is_a?(Symbol) || (args.empty? && !paths_for_options(options).try(:first))
112
+ "#{args.first || @name}.png"
113
+ elsif args.first.is_a?(String)
114
+ args.first
115
+ else
116
+ path = paths_for_options(options).first
117
+ raise ArgumentError, "Path is not a string. See usage." unless path.is_a?(String)
118
+ path
119
+ end
120
+ end
121
+
122
+ def set_options
123
+ return unless @options
124
+ @options.each {|k,v| send(k,v) if Sprite::OPTIONS.include?(k) }
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,114 @@
1
+ begin
2
+ require 'oily_png'
3
+ rescue
4
+ require 'chunky_png'
5
+ end
6
+
7
+ module Sprites
8
+ class ChunkyPngGenerator
9
+ attr_reader :configuration
10
+
11
+ def initialize(configuration)
12
+ @configuration = configuration
13
+ end
14
+
15
+ def generate(sprites)
16
+ # verbose = ENV['VERBOSE'] == 'true' || ENV['DEBUG']
17
+ #
18
+ # if verbose
19
+ # t = Time.now
20
+ # $stdout << "#{t}: Active Sprites: \"I'm starting my run using #{runner_name}.\"\n"
21
+ # $stdout << "\nSprites to create:\n\"#{@sprites.map(&:path).join('", "')}\"\n"
22
+ # end
23
+
24
+ sprites.each do |sprite|
25
+ next if sprite.sprite_pieces.empty?
26
+ #
27
+ # if verbose
28
+ # t_sprite = Time.now
29
+ # $stdout << "\n=================================================\n"
30
+ # $stdout << "Starting Sprite, #{sprite.path}\n"
31
+ # end
32
+ #
33
+
34
+ sprite_path = File.join(configuration.sprites_path, sprite.path)
35
+ sprite_stylesheet_path = File.join(configuration.sprite_stylesheets_path, sprite.stylesheet_path)
36
+
37
+ orientation = sprite.orientation
38
+ sprite_pieces = sprite.sprite_pieces
39
+
40
+ begin
41
+ # $stdout << "Gathering sprite details..." if verbose
42
+ image_list, width, height = create_image_list(sprite, sprite_path, sprite_pieces, orientation)
43
+ # $stdout << "done.\n" if verbose
44
+ #
45
+ # if ENV['DEBUG']
46
+ # $stdout << "|\tpath\t|\tselectors\t|\tx\t|\ty\t|\twidth\t|\theight\t|\n"
47
+ # $stdout << "#{sprite_pieces.map(&:to_s).join("\n")}\n"
48
+ # end
49
+ #
50
+ sprite.write_stylesheet(configuration)
51
+ # stylesheet_file_path = File.join(@railtie.config.paths.public.to_a.first, sprite_stylesheet_path)
52
+ # $stdout << "Writing stylesheet to #{stylesheet_file_path} ... " if verbose
53
+ # stylesheet.write stylesheet_file_path
54
+ # $stdout << "done.\n" if verbose
55
+ #
56
+ # $stdout << "Beginning sprite generation using #{runner_name.humanize}.\n" if verbose
57
+ create_sprite(sprite, sprite_path, sprite_pieces, image_list, width, height, orientation, false)
58
+ # $stdout << "Success!\n" if verbose
59
+ #
60
+ # $stdout << "Writing sprite to #{sprite_file_path} ... " if verbose
61
+ write sprite_path
62
+ # $stdout << "done.\n" if verbose
63
+ #
64
+ # $stdout << "Finished #{sprite.path} in #{Time.now - t_sprite} seconds.\n" if verbose
65
+ # $stdout << "=================================================\n\n" if verbose
66
+ ensure
67
+ finish
68
+ end
69
+ end
70
+
71
+ # $stdout << "#{Time.now}: ActiveSprites \"I finished my run in #{Time.now - t} seconds.\"\n" if verbose
72
+ end
73
+
74
+ private
75
+
76
+ def create_image_list(sprite, sprite_path, sprite_pieces, orientation)
77
+ width, height = 0, 0
78
+
79
+ image_list = sprite_pieces.map do |sp|
80
+ sprite_piece_path = SpritePiece.sprite_piece_full_path(@configuration, sp)
81
+ sp_image = ChunkyPNG::Image.from_file(sprite_piece_path)
82
+ sp.x = orientation == Sprite::Orientations::VERTICAL ? 0 : width
83
+ sp.y = orientation == Sprite::Orientations::VERTICAL ? height : 0
84
+ sp.width = sp_image.width
85
+ sp.height = sp_image.height
86
+
87
+ width = orientation == Sprite::Orientations::HORIZONTAL ? width + sp_image.width : [width, sp_image.width].max
88
+ height = orientation == Sprite::Orientations::VERTICAL ? height + sp_image.height : [height, sp_image.height].max
89
+
90
+ sp_image
91
+ end
92
+ [image_list, width, height]
93
+ end
94
+
95
+ def create_sprite(sprite, sprite_path, sprite_pieces, image_list, width, height, orientation, verbose)
96
+ @sprite = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
97
+
98
+ image_list.each_with_index do |image, i|
99
+ @sprite.replace!(image, sprite_pieces.element_at(i).x, sprite_pieces.element_at(i).y)
100
+ # $stdout << '.' if verbose
101
+ end
102
+ # $stdout << "\n" if verbose
103
+ end
104
+
105
+ def write(path, quality = nil)
106
+ FileUtils.mkdir_p(File.dirname(path))
107
+ @sprite.save(path)
108
+ end
109
+
110
+ def finish
111
+ @sprite = nil
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,36 @@
1
+ module Sprites
2
+ class SpritePiece
3
+ attr_reader :path
4
+ attr_accessor :sprite, :css_selector, :x, :y, :width, :height
5
+ alias_method :selector, :css_selector
6
+
7
+ def initialize(path)
8
+ @path = path
9
+ end
10
+
11
+ def self.sprite_piece_full_path(configuration, sprite_piece)
12
+ File.join(configuration.sprite_pieces_path, sprite_piece.path)
13
+ end
14
+
15
+ def css(configuration = ::Sprites.configuration, sprite = @sprite, sprite_css_path = nil)
16
+ raise "Sprite needed." unless sprite
17
+
18
+ <<-CSS
19
+ #{selector}
20
+ {
21
+ display:block;
22
+ width:#{width}px;
23
+ height:#{height}px;
24
+ background:url('#{sprite_css_path || Sprite.sprite_css_path(configuration, sprite)}') no-repeat #{negative_pixelize(x)} #{negative_pixelize(y)};
25
+ }
26
+ CSS
27
+ end
28
+
29
+ private
30
+
31
+ def negative_pixelize(val)
32
+ return "0" if val.to_i == 0
33
+ "-#{val}px"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ require 'active_support/ordered_hash'
2
+
3
+ module Sprites
4
+ class SpritePieces
5
+ def initialize
6
+ @sprite_pieces = ActiveSupport::OrderedHash.new do |sprite_pieces, path|
7
+ sprite_pieces[path] = SpritePiece.new(path)
8
+ end
9
+ end
10
+
11
+ def add(options)
12
+ path, css_selector = options.find {|k,v| k.is_a?(String)}
13
+ @sprite_pieces[path].css_selector = css_selector
14
+ @sprite_pieces[path]
15
+ end
16
+
17
+ def count
18
+ @sprite_pieces.size
19
+ end
20
+
21
+ def empty?
22
+ @sprite_pieces.empty?
23
+ end
24
+
25
+ def [](val)
26
+ @sprite_pieces.has_key?(val) ?
27
+ @sprite_pieces[val] :
28
+ nil
29
+ end
30
+
31
+ def element_at(index)
32
+ @sprite_pieces.values[index]
33
+ end
34
+
35
+ def map(*args, &blk)
36
+ @sprite_pieces.values.map(*args, &blk)
37
+ end
38
+
39
+ def find(*args, &blk)
40
+ @sprite_pieces.values.find(*args, &blk)
41
+ end
42
+
43
+ def css(configuration = ::Sprites.configuration, sprite = @sprite)
44
+ @sprite_pieces.values.map {|sp| sp.css(configuration, sprite)}.join("\n")
45
+ end
46
+ end
47
+ end