lentil 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 (563) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +199 -0
  4. data/Rakefile +43 -0
  5. data/app/assets/images/lentil/icons/MHL-touch-icon-114.png +0 -0
  6. data/app/assets/images/lentil/icons/MHL-touch-icon-144.png +0 -0
  7. data/app/assets/images/lentil/icons/MHL-touch-icon-57.png +0 -0
  8. data/app/assets/images/lentil/icons/MHL-touch-icon-72.png +0 -0
  9. data/app/assets/images/lentil/icons/f_logo.png +0 -0
  10. data/app/assets/images/lentil/icons/twitter-bird-light-bgs.png +0 -0
  11. data/app/assets/images/lentil/loadingsquares.gif +0 -0
  12. data/app/assets/javascripts/active_admin.js +7 -0
  13. data/app/assets/javascripts/lentil.js +3 -0
  14. data/app/assets/javascripts/lentil/addanimatedimages.js +44 -0
  15. data/app/assets/javascripts/lentil/addfancybox.js +152 -0
  16. data/app/assets/javascripts/lentil/addinfinitescroll.js.erb +50 -0
  17. data/app/assets/javascripts/lentil/buttonhandler.js +25 -0
  18. data/app/assets/javascripts/lentil/event_tracking.js.erb +80 -0
  19. data/app/assets/javascripts/lentil/imageerrors.js +8 -0
  20. data/app/assets/javascripts/lentil/images.js +55 -0
  21. data/app/assets/javascripts/lentil/thisorthat.js.erb +129 -0
  22. data/app/assets/stylesheets/active_admin.css.scss +31 -0
  23. data/app/assets/stylesheets/admin/moderation.css.scss +65 -0
  24. data/app/assets/stylesheets/lentil.css.scss +8 -0
  25. data/app/assets/stylesheets/lentil/breakpoint/sass/_components.scss +315 -0
  26. data/app/assets/stylesheets/lentil/breakpoint/sass/_config.scss +37 -0
  27. data/app/assets/stylesheets/lentil/breakpoint/sass/_framework.scss +6 -0
  28. data/app/assets/stylesheets/lentil/breakpoint/sass/_structure.scss +222 -0
  29. data/app/assets/stylesheets/lentil/breakpoint/sass/config.rb +17 -0
  30. data/app/assets/stylesheets/lentil/breakpoint/sass/framework/_grid-core.scss +83 -0
  31. data/app/assets/stylesheets/lentil/breakpoint/sass/framework/_grid-helpers.scss +136 -0
  32. data/app/assets/stylesheets/lentil/breakpoint/sass/framework/_mixins.scss +19 -0
  33. data/app/assets/stylesheets/lentil/breakpoint/sass/framework/_normalize.scss +524 -0
  34. data/app/assets/stylesheets/lentil/breakpoint/sass/framework/_print.scss +19 -0
  35. data/app/assets/stylesheets/lentil/breakpoint/sass/style.scss +12 -0
  36. data/app/assets/stylesheets/lentil/image_animation.css.scss +23 -0
  37. data/app/assets/stylesheets/lentil/images.css.scss +6 -0
  38. data/app/assets/stylesheets/lentil/thisorthat.css.scss +91 -0
  39. data/app/controllers/lentil/application_controller.rb +6 -0
  40. data/app/controllers/lentil/flags_controller.rb +13 -0
  41. data/app/controllers/lentil/images_controller.rb +61 -0
  42. data/app/controllers/lentil/like_votes_controller.rb +13 -0
  43. data/app/controllers/lentil/pages_controller.rb +7 -0
  44. data/app/controllers/lentil/photographers_controller.rb +20 -0
  45. data/app/controllers/lentil/thisorthat_controller.rb +117 -0
  46. data/app/helpers/lentil/application_helper.rb +58 -0
  47. data/app/helpers/lentil/images_helper.rb +23 -0
  48. data/app/helpers/lentil/thisorthat_helper.rb +19 -0
  49. data/app/models/lentil/admin_user.rb +32 -0
  50. data/app/models/lentil/battle.rb +33 -0
  51. data/app/models/lentil/flag.rb +14 -0
  52. data/app/models/lentil/image.rb +174 -0
  53. data/app/models/lentil/license.rb +21 -0
  54. data/app/models/lentil/licensing.rb +16 -0
  55. data/app/models/lentil/like_vote.rb +14 -0
  56. data/app/models/lentil/service.rb +17 -0
  57. data/app/models/lentil/tag.rb +23 -0
  58. data/app/models/lentil/tagging.rb +20 -0
  59. data/app/models/lentil/tagset.rb +24 -0
  60. data/app/models/lentil/tagset_assignment.rb +17 -0
  61. data/app/models/lentil/user.rb +27 -0
  62. data/app/views/admin/lentil_images/_moderation_form_body.html.erb +47 -0
  63. data/app/views/admin/lentil_images/flagging_history.html.erb +33 -0
  64. data/app/views/admin/lentil_images/manual_input.html.erb +6 -0
  65. data/app/views/admin/lentil_images/moderate.html.erb +9 -0
  66. data/app/views/layouts/lentil/_apple_touch_icons.html.erb +1 -0
  67. data/app/views/layouts/lentil/_error.html.erb +9 -0
  68. data/app/views/layouts/lentil/_flag_button.html.erb +10 -0
  69. data/app/views/layouts/lentil/_image_popup.html.erb +34 -0
  70. data/app/views/layouts/lentil/_like_button.html.erb +18 -0
  71. data/app/views/layouts/lentil/_secondary_navigation.html.erb +5 -0
  72. data/app/views/layouts/lentil/_top_navigation.html.erb +26 -0
  73. data/app/views/layouts/lentil/application.html.erb +28 -0
  74. data/app/views/lentil/images/_flagging_modal.html.erb +18 -0
  75. data/app/views/lentil/images/_image_tiles.erb +14 -0
  76. data/app/views/lentil/images/animate.html.erb +19 -0
  77. data/app/views/lentil/images/index.atom.builder +16 -0
  78. data/app/views/lentil/images/index.html.erb +30 -0
  79. data/app/views/lentil/images/index.rss.builder +19 -0
  80. data/app/views/lentil/images/show.html.erb +24 -0
  81. data/app/views/lentil/pages/about.html.erb +9 -0
  82. data/app/views/lentil/photographers/index.html.erb +13 -0
  83. data/app/views/lentil/photographers/show.html.erb +15 -0
  84. data/app/views/lentil/thisorthat/_battle_form.html.erb +44 -0
  85. data/app/views/lentil/thisorthat/battle.html.erb +13 -0
  86. data/app/views/lentil/thisorthat/battle_error.html.erb +3 -0
  87. data/config/locales/en.yml +39 -0
  88. data/config/routes.rb +17 -0
  89. data/db/migrate/20121028023144_create_images.rb +10 -0
  90. data/db/migrate/20121028042738_create_like_votes.rb +10 -0
  91. data/db/migrate/20121028052935_add_like_votes_counter_to_images.rb +5 -0
  92. data/db/migrate/20121028164239_add_sessions_table.rb +12 -0
  93. data/db/migrate/20121030170509_add_url_column_to_images.rb +5 -0
  94. data/db/migrate/20121030170542_add_username_column_to_images.rb +5 -0
  95. data/db/migrate/20121112162243_create_users.rb +11 -0
  96. data/db/migrate/20121112163008_create_services.rb +10 -0
  97. data/db/migrate/20121112163635_remove_username_from_images.rb +9 -0
  98. data/db/migrate/20121112163857_remove_title_from_images.rb +9 -0
  99. data/db/migrate/20121112165849_add_user_id_to_images.rb +5 -0
  100. data/db/migrate/20121112200340_add_service_id_to_users.rb +5 -0
  101. data/db/migrate/20121119210407_create_tags.rb +9 -0
  102. data/db/migrate/20121119210450_create_tagsets.rb +10 -0
  103. data/db/migrate/20121119210538_create_tagset_assignments.rb +12 -0
  104. data/db/migrate/20121119211236_create_taggings.rb +12 -0
  105. data/db/migrate/20121120172450_create_licenses.rb +11 -0
  106. data/db/migrate/20121120172712_create_licensings.rb +12 -0
  107. data/db/migrate/20121120191524_devise_create_admin_users.rb +52 -0
  108. data/db/migrate/20121120191530_create_admin_notes.rb +17 -0
  109. data/db/migrate/20121120191531_move_admin_notes_to_comments.rb +25 -0
  110. data/db/migrate/20121121204450_add_state_to_images.rb +5 -0
  111. data/db/migrate/20121126170008_add_external_identifier_to_images.rb +6 -0
  112. data/db/migrate/20121126192652_add_short_name_to_licenses.rb +6 -0
  113. data/db/migrate/20121126205839_add_long_url_to_images.rb +5 -0
  114. data/db/migrate/20121127154531_create_flags.rb +10 -0
  115. data/db/migrate/20121127160158_add_original_metadata_to_images.rb +5 -0
  116. data/db/migrate/20121127193932_add_index_to_users.rb +5 -0
  117. data/db/migrate/20121127194027_add_index_to_services.rb +5 -0
  118. data/db/migrate/20121127194428_add_index_to_tags.rb +5 -0
  119. data/db/migrate/20121127195059_add_original_datetime_to_images.rb +5 -0
  120. data/db/migrate/20121127210507_add_bio_to_users.rb +5 -0
  121. data/db/migrate/20121127211257_add_staff_like_to_images.rb +5 -0
  122. data/db/migrate/20121128190207_add_moderator_to_images.rb +7 -0
  123. data/db/migrate/20121128213305_add_second_moderation_boolean_to_images.rb +5 -0
  124. data/db/migrate/20121130202753_add_default_for_staff_like.rb +5 -0
  125. data/db/migrate/20121130212917_add_default_for_image_state.rb +5 -0
  126. data/db/migrate/20121206145832_add_staff_tag_to_taggings.rb +5 -0
  127. data/db/migrate/20121213142215_add_images_count_to_users.rb +14 -0
  128. data/db/migrate/20121220151517_create_battles.rb +10 -0
  129. data/db/migrate/20121220155108_add_wins_counter_to_images.rb +5 -0
  130. data/db/migrate/20121220182845_add_losses_counter_to_images.rb +5 -0
  131. data/db/migrate/20130107192518_add_win_pct_to_images.rb +5 -0
  132. data/db/migrate/20130108195949_add_popular_score_to_images.rb +5 -0
  133. data/db/migrate/20130116145103_add_harvest_to_tagsets.rb +5 -0
  134. data/db/migrate/20130130194955_add_file_harvested_date_field_to_images.rb +6 -0
  135. data/db/migrate/20130306144752_add_donor_agreement_submitted_to_images.rb +5 -0
  136. data/db/migrate/20130306145013_add_donor_agreement_failed_to_images.rb +5 -0
  137. data/db/migrate/20130403135640_add_failed_file_checks_to_images.rb +6 -0
  138. data/db/migrate/20130412195348_namespace_tables.rb +16 -0
  139. data/db/migrate/20130413005943_namespace_licensings.rb +5 -0
  140. data/db/migrate/20130506204728_add_donor_agreement_rejected_to_images.rb +5 -0
  141. data/db/migrate/20130506205348_add_do_not_request_donation_to_lentil_images.rb +5 -0
  142. data/db/seeds.rb +5 -0
  143. data/lib/generators/lentil/USAGE +8 -0
  144. data/lib/generators/lentil/install_generator.rb +85 -0
  145. data/lib/generators/lentil/templates/README.md +19 -0
  146. data/lib/generators/lentil/templates/active_admin.rb +150 -0
  147. data/lib/generators/lentil/templates/devise.rb +232 -0
  148. data/lib/generators/lentil/templates/kaminari.rb +3 -0
  149. data/lib/generators/lentil/templates/lentil_config.yml +33 -0
  150. data/lib/lentil.rb +24 -0
  151. data/lib/lentil/admin/admin_user.rb +24 -0
  152. data/lib/lentil/admin/dashboard.rb +116 -0
  153. data/lib/lentil/admin/flags.rb +17 -0
  154. data/lib/lentil/admin/images.rb +209 -0
  155. data/lib/lentil/admin/tags.rb +18 -0
  156. data/lib/lentil/admin/tagsets.rb +51 -0
  157. data/lib/lentil/admin/user.rb +20 -0
  158. data/lib/lentil/admin/view_helpers.rb +11 -0
  159. data/lib/lentil/engine.rb +22 -0
  160. data/lib/lentil/instagram_harvester.rb +249 -0
  161. data/lib/lentil/popularity_calculator.rb +63 -0
  162. data/lib/lentil/version.rb +3 -0
  163. data/lib/tasks/auto_annotate_models.rake +20 -0
  164. data/lib/tasks/image_services.rake +129 -0
  165. data/lib/tasks/lentil_tasks.rake +10 -0
  166. data/lib/tasks/popularity.rake +16 -0
  167. data/test/dummy/README.rdoc +261 -0
  168. data/test/dummy/Rakefile +7 -0
  169. data/test/dummy/app/assets/javascripts/application.js +15 -0
  170. data/test/dummy/app/assets/stylesheets/application.css.scss +1 -0
  171. data/test/dummy/app/controllers/application_controller.rb +3 -0
  172. data/test/dummy/app/helpers/application_helper.rb +2 -0
  173. data/test/dummy/config.ru +4 -0
  174. data/test/dummy/config/application.rb +59 -0
  175. data/test/dummy/config/boot.rb +10 -0
  176. data/test/dummy/config/database.yml +25 -0
  177. data/test/dummy/config/environment.rb +5 -0
  178. data/test/dummy/config/environments/development.rb +37 -0
  179. data/test/dummy/config/environments/production.rb +67 -0
  180. data/test/dummy/config/environments/test.rb +37 -0
  181. data/test/dummy/config/initializers/active_admin.rb +150 -0
  182. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  183. data/test/dummy/config/initializers/devise.rb +232 -0
  184. data/test/dummy/config/initializers/inflections.rb +15 -0
  185. data/test/dummy/config/initializers/kaminari.rb +3 -0
  186. data/test/dummy/config/initializers/mime_types.rb +5 -0
  187. data/test/dummy/config/initializers/secret_token.rb +7 -0
  188. data/test/dummy/config/initializers/session_store.rb +8 -0
  189. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  190. data/test/dummy/config/lentil_config.yml +30 -0
  191. data/test/dummy/config/locales/en.yml +5 -0
  192. data/test/dummy/config/routes.rb +9 -0
  193. data/test/dummy/db/schema.rb +195 -0
  194. data/test/dummy/db/seeds.rb +1 -0
  195. data/test/dummy/db/test.sqlite3 +0 -0
  196. data/test/dummy/log/test.log +10235 -0
  197. data/test/dummy/public/404.html +26 -0
  198. data/test/dummy/public/422.html +26 -0
  199. data/test/dummy/public/500.html +25 -0
  200. data/test/dummy/public/favicon.ico +0 -0
  201. data/test/dummy/script/rails +6 -0
  202. data/test/dummy/tmp/cache/assets/C42/6B0/sprockets%2Ff9428783b785862eb53346b864f94428 +0 -0
  203. data/test/dummy/tmp/cache/assets/C48/E70/sprockets%2Fa7be1700e70899163027f63a25844c02 +0 -0
  204. data/test/dummy/tmp/cache/assets/C57/560/sprockets%2F1f547a440537aec8d738c93894407105 +0 -0
  205. data/test/dummy/tmp/cache/assets/C64/FE0/sprockets%2F64416e104b07dc260675009a5aa802c1 +0 -0
  206. data/test/dummy/tmp/cache/assets/C6C/080/sprockets%2F2116707a968e8208e090b121181afc0a +0 -0
  207. data/test/dummy/tmp/cache/assets/C6F/5C0/sprockets%2Fddc2132bb0b628079c5065081c817551 +0 -0
  208. data/test/dummy/tmp/cache/assets/C7B/090/sprockets%2F96c14f0b10f122605c2c48b5277865e6 +0 -0
  209. data/test/dummy/tmp/cache/assets/C83/600/sprockets%2F68b2320f62db97898602c88ab351b154 +0 -0
  210. data/test/dummy/tmp/cache/assets/C8D/0B0/sprockets%2F4086552147c1d9af9c66e72943d63b82 +0 -0
  211. data/test/dummy/tmp/cache/assets/C92/100/sprockets%2F36490a1ee805e37f098a7817e6c95526 +0 -0
  212. data/test/dummy/tmp/cache/assets/C96/970/sprockets%2F0829123a4f1a0c4102c81c9a35c02c98 +0 -0
  213. data/test/dummy/tmp/cache/assets/C99/8E0/sprockets%2Fe953726264248e339078be7cc7926e4f +0 -0
  214. data/test/dummy/tmp/cache/assets/CA6/380/sprockets%2F0db015389c4847b44149da5432ee600e +0 -0
  215. data/test/dummy/tmp/cache/assets/CAC/100/sprockets%2F9399d899650c546f87d34e233caf9977 +0 -0
  216. data/test/dummy/tmp/cache/assets/CB2/410/sprockets%2F95d0566e48bb62f4bf44364504421e9a +0 -0
  217. data/test/dummy/tmp/cache/assets/CB5/320/sprockets%2Fcc2889b817f6b8603540cd71e6616b50 +0 -0
  218. data/test/dummy/tmp/cache/assets/CB9/990/sprockets%2Faf8ad756710f9583563033dd94c728c0 +0 -0
  219. data/test/dummy/tmp/cache/assets/CC6/F80/sprockets%2Fd5e909a571443a22cf0dc0c113a94114 +0 -0
  220. data/test/dummy/tmp/cache/assets/CC8/C20/sprockets%2F6354de7687421eeda9c430397894f8f0 +0 -0
  221. data/test/dummy/tmp/cache/assets/CC9/7B0/sprockets%2Ffaa30a33ae1698f27018d11e3f072233 +0 -0
  222. data/test/dummy/tmp/cache/assets/CCF/5F0/sprockets%2F5d62451bc086a25070b4ea73c387d1a5 +0 -0
  223. data/test/dummy/tmp/cache/assets/CD5/A00/sprockets%2F9c4914e228af6400d302b6cd283f900e +0 -0
  224. data/test/dummy/tmp/cache/assets/CD6/170/sprockets%2F3554b0cf72c07f591dcb54630607d0a9 +0 -0
  225. data/test/dummy/tmp/cache/assets/CD6/F30/sprockets%2F23191ae5e95d7e0e0771b7033a1097af +0 -0
  226. data/test/dummy/tmp/cache/assets/CE5/210/sprockets%2Fdb0122cf42e7810fe0799874be09644e +0 -0
  227. data/test/dummy/tmp/cache/assets/CE5/650/sprockets%2F8ab512c9b33ac90e699b73469d71f061 +0 -0
  228. data/test/dummy/tmp/cache/assets/CE6/FE0/sprockets%2F73ec02022749e817b83909f60cce7a5f +0 -0
  229. data/test/dummy/tmp/cache/assets/CE7/610/sprockets%2F08cbe5246a49c4599797a0224fd246ea +0 -0
  230. data/test/dummy/tmp/cache/assets/CE7/F00/sprockets%2Fa74a53552b73e97b67ad19ce7660055f +0 -0
  231. data/test/dummy/tmp/cache/assets/CEA/A40/sprockets%2Fdfdd64331199cfc265779fd03241377c +0 -0
  232. data/test/dummy/tmp/cache/assets/CEA/D30/sprockets%2F45a3a8537165a7657e4ed46f8bdb0593 +0 -0
  233. data/test/dummy/tmp/cache/assets/CEC/830/sprockets%2F77ad86593cd9332af1407493e5c39c5b +0 -0
  234. data/test/dummy/tmp/cache/assets/CEC/C10/sprockets%2Fc193f41bd81159ae9ef7b0385250e789 +0 -0
  235. data/test/dummy/tmp/cache/assets/CED/250/sprockets%2F28b6d357c282e6867362ed05881dfe2b +0 -0
  236. data/test/dummy/tmp/cache/assets/CED/460/sprockets%2Fd37d356a7d06d0609ea3f7628496d29d +0 -0
  237. data/test/dummy/tmp/cache/assets/CF9/DA0/sprockets%2Fedb69283f09967db46c74b72ae179494 +0 -0
  238. data/test/dummy/tmp/cache/assets/CFB/160/sprockets%2F98a9093839b570dcc8997d274dbbc465 +0 -0
  239. data/test/dummy/tmp/cache/assets/D03/CD0/sprockets%2F2cd0353d32bc3c4284ef8537a3b47f22 +0 -0
  240. data/test/dummy/tmp/cache/assets/D04/360/sprockets%2Fddeca47fb0c8741454b26453d41c8015 +0 -0
  241. data/test/dummy/tmp/cache/assets/D04/C00/sprockets%2Fca82ed20399235d2c48dbb6d1620732d +0 -0
  242. data/test/dummy/tmp/cache/assets/D04/F50/sprockets%2F1dada65d112db8475da0768b01971a94 +0 -0
  243. data/test/dummy/tmp/cache/assets/D0D/B10/sprockets%2F3de9d42f71f1bc23221b69171e90ed67 +0 -0
  244. data/test/dummy/tmp/cache/assets/D1B/590/sprockets%2Fbe6ac6f9a700610d5ba87966e577077d +0 -0
  245. data/test/dummy/tmp/cache/assets/D1E/680/sprockets%2F509a2e8767cd429ea59a1b689d4ab484 +0 -0
  246. data/test/dummy/tmp/cache/assets/D27/B70/sprockets%2F5780a94fb908448ed3e800e63fd877de +0 -0
  247. data/test/dummy/tmp/cache/assets/D2E/B70/sprockets%2Fb05c50d8309cf7e7c006b344fbed0107 +0 -0
  248. data/test/dummy/tmp/cache/assets/D32/340/sprockets%2Fbfd4a939f123425ff33a40a76032ded2 +0 -0
  249. data/test/dummy/tmp/cache/assets/D34/C30/sprockets%2F715a4379b39f2577210c15affca3bdc1 +0 -0
  250. data/test/dummy/tmp/cache/assets/D38/440/sprockets%2Fc906c171e7aa8ba93ec3219ce4f04705 +0 -0
  251. data/test/dummy/tmp/cache/assets/D38/B20/sprockets%2F2b1c2ef9ddf068ab0174d4568091ea62 +0 -0
  252. data/test/dummy/tmp/cache/assets/D3B/EC0/sprockets%2Fc3ef1b053f9f177d9141cc375bf61c50 +0 -0
  253. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  254. data/test/dummy/tmp/cache/assets/D56/BE0/sprockets%2F7777b5cfe624ec519525fe82da08f7e6 +0 -0
  255. data/test/dummy/tmp/cache/assets/D61/290/sprockets%2Fdf8e43ab35b1467495b10ad40c97bb1b +0 -0
  256. data/test/dummy/tmp/cache/assets/D66/AD0/sprockets%2F630aed9dbe5fb89243b0c040af3670e7 +0 -0
  257. data/test/dummy/tmp/cache/assets/D69/E10/sprockets%2F48900c1edbfe227d110f8050fbdd97f4 +0 -0
  258. data/test/dummy/tmp/cache/assets/D6D/AB0/sprockets%2F7138214dfee4490b54377eecc4cbfe11 +0 -0
  259. data/test/dummy/tmp/cache/assets/D6F/EF0/sprockets%2F0466d0a8ac4be2e9114ff4e82af38d84 +0 -0
  260. data/test/dummy/tmp/cache/assets/D73/040/sprockets%2Fcab4ce19553a2852a2ecec47f1e87568 +0 -0
  261. data/test/dummy/tmp/cache/assets/D74/490/sprockets%2Fa17a51fbc23c1a3648e9f6fec8f62943 +0 -0
  262. data/test/dummy/tmp/cache/assets/D74/680/sprockets%2F3dd8cd62caf32217aa89f897b0eb2818 +0 -0
  263. data/test/dummy/tmp/cache/assets/D7A/930/sprockets%2F6be8ba37ee48b21a9ab604565dfd9775 +0 -0
  264. data/test/dummy/tmp/cache/assets/D7A/A90/sprockets%2Ffec462cdc03e47621953fc8eb9e6547a +0 -0
  265. data/test/dummy/tmp/cache/assets/D8B/ED0/sprockets%2Fcc585faf0bcbb142f7125444e4fa6a02 +0 -0
  266. data/test/dummy/tmp/cache/assets/D90/440/sprockets%2Fb2aa1e118ce5bd06dee76be633562d42 +0 -0
  267. data/test/dummy/tmp/cache/assets/D91/080/sprockets%2Fbcca522c6302f184f12fe0e8a7d7e71a +0 -0
  268. data/test/dummy/tmp/cache/assets/D94/FD0/sprockets%2F2b120edc1ebea9c0f72d9be11d778390 +0 -0
  269. data/test/dummy/tmp/cache/assets/D95/2B0/sprockets%2F89dbd7378a1d1062e45dcc3df7a3a11c +0 -0
  270. data/test/dummy/tmp/cache/assets/D9C/1C0/sprockets%2F6d2b0db50dd2acf27667a48159c9f6ab +0 -0
  271. data/test/dummy/tmp/cache/assets/D9C/8A0/sprockets%2Fc76d2440ebeb87ab52dfe9d80bf10086 +0 -0
  272. data/test/dummy/tmp/cache/assets/D9D/380/sprockets%2Fb04c1714897d76abeca81fa0a37f8e6b +0 -0
  273. data/test/dummy/tmp/cache/assets/D9D/5B0/sprockets%2Fddcba2ec2b3037ef281e781a486de980 +0 -0
  274. data/test/dummy/tmp/cache/assets/D9F/300/sprockets%2Fc13fc73ceafa45876a901b3e775b83ae +0 -0
  275. data/test/dummy/tmp/cache/assets/DB0/FD0/sprockets%2F996ad98b7351ad4d9bd4b485a7ae9fa3 +0 -0
  276. data/test/dummy/tmp/cache/assets/DB1/8D0/sprockets%2F6cf903e8ff571c4d957e479cac1bc19d +0 -0
  277. data/test/dummy/tmp/cache/assets/DB3/1D0/sprockets%2F22cba3622ce0621f3eba0dd7e1aa089f +0 -0
  278. data/test/dummy/tmp/cache/assets/DB4/0B0/sprockets%2Fe8f58b1269ee313ff8b892bca727ede6 +0 -0
  279. data/test/dummy/tmp/cache/assets/DB6/F30/sprockets%2Fb6999585996e0f4bff328ba3addd17fb +0 -0
  280. data/test/dummy/tmp/cache/assets/DC1/020/sprockets%2Fbf6419ab7cf802a47da9ec4d1040cd4b +0 -0
  281. data/test/dummy/tmp/cache/assets/DC4/040/sprockets%2F0c65ff4bf893dd905d30aa129f4abca2 +0 -0
  282. data/test/dummy/tmp/cache/assets/DCA/030/sprockets%2F0bc7d1ffb47f42b36bc9abec83b58442 +0 -0
  283. data/test/dummy/tmp/cache/assets/DCB/D90/sprockets%2Fcfca0c746a29e28e6507eb312e7ec5bd +0 -0
  284. data/test/dummy/tmp/cache/assets/DCC/EA0/sprockets%2F3c7d9707a1daca88216a8ffc0fa8e4a3 +0 -0
  285. data/test/dummy/tmp/cache/assets/DCE/E00/sprockets%2F5f20b88da0ea9a18a05ee2f4d03f97ff +0 -0
  286. data/test/dummy/tmp/cache/assets/DCE/EC0/sprockets%2Ff2ec34a23c62dd857e1cf1df5966bc3b +0 -0
  287. data/test/dummy/tmp/cache/assets/DD3/E70/sprockets%2F6570fc1bef16b28caa54448c9deffa29 +0 -0
  288. data/test/dummy/tmp/cache/assets/DD7/F60/sprockets%2Fba89e9841faeba02ba74a8ed492f287e +0 -0
  289. data/test/dummy/tmp/cache/assets/DDA/900/sprockets%2F24705bef559fbf6f8738b7ab9b3f0faa +0 -0
  290. data/test/dummy/tmp/cache/assets/DDA/DD0/sprockets%2F74f3d35d3bacb479b95d56d17bafe75f +0 -0
  291. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  292. data/test/dummy/tmp/cache/assets/DDC/9A0/sprockets%2F6b6d65eb6c891e5d6b5c1af73ae98ca6 +0 -0
  293. data/test/dummy/tmp/cache/assets/DDE/9B0/sprockets%2F890f41b9acdd3f93bd6ef7ae908ce472 +0 -0
  294. data/test/dummy/tmp/cache/assets/DE6/210/sprockets%2Fa2d10a00bca3a1e477d6dc95effc35c1 +0 -0
  295. data/test/dummy/tmp/cache/assets/DEE/C90/sprockets%2Ffca14d24400af9ec6deca6ec402953cb +0 -0
  296. data/test/dummy/tmp/cache/assets/DFB/980/sprockets%2F73cd2a8ad913ea8aece63bb39e3b72c6 +0 -0
  297. data/test/dummy/tmp/cache/assets/E03/CF0/sprockets%2Ffd9ccc8eca5b28ea8c175587a1c37cb3 +0 -0
  298. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  299. data/test/dummy/tmp/cache/assets/E07/0F0/sprockets%2F96ac3cc2bdaae9cde264974ef77d2c81 +0 -0
  300. data/test/dummy/tmp/cache/assets/E0F/E90/sprockets%2F8e7db2bac32a0e9cac06b43ab5d242ab +0 -0
  301. data/test/dummy/tmp/cache/assets/E25/820/sprockets%2Fd3b6a937cfa7e45cffc316bae06db5b0 +0 -0
  302. data/test/dummy/tmp/cache/assets/E2D/020/sprockets%2Fcbafddc9ed34b5bb8d1e300c55b488e9 +0 -0
  303. data/test/dummy/tmp/cache/assets/E33/300/sprockets%2Fb751f7e95e5efaedb23aef5b5069bd2c +0 -0
  304. data/test/dummy/tmp/cache/assets/E39/490/sprockets%2Ff0d1f807d9aeda4a98600cb9fe9df7cc +0 -0
  305. data/test/dummy/tmp/cache/assets/E68/D50/sprockets%2Fbb4b566ad8ba5fa7cf5e547cedfe0f95 +0 -0
  306. data/test/dummy/tmp/cache/sass/09ef2509826c8e6328e00a46ab2d431530905427/_base.scssc +0 -0
  307. data/test/dummy/tmp/cache/sass/09ef2509826c8e6328e00a46ab2d431530905427/_sprite-img.scssc +0 -0
  308. data/test/dummy/tmp/cache/sass/18aae862c6b8d844ecb0d28099e3c6dc22a78390/_components.scssc +0 -0
  309. data/test/dummy/tmp/cache/sass/18aae862c6b8d844ecb0d28099e3c6dc22a78390/_config.scssc +0 -0
  310. data/test/dummy/tmp/cache/sass/18aae862c6b8d844ecb0d28099e3c6dc22a78390/_framework.scssc +0 -0
  311. data/test/dummy/tmp/cache/sass/18aae862c6b8d844ecb0d28099e3c6dc22a78390/_structure.scssc +0 -0
  312. data/test/dummy/tmp/cache/sass/18aae862c6b8d844ecb0d28099e3c6dc22a78390/style.scssc +0 -0
  313. data/test/dummy/tmp/cache/sass/230bfc8f182635ad4b3a335d489af9a06274afb8/application.css.scssc +0 -0
  314. data/test/dummy/tmp/cache/sass/2a4cafc997677a5e0158c4d4a79d2ab3f4ff6997/_grid-core.scssc +0 -0
  315. data/test/dummy/tmp/cache/sass/2a4cafc997677a5e0158c4d4a79d2ab3f4ff6997/_grid-helpers.scssc +0 -0
  316. data/test/dummy/tmp/cache/sass/2a4cafc997677a5e0158c4d4a79d2ab3f4ff6997/_mixins.scssc +0 -0
  317. data/test/dummy/tmp/cache/sass/2a4cafc997677a5e0158c4d4a79d2ab3f4ff6997/_normalize.scssc +0 -0
  318. data/test/dummy/tmp/cache/sass/2a4cafc997677a5e0158c4d4a79d2ab3f4ff6997/_print.scssc +0 -0
  319. data/test/dummy/tmp/cache/sass/2fc48581832b599e78863798b316800e2f081db8/_css3.scssc +0 -0
  320. data/test/dummy/tmp/cache/sass/2fc48581832b599e78863798b316800e2f081db8/_support.scssc +0 -0
  321. data/test/dummy/tmp/cache/sass/2fc48581832b599e78863798b316800e2f081db8/_typography.scssc +0 -0
  322. data/test/dummy/tmp/cache/sass/2fc48581832b599e78863798b316800e2f081db8/_utilities.scssc +0 -0
  323. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_appearance.scssc +0 -0
  324. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_background-clip.scssc +0 -0
  325. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_background-origin.scssc +0 -0
  326. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_background-size.scssc +0 -0
  327. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_border-radius.scssc +0 -0
  328. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_box-shadow.scssc +0 -0
  329. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_box-sizing.scssc +0 -0
  330. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_box.scssc +0 -0
  331. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_columns.scssc +0 -0
  332. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_filter.scssc +0 -0
  333. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_font-face.scssc +0 -0
  334. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_hyphenation.scssc +0 -0
  335. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_images.scssc +0 -0
  336. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_inline-block.scssc +0 -0
  337. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_opacity.scssc +0 -0
  338. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_regions.scssc +0 -0
  339. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_shared.scssc +0 -0
  340. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_text-shadow.scssc +0 -0
  341. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_transform.scssc +0 -0
  342. data/test/dummy/tmp/cache/sass/3a054fa2dd9c968492f5a0cb990ea7fe73be8836/_transition.scssc +0 -0
  343. data/test/dummy/tmp/cache/sass/3b11a8de81207d23d358103aa6b295021cc4f559/_contrast.scssc +0 -0
  344. data/test/dummy/tmp/cache/sass/4fafd6ccd5f325d6297db249d1acfce25c894abe/_compass.scssc +0 -0
  345. data/test/dummy/tmp/cache/sass/619a076775683b6e082ab3e83ee70dd4025b71ce/fancybox.cssc +0 -0
  346. data/test/dummy/tmp/cache/sass/6a181fabeabb4ad8135cf2bd3fa15f5039ab85a9/_utilities.scssc +0 -0
  347. data/test/dummy/tmp/cache/sass/6f4451653f8c03db4c183f13952595ad7fc9a7a5/_alternating-rows-and-columns.scssc +0 -0
  348. data/test/dummy/tmp/cache/sass/6f4451653f8c03db4c183f13952595ad7fc9a7a5/_borders.scssc +0 -0
  349. data/test/dummy/tmp/cache/sass/6f4451653f8c03db4c183f13952595ad7fc9a7a5/_scaffolding.scssc +0 -0
  350. data/test/dummy/tmp/cache/sass/6f8312e52a18e9753d5d08c869f5c3bec77f12b3/chosen.css.sassc +0 -0
  351. data/test/dummy/tmp/cache/sass/703c74442f96736be7a09968192044436254f4e2/bootstrap-responsive.scssc +0 -0
  352. data/test/dummy/tmp/cache/sass/703c74442f96736be7a09968192044436254f4e2/bootstrap.scssc +0 -0
  353. data/test/dummy/tmp/cache/sass/731447a6308f18f1769d254075093bb72c24f347/image_animation.css.scssc +0 -0
  354. data/test/dummy/tmp/cache/sass/731447a6308f18f1769d254075093bb72c24f347/images.css.scssc +0 -0
  355. data/test/dummy/tmp/cache/sass/731447a6308f18f1769d254075093bb72c24f347/thisorthat.css.scssc +0 -0
  356. data/test/dummy/tmp/cache/sass/81b75274929b072edf6f16f0144d09b81c0ec6cb/_color.scssc +0 -0
  357. data/test/dummy/tmp/cache/sass/81b75274929b072edf6f16f0144d09b81c0ec6cb/_general.scssc +0 -0
  358. data/test/dummy/tmp/cache/sass/81b75274929b072edf6f16f0144d09b81c0ec6cb/_sprites.scssc +0 -0
  359. data/test/dummy/tmp/cache/sass/81b75274929b072edf6f16f0144d09b81c0ec6cb/_tables.scssc +0 -0
  360. data/test/dummy/tmp/cache/sass/a9ceb8ca2f3605f188194e487b24c01a1853c7e8/_grid-background.scssc +0 -0
  361. data/test/dummy/tmp/cache/sass/d53eea4db5c445904dd2d1926d6eea4bbca119f9/_bullets.scssc +0 -0
  362. data/test/dummy/tmp/cache/sass/d53eea4db5c445904dd2d1926d6eea4bbca119f9/_horizontal-list.scssc +0 -0
  363. data/test/dummy/tmp/cache/sass/d53eea4db5c445904dd2d1926d6eea4bbca119f9/_inline-block-list.scssc +0 -0
  364. data/test/dummy/tmp/cache/sass/d53eea4db5c445904dd2d1926d6eea4bbca119f9/_inline-list.scssc +0 -0
  365. data/test/dummy/tmp/cache/sass/d8b9a6cd27d9e74c47290b0b43e75f4003d5e84b/lentil.css.scssc +0 -0
  366. data/test/dummy/tmp/cache/sass/e8cb3fe0dc661de96e682e25b9bbeaf97d6a8698/_links.scssc +0 -0
  367. data/test/dummy/tmp/cache/sass/e8cb3fe0dc661de96e682e25b9bbeaf97d6a8698/_lists.scssc +0 -0
  368. data/test/dummy/tmp/cache/sass/e8cb3fe0dc661de96e682e25b9bbeaf97d6a8698/_text.scssc +0 -0
  369. data/test/dummy/tmp/cache/sass/e8cb3fe0dc661de96e682e25b9bbeaf97d6a8698/_vertical_rhythm.scssc +0 -0
  370. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_accordion.scssc +0 -0
  371. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_alerts.scssc +0 -0
  372. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_breadcrumbs.scssc +0 -0
  373. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_button-groups.scssc +0 -0
  374. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_buttons.scssc +0 -0
  375. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_carousel.scssc +0 -0
  376. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_close.scssc +0 -0
  377. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_code.scssc +0 -0
  378. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_component-animations.scssc +0 -0
  379. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_dropdowns.scssc +0 -0
  380. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_forms.scssc +0 -0
  381. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_grid.scssc +0 -0
  382. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_hero-unit.scssc +0 -0
  383. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_labels-badges.scssc +0 -0
  384. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_layouts.scssc +0 -0
  385. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_media.scssc +0 -0
  386. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_mixins.scssc +0 -0
  387. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_modals.scssc +0 -0
  388. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_navbar.scssc +0 -0
  389. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_navs.scssc +0 -0
  390. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_pager.scssc +0 -0
  391. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_pagination.scssc +0 -0
  392. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_popovers.scssc +0 -0
  393. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_progress-bars.scssc +0 -0
  394. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_reset.scssc +0 -0
  395. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_responsive-1200px-min.scssc +0 -0
  396. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_responsive-767px-max.scssc +0 -0
  397. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_responsive-768px-979px.scssc +0 -0
  398. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_responsive-navbar.scssc +0 -0
  399. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_responsive-utilities.scssc +0 -0
  400. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_scaffolding.scssc +0 -0
  401. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_sprites.scssc +0 -0
  402. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_tables.scssc +0 -0
  403. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_thumbnails.scssc +0 -0
  404. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_tooltip.scssc +0 -0
  405. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_type.scssc +0 -0
  406. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_utilities.scssc +0 -0
  407. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_variables.scssc +0 -0
  408. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/_wells.scssc +0 -0
  409. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/bootstrap.scssc +0 -0
  410. data/test/dummy/tmp/cache/sass/effeda9621a1f8587c33f3f59e511b0a59ff7bb4/responsive.scssc +0 -0
  411. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_clearfix.scssc +0 -0
  412. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_float.scssc +0 -0
  413. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_hacks.scssc +0 -0
  414. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_min.scssc +0 -0
  415. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_reset.scssc +0 -0
  416. data/test/dummy/tmp/cache/sass/f785cff4f2efc02e3a7a52ccf822a563c511b793/_tag-cloud.scssc +0 -0
  417. data/test/dummy/tmp/cache/sass/fbf85d5608ca3ac95eb64dfaa76546b623980b5f/_hover-link.scssc +0 -0
  418. data/test/dummy/tmp/cache/sass/fbf85d5608ca3ac95eb64dfaa76546b623980b5f/_link-colors.scssc +0 -0
  419. data/test/dummy/tmp/cache/sass/fbf85d5608ca3ac95eb64dfaa76546b623980b5f/_unstyled-link.scssc +0 -0
  420. data/test/dummy/tmp/cache/sass/fcfbf62c4a5c26b3ae30accefa73ef6191bb4aab/_ellipsis.scssc +0 -0
  421. data/test/dummy/tmp/cache/sass/fcfbf62c4a5c26b3ae30accefa73ef6191bb4aab/_force-wrap.scssc +0 -0
  422. data/test/dummy/tmp/cache/sass/fcfbf62c4a5c26b3ae30accefa73ef6191bb4aab/_nowrap.scssc +0 -0
  423. data/test/dummy/tmp/cache/sass/fcfbf62c4a5c26b3ae30accefa73ef6191bb4aab/_replacement.scssc +0 -0
  424. data/test/fixtures/lentil/admin_users.yml +35 -0
  425. data/test/fixtures/lentil/battles.yml +20 -0
  426. data/test/fixtures/lentil/flags.yml +17 -0
  427. data/test/fixtures/lentil/images.yml +284 -0
  428. data/test/fixtures/lentil/licenses.yml +25 -0
  429. data/test/fixtures/lentil/licensings.yml +20 -0
  430. data/test/fixtures/lentil/like_votes.yml +19 -0
  431. data/test/fixtures/lentil/services.yml +20 -0
  432. data/test/fixtures/lentil/taggings.yml +29 -0
  433. data/test/fixtures/lentil/tags.yml +29 -0
  434. data/test/fixtures/lentil/tagset_assignments.yml +28 -0
  435. data/test/fixtures/lentil/tagsets.yml +27 -0
  436. data/test/fixtures/lentil/users.yml +40 -0
  437. data/test/functional/admin/flags_controller_test.rb +16 -0
  438. data/test/functional/admin/images_controller_test.rb +46 -0
  439. data/test/functional/admin/tags_controller_test.rb +16 -0
  440. data/test/functional/admin/tagsets_controller_test.rb +21 -0
  441. data/test/functional/admin/users_controller_test.rb +16 -0
  442. data/test/functional/lentil/flags_controller_test.rb +19 -0
  443. data/test/functional/lentil/images_controller_test.rb +51 -0
  444. data/test/functional/lentil/like_votes_controller_test.rb +19 -0
  445. data/test/functional/lentil/photographers_controller_test.rb +14 -0
  446. data/test/functional/lentil/thisorthat_controller_test.rb +9 -0
  447. data/test/integration/lentil/admin_dashboard_test.rb +31 -0
  448. data/test/integration/lentil/admin_moderation_test.rb +9 -0
  449. data/test/integration/lentil/admin_tagset_test.rb +14 -0
  450. data/test/integration/lentil/images_feed_test.rb +14 -0
  451. data/test/integration/lentil/images_index_test.rb +46 -0
  452. data/test/integration/lentil/images_show_test.rb +14 -0
  453. data/test/integration/lentil/javascript/event_tracking_battle_test.rb +18 -0
  454. data/test/integration/lentil/javascript/event_tracking_test.rb +67 -0
  455. data/test/integration/lentil/javascript/image_modal_test.rb +20 -0
  456. data/test/integration/lentil/navigation_test.rb +10 -0
  457. data/test/integration/lentil/pages_test.rb +11 -0
  458. data/test/integration/lentil/thisorthat_test.rb +33 -0
  459. data/test/lentil_test.rb +7 -0
  460. data/test/test_helper.rb +79 -0
  461. data/test/unit/lentil/admin_user_test.rb +26 -0
  462. data/test/unit/lentil/battle_test.rb +18 -0
  463. data/test/unit/lentil/flag_test.rb +17 -0
  464. data/test/unit/lentil/helpers/images_helper_test.rb +4 -0
  465. data/test/unit/lentil/helpers/photographers_helper_test.rb +4 -0
  466. data/test/unit/lentil/helpers/thisorthat_helper_test.rb +4 -0
  467. data/test/unit/lentil/image_test.rb +52 -0
  468. data/test/unit/lentil/instagram_test.rb +57 -0
  469. data/test/unit/lentil/license_test.rb +20 -0
  470. data/test/unit/lentil/licensing_test.rb +18 -0
  471. data/test/unit/lentil/like_vote_test.rb +17 -0
  472. data/test/unit/lentil/popularity_test.rb +19 -0
  473. data/test/unit/lentil/service_test.rb +18 -0
  474. data/test/unit/lentil/tag_test.rb +21 -0
  475. data/test/unit/lentil/tagging_test.rb +19 -0
  476. data/test/unit/lentil/tagset_assignment_test.rb +18 -0
  477. data/test/unit/lentil/tagset_test.rb +22 -0
  478. data/test/unit/lentil/user_test.rb +37 -0
  479. data/test/vcr_cassettes/battle_images.yml +245 -0
  480. data/test/vcr_cassettes/battle_images_events.yml +206 -0
  481. data/test/vcr_cassettes/instagram_bad_image_check.yml +40 -0
  482. data/test/vcr_cassettes/instagram_by_tag.yml +318 -0
  483. data/test/vcr_cassettes/instagram_good_image_check.yml +42 -0
  484. data/test/vcr_cassettes/instagram_image_harvest.yml +1992 -0
  485. data/test/vcr_cassettes/instagram_image_id.yml +97 -0
  486. data/test/vcr_cassettes/instagram_oembed.yml +43 -0
  487. data/vendor/assets/javascripts/animatedimages/css/demo.css +178 -0
  488. data/vendor/assets/javascripts/animatedimages/css/fallback.css +12 -0
  489. data/vendor/assets/javascripts/animatedimages/css/style.css +132 -0
  490. data/vendor/assets/javascripts/animatedimages/images/Thumbs.db +0 -0
  491. data/vendor/assets/javascripts/animatedimages/images/bg.jpg +0 -0
  492. data/vendor/assets/javascripts/animatedimages/images/light.png +0 -0
  493. data/vendor/assets/javascripts/animatedimages/images/loading.gif +0 -0
  494. data/vendor/assets/javascripts/animatedimages/js/jquery.gridrotator.js +760 -0
  495. data/vendor/assets/javascripts/animatedimages/js/modernizr.custom.26633.js +4 -0
  496. data/vendor/assets/javascripts/expanding/expanding.js +118 -0
  497. data/vendor/assets/javascripts/html5historyapi/README.md +338 -0
  498. data/vendor/assets/javascripts/html5historyapi/component.json +8 -0
  499. data/vendor/assets/javascripts/html5historyapi/history.iegte8.js +721 -0
  500. data/vendor/assets/javascripts/html5historyapi/history.iegte8.min.js +30 -0
  501. data/vendor/assets/javascripts/html5historyapi/history.js +890 -0
  502. data/vendor/assets/javascripts/html5historyapi/history.min.js +33 -0
  503. data/vendor/assets/javascripts/html5historyapi/readme.en.txt +161 -0
  504. data/vendor/assets/javascripts/html5historyapi/readme.ru.txt +161 -0
  505. data/vendor/assets/javascripts/imagesloaded/jquery.imagesloaded.min.js +3 -0
  506. data/vendor/assets/javascripts/infinitescroll/Readme.md +59 -0
  507. data/vendor/assets/javascripts/infinitescroll/ajax-loader.gif +0 -0
  508. data/vendor/assets/javascripts/infinitescroll/behaviors/cufon.js +21 -0
  509. data/vendor/assets/javascripts/infinitescroll/behaviors/local.js +26 -0
  510. data/vendor/assets/javascripts/infinitescroll/behaviors/manual-trigger.js +59 -0
  511. data/vendor/assets/javascripts/infinitescroll/behaviors/masonry-isotope.js +21 -0
  512. data/vendor/assets/javascripts/infinitescroll/behaviors/sausage.js +19 -0
  513. data/vendor/assets/javascripts/infinitescroll/jquery.infinitescroll.js +802 -0
  514. data/vendor/assets/javascripts/infinitescroll/package.json +7 -0
  515. data/vendor/assets/javascripts/infinitescroll/site/assets/anivers_regular.otf +0 -0
  516. data/vendor/assets/javascripts/infinitescroll/site/assets/buttons.psd +0 -0
  517. data/vendor/assets/javascripts/infinitescroll/site/assets/logo.psd +0 -0
  518. data/vendor/assets/javascripts/infinitescroll/site/assets/mobius-strip2.ai +2266 -15
  519. data/vendor/assets/javascripts/infinitescroll/site/assets/pattern.psd +0 -0
  520. data/vendor/assets/javascripts/infinitescroll/site/assets/selector spots.psd +0 -0
  521. data/vendor/assets/javascripts/infinitescroll/site/assets/sites.psd +0 -0
  522. data/vendor/assets/javascripts/infinitescroll/site/buttons.png +0 -0
  523. data/vendor/assets/javascripts/infinitescroll/site/infinite-scroll-pattern.gif +0 -0
  524. data/vendor/assets/javascripts/infinitescroll/site/logo.jpg +0 -0
  525. data/vendor/assets/javascripts/infinitescroll/site/screens.jpg +0 -0
  526. data/vendor/assets/javascripts/infinitescroll/site/selectors.jpg +0 -0
  527. data/vendor/assets/javascripts/infinitescroll/test/debug.js +24 -0
  528. data/vendor/assets/javascripts/infinitescroll/test/index.html +105 -0
  529. data/vendor/assets/javascripts/infinitescroll/test/index2.html +41 -0
  530. data/vendor/assets/javascripts/infinitescroll/test/index3.html +48 -0
  531. data/vendor/assets/javascripts/infinitescroll/test/jquery-1.6.1.js +8936 -0
  532. data/vendor/assets/javascripts/infinitescroll/test/mobile.html +108 -0
  533. data/vendor/assets/javascripts/infinitescroll/test/mobile2.json +1 -0
  534. data/vendor/assets/javascripts/infinitescroll/test/mobile3.json +1 -0
  535. data/vendor/assets/javascripts/infinitescroll/test/mobile4.json +1 -0
  536. data/vendor/assets/javascripts/infinitescroll/test/style.css +319 -0
  537. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/img/ajax-loader.gif +0 -0
  538. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/includes/admin.php +126 -0
  539. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/includes/options.php +188 -0
  540. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/includes/presets.php +737 -0
  541. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/includes/submit.php +67 -0
  542. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/infinite-scroll.php +261 -0
  543. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/js/admin/infinite-scoll.js +5 -0
  544. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/js/admin/infinite-scroll.dev.js +128 -0
  545. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/js/front-end/jquery.infinitescroll.dev.js +747 -0
  546. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/js/front-end/jquery.infinitescroll.js +31 -0
  547. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/languages/infinite-scroll.pot +157 -0
  548. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/license.html +694 -0
  549. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/readme.md +246 -0
  550. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/readme.txt +241 -0
  551. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/screenshot-1.png +0 -0
  552. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/screenshot-2.png +0 -0
  553. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/screenshot-3.png +0 -0
  554. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/footer.php +7 -0
  555. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/manage-presets.php +21 -0
  556. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/options.php +97 -0
  557. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/preset-prompt.php +7 -0
  558. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/submit-prompt.php +23 -0
  559. data/vendor/assets/javascripts/infinitescroll/wordpress-plugin/templates/submit.php +31 -0
  560. data/vendor/assets/javascripts/spin/spin.js +2 -0
  561. data/vendor/assets/javascripts/touchswipe/README.md +84 -0
  562. data/vendor/assets/javascripts/touchswipe/jquery.touchSwipe.js +1555 -0
  563. metadata +1397 -0
@@ -0,0 +1,188 @@
1
+ <?php
2
+ /**
3
+ * Provides interface to store and retrieve plugin and user options
4
+ * @subpackage Infinite_Scroll_Options
5
+ * @package Infinite_Scroll
6
+ */
7
+ class Infinite_Scroll_Options {
8
+
9
+ //default scope for options when called directly,
10
+ //choices: site, user, or global (user option across sites)
11
+ public $defaults = array();
12
+ private $parent;
13
+
14
+ /**
15
+ * Stores parent class as static
16
+ * @param class $parent (reference) the parent class
17
+ */
18
+ function __construct( &$parent ) {
19
+
20
+ $this->parent = &$parent;
21
+
22
+ add_action( 'admin_init', array( &$this, 'options_init' ) );
23
+ add_filter( $this->parent->prefix . 'options', array( &$this, 'default_options_filter' ), 20 );
24
+ add_filter( $this->parent->prefix . 'js_options', array( &$this, 'db_version_filter' ) );
25
+
26
+ }
27
+
28
+
29
+ /**
30
+ * Tells WP that we're using a custom settings field
31
+ */
32
+ function options_init() {
33
+
34
+ register_setting( $this->parent->slug_, $this->parent->slug_, array( &$this, 'validate' ) );
35
+
36
+ }
37
+
38
+
39
+ /**
40
+ * Runs options through filter prior to saving
41
+ * @param array $options the options array
42
+ * @return array sanitized options array
43
+ */
44
+ function validate( $options ) {
45
+
46
+ //add slashes to JS selectors
47
+ $js = array ( 'nextSelector', 'navSelector', 'itemSelector', 'contentSelector', 'callback' );
48
+ foreach ( $js as $field ) {
49
+
50
+ if ( !isset( $options[$field] ) )
51
+ continue;
52
+
53
+ $options[$field] = addslashes( $options[ $field ] );
54
+
55
+ }
56
+
57
+ //force post-style kses on messages
58
+ foreach ( array( 'finishedMsg', 'msgText' ) as $field ) {
59
+
60
+ if ( !isset( $options['loading'][$field] ) )
61
+ continue;
62
+
63
+ $options['loading'][$field] = wp_filter_post_kses( $options['loading'][$field] );
64
+
65
+ }
66
+
67
+ //handle image resets
68
+ if ( isset( $_POST[ 'reset_default_image'] ) )
69
+ $options['img'] = $this->defaults['img'];
70
+
71
+ //pull existing image if none is given
72
+ if ( empty( $options['img'] ) )
73
+ $options['img'] = $this->img;
74
+
75
+ return apply_filters( $this->parent->prefix . 'options_validate', $options );
76
+
77
+ }
78
+
79
+
80
+ /**
81
+ * Allows overloading to get option value
82
+ * Usage: $value = $object->{option name}
83
+ * @param string $name the option name
84
+ * @return mixed the option value
85
+ */
86
+ function __get( $name ) {
87
+
88
+ return $this->get_option( $name );
89
+
90
+ }
91
+
92
+
93
+ /**
94
+ * Allows overloading to set option value
95
+ * Usage: $object->{option name} = $value
96
+ * @param string $name unique option key
97
+ * @param mixed $value the value to store
98
+ * @return bool success/fail
99
+ */
100
+ function __set( $name, $value ) {
101
+
102
+ return $this->set_option( $name, $value );
103
+
104
+ }
105
+
106
+
107
+ /**
108
+ * Retreive the options array
109
+ * @return array the options
110
+ */
111
+ function get_options( ) {
112
+
113
+ if ( !$options = wp_cache_get( 'options', $this->parent->slug ) ) {
114
+ $options = get_option( $this->parent->slug_ );
115
+ wp_cache_set( 'options', $options, $this->parent->slug );
116
+ }
117
+
118
+ return apply_filters( $this->parent->prefix . 'options', $options );
119
+
120
+ }
121
+
122
+
123
+ /**
124
+ * If any options are not set, merge with defaults
125
+ * @param array $options the saved options
126
+ * @return array the merged options with defaults
127
+ */
128
+ function default_options_filter( $options ) {
129
+
130
+ $options = wp_parse_args( $options, $this->defaults );
131
+ wp_cache_set( 'options', $options, $this->parent->slug );
132
+ return $options;
133
+
134
+ }
135
+
136
+
137
+ /**
138
+ * Retreives a specific option
139
+ * @param string $option the unique option key
140
+ * @return mixed the value
141
+ */
142
+ function get_option( $option ) {
143
+ $options = $this->get_options( );
144
+ $value = ( isset( $options[ $option ] ) ) ? $options[ $option ] : false;
145
+ return apply_filters( $this->parent->prefix . $option, $value );
146
+ }
147
+
148
+
149
+ /**
150
+ * Sets a specific option
151
+ * @return bool success/fail
152
+ * @param string $key the unique option key
153
+ * @param mixed $value the value
154
+ */
155
+ function set_option( $key, $value ) {
156
+ $options = array( $key => $value );
157
+ $this->set_options( $options );
158
+ }
159
+
160
+
161
+ /**
162
+ * Sets all plugin options
163
+ * @param array $options the options array
164
+ * @param bool $merge (optional) whether or not to merge options arrays or overwrite
165
+ * @return bool success/fail
166
+ */
167
+ function set_options( $options, $merge = true ) {
168
+
169
+ if ( $merge ) {
170
+ $defaults = $this->get_options();
171
+ $options = wp_parse_args( $options, $defaults );
172
+ }
173
+
174
+ wp_cache_set( 'options', $options, $this->parent->slug );
175
+
176
+ return update_option( $this->parent->slug_, $options );
177
+
178
+ }
179
+
180
+ /**
181
+ * Don't output db_version to front end when passing args to javascript function
182
+ */
183
+ function db_version_filter( $options ) {
184
+ unset( $options['db_version'] );
185
+ return $options;
186
+ }
187
+
188
+ }
@@ -0,0 +1,737 @@
1
+ <?php
2
+ /**
3
+ * Infinite Scroll Presets Interface
4
+ *
5
+ * Stores theme-specific presets for CSS Selectors to aid with setup. Pulls community presets from CSV
6
+ * stored in the plugin's SVN repo.
7
+ *
8
+ * The csv from the repo is cached for 24 hours as a site-transient (available to all sites on a network install)
9
+ *
10
+ * Custom presets (beyond the SVN CSV) are stored as a site option (also available to all sites on network)
11
+ *
12
+ * On a single site install, settings available to all admins.
13
+ * On a network install, settings available only to super-admins (but site-admins can load those presets)
14
+ *
15
+ * If a user hasn't chosen CSS selectors for there theme and a preset exists, the plugin will
16
+ * default to the preset (thus in many cases, no need to adjust any settings or know this exists).
17
+ *
18
+ * Hierarchy of presets: 1) User specified, 2) (admin specified) custom preset, 3) community specified preset
19
+ *
20
+ * @subpackage Presets
21
+ * @package Infinite_Scroll
22
+ */
23
+
24
+ class Infinite_Scroll_Presets {
25
+
26
+ private $parent;
27
+ // public $preset_url = 'http://plugins.svn.wordpress.org/infinite-scroll/branches/PresetDB/presets.csv';
28
+ public $preset_url = 'https://raw.github.com/benbalter/Infinite-Scroll/presetDB/presets.csv';
29
+ public $custom_preset_key = 'infinite_scroll_presets';
30
+ public $ttl = 86000; //TTL of transient cache in seconds, 1 day = 86400 = 60*60*24
31
+ public $keys = array( 'theme', 'contentSelector', 'navSelector', 'itemSelector', 'nextSelector' );
32
+
33
+ /**
34
+ * Register hooks with WordPress API
35
+ *
36
+ * @param object $parent (reference) the parent class
37
+ */
38
+ function __construct( &$parent ) {
39
+
40
+ $this->parent = &$parent;
41
+
42
+ add_action( 'admin_init', array( &$this, 'set_presets' ) );
43
+ add_action( 'wp_ajax_infinite-scroll-edit-preset', array( &$this, 'process_ajax_edit' ) );
44
+ add_action( 'wp_ajax_infinite-scroll-delete-preset', array( &$this, 'process_ajax_delete' ) );
45
+ add_filter( $this->parent->prefix . 'presets', array( &$this, 'merge_custom_presets' ) );
46
+ add_filter( $this->parent->prefix . 'options', array( &$this, 'default_to_presets'), 9 );
47
+ add_action( $this->parent->prefix . 'refresh_cache', array( &$this, 'get_presets' ) );
48
+
49
+ }
50
+
51
+
52
+ /**
53
+ * Allow for class overloading
54
+ * @param string $preset the theme slug to retrieve
55
+ * @return array|bool the presets or false on failure
56
+ */
57
+ function __get( $preset ) {
58
+ return $this->get_preset( $preset );
59
+ }
60
+
61
+
62
+ /**
63
+ * Pulls preset array from cache, or retrieves and parses
64
+ * @return array an array of preset objects
65
+ * @todo Consider using TLC Transients in case cron isn't working
66
+ */
67
+ function get_presets() {
68
+
69
+ //check cache
70
+ if ( $cache = get_transient( $this->parent->prefix . 'presets' ) )
71
+ return apply_filters( $this->parent->prefix . 'presets', $cache );
72
+
73
+ $data = wp_remote_get( $this->preset_url );
74
+
75
+ if ( is_wp_error( $data ) )
76
+ return array();
77
+
78
+ $data = wp_remote_retrieve_body( $data );
79
+
80
+ //parse CSV string into array
81
+ $presets = $this->parse_csv( $data );
82
+
83
+ //sort by key alpha ascending
84
+ asort( $presets );
85
+
86
+ set_transient( $this->parent->prefix . 'presets', $presets, $this->ttl );
87
+
88
+ return apply_filters( $this->parent->prefix . 'presets', $presets );
89
+
90
+ }
91
+
92
+
93
+ /**
94
+ * Return a theme's preset object
95
+ * @param string $theme the slug of theme to retrieve
96
+ * @return object the preset object
97
+ */
98
+ function get_preset( $theme = null ) {
99
+
100
+ if ( $theme == null )
101
+ $theme = get_stylesheet();
102
+
103
+ $presets = $this->get_presets();
104
+
105
+ //direct match found, return
106
+ if ( array_key_exists( $theme, $presets ) )
107
+ return $presets[ $theme ];
108
+
109
+ //no direct match found, permahps this is a child theme?
110
+
111
+ //theme isn't installed, no way to know if it's a child, so skip
112
+ if ( !$this->theme_installed( $theme ) )
113
+ return false;
114
+
115
+ //WP version 3.4+, use the new wp_get_themes function
116
+ if ( function_exists( 'wp_get_theme' ) ) {
117
+
118
+ $theme = wp_get_theme( $theme );
119
+
120
+ //not a theme or not a child
121
+ if ( is_wp_error( $theme ) || !is_object( $theme->parent() ) )
122
+ return false;
123
+
124
+ return $this->get_preset( $theme->parent()->stylesheet );
125
+
126
+ }
127
+
128
+ //pre 3.4 back compat..
129
+ //get theme by slug
130
+ $name = $this->get_name( $theme );
131
+ $themes = get_themes();
132
+ $child = $themes[ $name ];
133
+
134
+ //not a child theme
135
+ if ( !isset( $child['Template'] ) || empty( $child['Template'] ) || $child['Template'] == $child['Stylesheet'] )
136
+ return false;
137
+
138
+ //pull up parent data to get its name
139
+ $parent = $themes[$name]['Template'];
140
+ $parent = get_theme_data( get_theme_root( $child['Template'] ) . '/' . $child['Template'] . '/style.css' );
141
+ $preset = $this->get_preset( $parent['Stylesheet'] );
142
+
143
+ //no parent preset
144
+ if ( !$preset )
145
+ return false;
146
+
147
+ //rename the theme of the parent preset object for consistent return
148
+ $preset->theme = $theme;
149
+ $preset->parentPreset = $parent['Stylesheet'];
150
+
151
+ return $preset;
152
+
153
+ }
154
+
155
+ /**
156
+ * On plugin activation register with WP_Cron API to asynchronously refresh cache every 24 hours
157
+ * This will also asynchronously prime the cache on activation
158
+ */
159
+ function schedule() {
160
+ wp_schedule_event( time(), 'daily', $this->parent->prefix . 'refresh_cache' );
161
+ }
162
+
163
+
164
+ /**
165
+ * Clear chron schedule on deactivation
166
+ */
167
+ function unschedule() {
168
+ wp_clear_scheduled_hook( $this->parent->prefix . 'refresh_cache' );
169
+ }
170
+
171
+
172
+ /**
173
+ * Conditionally prompts users on options page to use the default selectors
174
+ * @uses get_preset
175
+ */
176
+ function preset_prompt() {
177
+
178
+ $preset = $this->get_preset( );
179
+
180
+ if ( !$preset )
181
+ return;
182
+
183
+ unset( $preset->theme );
184
+ unset( $preset->parentPreset );
185
+
186
+ //if they are already using the preset, don't prompt
187
+ $using_default = true;
188
+ foreach ( $preset as $key => $value ) {
189
+
190
+ if ( $this->parent->options->$key != $value )
191
+ $using_default = false;
192
+
193
+ }
194
+
195
+ if ( $using_default )
196
+ return;
197
+
198
+ require dirname( $this->parent->file ) . '/templates/preset-prompt.php';
199
+
200
+ }
201
+
202
+
203
+ /**
204
+ * Reset selectors to default
205
+ */
206
+ function set_presets() {
207
+
208
+ if ( !isset( $_GET['set_presets'] ) )
209
+ return;
210
+
211
+ if ( !current_user_can( 'manage_options' ) )
212
+ return;
213
+
214
+ check_admin_referer( 'infinite-scroll-presets', 'nonce' );
215
+
216
+ //don't delete options if we don't have a preset
217
+ $preset = $this->get_preset( );
218
+
219
+ if ( !$preset )
220
+ return;
221
+
222
+ foreach ( $this->keys as $key )
223
+ $this->parent->options->$key = null;
224
+
225
+ wp_redirect( admin_url( 'options-general.php?page=infinite_scroll_options&settings-updated=true' ) );
226
+ exit();
227
+
228
+ }
229
+
230
+
231
+ /**
232
+ * Handles AJAX edits from the manage presets form
233
+ */
234
+ function process_ajax_edit() {
235
+
236
+ if ( !current_user_can( 'manage_options' ) )
237
+ wp_die( -1 );
238
+
239
+ if ( is_multisite() && !is_super_admin() )
240
+ wp_die( -1 );
241
+
242
+ $data = new stdClass;
243
+
244
+ foreach ( $this->keys as $key )
245
+ $data->$key = addslashes( trim( $_POST[ $key . '_column-' . $key ] ) );
246
+
247
+ $this->set_custom_preset( $data->theme, $data );
248
+
249
+ wp_die( 1 );
250
+
251
+ }
252
+
253
+
254
+ /**
255
+ * Handles AJAX requests to delete presets from the manage presets form
256
+ */
257
+ function process_ajax_delete() {
258
+
259
+ if ( !current_user_can( 'manage_options' ) )
260
+ wp_die( -1 );
261
+
262
+ if ( is_multisite() && !is_super_admin() )
263
+ wp_die( -1 );
264
+
265
+ if ( !isset( $_GET['theme'] ) )
266
+ wp_die( -1 );
267
+
268
+ $this->delete_custom_preset( $_GET['theme'] );
269
+
270
+ }
271
+
272
+
273
+ /**
274
+ * Retreive global custom presets
275
+ * @return array the custom preset array
276
+ */
277
+ function get_custom_presets( ) {
278
+ $presets = get_site_option( $this->custom_preset_key, array(), true );
279
+ return apply_filters( $this->parent->prefix . 'custom_presets', $presets );
280
+ }
281
+
282
+
283
+ /**
284
+ * Update global custom presets
285
+ * @param array $presets the presets (all)
286
+ * @return bool success/fail
287
+ */
288
+ function set_custom_presets( $presets ) {
289
+ return update_site_option( $this->custom_preset_key, $presets );
290
+ }
291
+
292
+
293
+ /**
294
+ * Store a theme's global presets
295
+ * @param string $theme the theme name
296
+ * @param array $preset the presets
297
+ * @return bool success/fail
298
+ */
299
+ function set_custom_preset( $theme, $preset ) {
300
+ $presets = $this->get_custom_presets();
301
+ $presets[ $theme ] = $preset;
302
+ return $this->set_custom_presets( $presets );
303
+ }
304
+
305
+
306
+ /**
307
+ * Removes a custom preset from the database
308
+ * @param string $theme the theme to remove
309
+ * @return bool success/fail
310
+ */
311
+ function delete_custom_preset( $theme ) {
312
+ $presets = $this->get_custom_presets();
313
+ unset( $presets[ $theme ] );
314
+ return $this->set_custom_presets( $presets );
315
+
316
+ }
317
+
318
+
319
+ /**
320
+ * Allow custom presets to merge/override community presets
321
+ * @param unknown $presets
322
+ * @return unknown
323
+ */
324
+ function merge_custom_presets( $presets ) {
325
+
326
+ // 2nd array overrides keys that overlap with first array
327
+ $presets = array_merge( $presets, $this->get_custom_presets() );
328
+
329
+ //sort by key alpha ascending
330
+ asort( $presets );
331
+
332
+ return $presets;
333
+
334
+ }
335
+
336
+
337
+ /**
338
+ * If a selector is not set, try to grab a preset to save the user trouble
339
+ * @param array $options the options array
340
+ * @return array the defaulted options array
341
+ */
342
+ function default_to_presets( $options ) {
343
+
344
+ //we don't have a preset, no need to go any further
345
+ if ( !( $preset = $this->get_preset( ) ) )
346
+ return $options;
347
+
348
+ foreach ( $this->keys as $key ) {
349
+ if ( empty( $options[$key] ) )
350
+ $options[$key] = $preset->$key;
351
+ }
352
+
353
+ return $options;
354
+
355
+
356
+ }
357
+ /**
358
+ * Converts legacy csv.php format
359
+ * Removes first two lines and last line
360
+ * @param string $data the contents of the CSV (usually via wp_remote_get)
361
+ * @param string the equivalent standard CSV
362
+ */
363
+ function parse_legacy_csv( $data ) {
364
+
365
+ if ( is_string( $data ) )
366
+ $data = explode( "\n", $data );
367
+
368
+ //remove first two lines
369
+ $data = array_slice( $data, 2 );
370
+
371
+ //remove the last line
372
+ array_pop( $data );
373
+
374
+ $presets = $this->parse_csv( $data );
375
+
376
+ $output = array();
377
+
378
+ //convert Theme Name to stylesheet and stuff into output array
379
+ foreach( $presets as $theme ) {
380
+ $theme->theme = $this->get_stylesheet( $theme->theme );
381
+ $output[ $theme->theme ] = $theme;
382
+ }
383
+
384
+ return $output;
385
+
386
+ }
387
+
388
+ /**
389
+ * Parse CSV into array of preset objects
390
+ * @param string|array the CSV data, either as a string or as an array of lines
391
+ * @return array array of preset objects
392
+ */
393
+ function parse_csv( $data ) {
394
+
395
+ if ( is_string( $data ) )
396
+ $data = explode( "\n", $data );
397
+
398
+ //php 5.3+
399
+ if ( function_exists( 'str_getcsv' ) ) {
400
+
401
+ foreach ( $data as &$line )
402
+ $line = str_getcsv( $line );
403
+
404
+ //php 5.2
405
+ // fgetcsv needs a file handle,
406
+ // so write the string to a temp file before parsing
407
+ } else {
408
+
409
+ $fh = tmpfile();
410
+ fwrite( $fh, implode( "\n", $data ) );
411
+ fseek( $fh, 0 );
412
+ $data = array();
413
+
414
+ while( $line = fgetcsv( $fh ) )
415
+ $data[] = $line;
416
+
417
+ fclose( $fh );
418
+
419
+ }
420
+
421
+ $presets = array();
422
+
423
+ //build preset objects and stuff into keyed array
424
+ foreach ( $data as &$line ) {
425
+
426
+ $lineObj = new stdClass;
427
+
428
+ foreach ( $this->keys as $id => $key )
429
+ $lineObj->$key = $line[ $id ];
430
+
431
+ $presets[ $lineObj->theme ] = $lineObj;
432
+
433
+ }
434
+
435
+ return $presets;
436
+
437
+ }
438
+
439
+ /**
440
+ * Return object representing current theme's selectors
441
+ * @return object the same as would be returned from get_preset()
442
+ */
443
+ function current_selectors() {
444
+
445
+ $theme = new stdClass();
446
+ foreach ( $this->keys as $key )
447
+ $theme->$key = $this->parent->options->$key;
448
+
449
+ $theme->theme = get_stylesheet();
450
+
451
+ return $theme;
452
+
453
+ }
454
+
455
+ /**
456
+ * Export CSS Selectors as CSV
457
+ * @param bool $all (optional) whether to include community selectors in output
458
+ * @return string CSV of selectors
459
+ */
460
+ function export( $all = false ) {
461
+
462
+ $presets = array();
463
+
464
+ //if the current theme is not a known preset or they want all
465
+ if ( !$this->get_preset( ) || $all )
466
+ $presets[ get_stylesheet() ] = $this->current_selectors();
467
+
468
+ //user has access to global custom presets
469
+ if ( is_multisite() && is_super_admin() ) {
470
+
471
+ if ( $custom = $this->get_custom_presets() );
472
+ $presets = array_merge( $presets, $custom );
473
+
474
+ }
475
+
476
+ //include community presets, if asked
477
+ if ( $all )
478
+ $presets = array_merge( $this->get_presets(), $presets );
479
+
480
+ asort( $presets );
481
+
482
+ //workaround because fputcsv needs a file handle by default
483
+ $fh = tmpfile();
484
+ $length = 0;
485
+
486
+ foreach ( $presets as &$preset )
487
+ $length += fputcsv( $fh, (array) $preset );
488
+
489
+ if ( $length == 0 )
490
+ return false;
491
+
492
+ fseek( $fh, 0 );
493
+ $csv = fread( $fh, $length );
494
+ fclose( $fh );
495
+
496
+ return $csv;
497
+
498
+ }
499
+
500
+ /**
501
+ * Migrates legacy csv.php files to 2.5's custom presets format
502
+ * @uses parse_legacy_csv
503
+ */
504
+ function migrate() {
505
+
506
+ //no preset file to migrate
507
+ if ( !file_exists( dirname( $this->parent->file ) . '/PresetDB.csv.php' ) )
508
+ return;
509
+
510
+ $data = file_get_contents( dirname( $this->parent->file ) . '/PresetDB.csv.php' );
511
+ $presets = $this->parse_legacy_csv( $data );
512
+
513
+ //this wiill override any existing presets,
514
+ // but is okay as is only being fired when no presets exist
515
+ $this->set_custom_presets( $presets );
516
+
517
+ return $presets;
518
+
519
+ }
520
+
521
+ /**
522
+ * Determines whether a given theme is installed
523
+ * @param string|object $theme either the theme slug or the preset object
524
+ * @return bool true if insalled, otherwise false
525
+ */
526
+ function theme_installed( $theme ) {
527
+
528
+ //3.4+
529
+ if ( function_exists( 'wp_get_theme' ) )
530
+ return ( wp_get_theme( $theme ) ) ? true : false;
531
+
532
+ //pre 3.4
533
+ $themes = get_themes();
534
+ $name = $this->get_name( $theme );
535
+
536
+ return array_key_exists( $name, $themes );
537
+
538
+ }
539
+
540
+ /**
541
+ * Given a theme name, returns the coresponding theme stylesheet
542
+ *
543
+ * Used for converting legacy CSVs which were name based to new CSVs which are stylesheet based
544
+ * since 3.4 returns themes keyed to stylesheets, not names as it did pre-3.4
545
+ *
546
+ * @param string $theme the theme name
547
+ * @return string the stylesheet
548
+ */
549
+ function get_stylesheet( $name ) {
550
+
551
+ //pre 3.4
552
+ if ( !function_exists( 'wp_get_themes' ) ) {
553
+
554
+ if ( $theme = get_theme( $name ) )
555
+ return $theme->stylesheet;
556
+
557
+ //3.4+
558
+ } else {
559
+
560
+ //we can't use wp_filter_list_object with WP_Theme objects, so filter manually
561
+ foreach ( wp_get_themes() as $theme )
562
+ if ( $theme->name = $name )
563
+ return $theme->stylesheet;
564
+
565
+ }
566
+
567
+ return false;
568
+
569
+ }
570
+
571
+ /**
572
+ * Given a theme stylesheet, return the coresponding theme name
573
+ *
574
+ * Used to normalize data between 3.3 and 3.4 where keying of themes switched from name to stylesheet
575
+ *
576
+ * @param string $stylesheet the theme stylesheet (slug)
577
+ * @return string the theme name
578
+ */
579
+ function get_name( $stylesheet ) {
580
+
581
+ //3.4+
582
+ if ( function_exists( 'wp_get_theme' ) ) {
583
+
584
+ if ( $theme = wp_get_theme( $stylesheet ) )
585
+ return $theme->name;
586
+
587
+
588
+ //pre 3.4
589
+ } else {
590
+
591
+ foreach ( get_themes as $theme )
592
+ if ( $theme->stylesheet == $stylesheet )
593
+ return $theme->name;
594
+
595
+ }
596
+
597
+ //theme isn't installed, use the WP.org API to grab the name rather than risk losing data on upgrade
598
+ $api = themes_api( 'theme_information', array( 'slug' => $stylesheet, 'fields' => array( 'sections' => false, 'tags' => false ) ) );
599
+
600
+ if ( is_wp_error( $api ) )
601
+ return false;
602
+
603
+ return $api->name;
604
+
605
+
606
+ }
607
+
608
+ }
609
+
610
+
611
+ if (!class_exists('WP_List_Table')) {
612
+ require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
613
+ }
614
+
615
+ /**
616
+ * List table for manage custom presets page
617
+ */
618
+ class Infinite_Scroll_Presets_Table extends WP_List_Table {
619
+
620
+ /**
621
+ * Register with Parent
622
+ */
623
+ function __construct( $args = array() ) {
624
+
625
+ parent::__construct( array(
626
+ 'singular' => 'preset',
627
+ 'plural' => 'presets',
628
+ 'ajax' => true,
629
+ ) );
630
+
631
+ }
632
+
633
+
634
+ /**
635
+ * Default column callback
636
+ * @param object $item the item to display
637
+ * @param string $column_name the column name
638
+ * @return string the HTML to display
639
+ */
640
+ function column_default( $item, $column_name ) {
641
+ return $item->$column_name;
642
+ }
643
+
644
+
645
+ /**
646
+ * Callback to display the theme column
647
+ * @param object $item the preset object
648
+ * @return string the HTML to display
649
+ */
650
+ function column_theme( $item ) {
651
+ global $infinite_scroll;
652
+
653
+ $s = '<strong><a href="#" class="theme-name">' . $item->theme . '</a></strong>';
654
+ $s .= '<div class="edit edit-link" style="visibility:hidden;"><a href="#">' . __( 'Edit', 'infinite-scroll' ) . '</a> | <span class="delete"><a href="#">' . __( 'Delete', 'infinite-scroll' ) . '</a></span></div>';
655
+ $s .= '<div class="save save-link" style="display:none; padding-top:5px;"><a href="#" class="button-primary">' . __( 'Save', 'infinite-scroll' ) . '</a> <a href="#" class="cancel">' . __( 'Cancel', 'infinite-scroll' ) . '</a> <img class="loader" style="display:none;" src="'. admin_url( '/images/loading.gif' ) .'" /></div>';
656
+ return $s;
657
+ }
658
+
659
+
660
+ /**
661
+ * Callaback to return list of columns to display
662
+ * @return array the columns to display
663
+ */
664
+ function get_columns() {
665
+ return array(
666
+ 'theme' => 'Theme',
667
+ 'contentSelector' => 'Content Selector',
668
+ 'navSelector' => 'Navigation Selector',
669
+ 'nextSelector' => 'Next Selector',
670
+ 'itemSelector' => 'Item Selector',
671
+ );
672
+ }
673
+
674
+
675
+ /**
676
+ * Grab data and filter prior to passing to table class
677
+ */
678
+ function prepare_items() {
679
+ global $infinite_scroll;
680
+
681
+ $per_page = 25;
682
+
683
+ $columns = $this->get_columns();
684
+ $hidden = array();
685
+ $sortable = array();
686
+
687
+ $this->_column_headers = array($columns, $hidden, $sortable);
688
+
689
+ $data = $infinite_scroll->presets->get_presets();
690
+
691
+ //only display installed themes
692
+ $data = array_filter( $data, array( &$infinite_scroll->presets, 'theme_installed' ) );
693
+
694
+ //merge in themes
695
+ $themes = get_themes();
696
+
697
+ foreach ( $themes as $theme => $theme_data ) {
698
+
699
+ if ( array_key_exists( $theme, $data) )
700
+ continue;
701
+
702
+ //check for parent theme's preset, if any
703
+ if ( $preset = $infinite_scroll->presets->get_preset( $theme ) ) {
704
+ $data[ $theme ] = $preset;
705
+ continue;
706
+ }
707
+
708
+ $themeObj = new stdClass;
709
+
710
+ foreach ( $infinite_scroll->presets->keys as $key )
711
+ $themeObj->$key = null;
712
+
713
+ $themeObj->theme = $theme;
714
+
715
+ $data[ $theme ] = $themeObj;
716
+
717
+ }
718
+
719
+ asort( $data );
720
+
721
+ $current_page = $this->get_pagenum();
722
+
723
+ $total_items = count($data);
724
+
725
+ $data = array_slice($data, (($current_page-1)*$per_page), $per_page);
726
+
727
+ $this->items = $data;
728
+
729
+ $this->set_pagination_args( array(
730
+ 'total_items' => $total_items, //WE have to calculate the total number of items
731
+ 'per_page' => $per_page, //WE have to determine how many items to show on a page
732
+ 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
733
+ ) );
734
+
735
+ }
736
+
737
+ }