writefully 0.3.6

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 (328) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +31 -0
  4. data/Rakefile +22 -0
  5. data/app/assets/javascripts/writefully/authorships.js +2 -0
  6. data/app/assets/javascripts/writefully/sessions.js +2 -0
  7. data/app/assets/javascripts/writefully/writefully/initializers/boot.coffee +6 -0
  8. data/app/assets/javascripts/writefully/writefully/initializers/manifest.coffee +28 -0
  9. data/app/assets/javascripts/writefully/writefully/initializers/setup.coffee +4 -0
  10. data/app/assets/javascripts/writefully/writefully/loader.coffee +6 -0
  11. data/app/assets/javascripts/writefully/writefully.coffee +8 -0
  12. data/app/assets/stylesheets/writefully/base.sass +23 -0
  13. data/app/assets/stylesheets/writefully/sessions.sass +9 -0
  14. data/app/assets/stylesheets/writefully/sites.sass +33 -0
  15. data/app/assets/stylesheets/writefully/writefully.sass +4 -0
  16. data/app/controllers/writefully/application_controller.rb +28 -0
  17. data/app/controllers/writefully/authorships_controller.rb +8 -0
  18. data/app/controllers/writefully/hooks_controller.rb +51 -0
  19. data/app/controllers/writefully/posts_controller.rb +21 -0
  20. data/app/controllers/writefully/sessions_controller.rb +47 -0
  21. data/app/controllers/writefully/sites_controller.rb +51 -0
  22. data/app/helpers/writefully/application_helper.rb +15 -0
  23. data/app/helpers/writefully/flash_helper.rb +31 -0
  24. data/app/helpers/writefully/posts_helper.rb +8 -0
  25. data/app/helpers/writefully/sites_helper.rb +21 -0
  26. data/app/models/writefully/authorship.rb +34 -0
  27. data/app/models/writefully/post.rb +23 -0
  28. data/app/models/writefully/site.rb +30 -0
  29. data/app/models/writefully/tag.rb +15 -0
  30. data/app/models/writefully/tagging.rb +6 -0
  31. data/app/views/layouts/writefully/application.html.erb +16 -0
  32. data/app/views/layouts/writefully/sessions.html.erb +16 -0
  33. data/app/views/writefully/application/_activeable_link_to.html.erb +5 -0
  34. data/app/views/writefully/application/_flash.html.erb +5 -0
  35. data/app/views/writefully/application/_navigation.html.erb +23 -0
  36. data/app/views/writefully/application/flash/_owner_exists.html.erb +0 -0
  37. data/app/views/writefully/application/flash/_signed_in.html.erb +0 -0
  38. data/app/views/writefully/application/flash/_signed_out.html.erb +0 -0
  39. data/app/views/writefully/posts/_not_published.html.erb +1 -0
  40. data/app/views/writefully/posts/_post.html.erb +14 -0
  41. data/app/views/writefully/posts/_published.html.erb +1 -0
  42. data/app/views/writefully/posts/index.html.erb +7 -0
  43. data/app/views/writefully/posts/show.html.erb +0 -0
  44. data/app/views/writefully/sessions/new.html.erb +7 -0
  45. data/app/views/writefully/sites/_empty.html.erb +0 -0
  46. data/app/views/writefully/sites/_form.html.erb +15 -0
  47. data/app/views/writefully/sites/_site.html.erb +16 -0
  48. data/app/views/writefully/sites/edit.html.erb +0 -0
  49. data/app/views/writefully/sites/flash/create/_error.html.erb +0 -0
  50. data/app/views/writefully/sites/flash/create/_success.html.erb +2 -0
  51. data/app/views/writefully/sites/healthy/_no.html.erb +3 -0
  52. data/app/views/writefully/sites/healthy/_yes.html.erb +3 -0
  53. data/app/views/writefully/sites/index.html.erb +14 -0
  54. data/app/views/writefully/sites/new.html.erb +7 -0
  55. data/app/views/writefully/sites/processing/_no.html.erb +3 -0
  56. data/app/views/writefully/sites/processing/_yes.html.erb +3 -0
  57. data/app/views/writefully/sites/show/_errors.html.erb +0 -0
  58. data/app/views/writefully/sites/show/_heading.html.erb +6 -0
  59. data/app/views/writefully/sites/show/_processing.html.erb +0 -0
  60. data/app/views/writefully/sites/show/_tabs.html.erb +5 -0
  61. data/app/views/writefully/sites/show.html.erb +3 -0
  62. data/bin/rails +12 -0
  63. data/bin/writefully +7 -0
  64. data/config/routes.rb +16 -0
  65. data/db/migrate/20140402091204_create_writefully_posts.rb +22 -0
  66. data/db/migrate/20140402091244_create_writefully_tags.rb +14 -0
  67. data/db/migrate/20140402091415_create_writefully_taggings.rb +10 -0
  68. data/db/migrate/20140402200330_create_writefully_authorships.rb +12 -0
  69. data/db/migrate/20140403181629_create_writefully_sites.rb +20 -0
  70. data/lib/sample/README.md +26 -0
  71. data/lib/sample/meta.yml +7 -0
  72. data/lib/sample/writefully.png +0 -0
  73. data/lib/tasks/writefully_tasks.rake +9 -0
  74. data/lib/writefully/asset.rb +33 -0
  75. data/lib/writefully/cli.rb +57 -0
  76. data/lib/writefully/content.rb +31 -0
  77. data/lib/writefully/engine.rb +25 -0
  78. data/lib/writefully/indices.rb +21 -0
  79. data/lib/writefully/news_agency.rb +8 -0
  80. data/lib/writefully/postable.rb +57 -0
  81. data/lib/writefully/process.rb +84 -0
  82. data/lib/writefully/source.rb +52 -0
  83. data/lib/writefully/storage.rb +33 -0
  84. data/lib/writefully/taxon.rb +28 -0
  85. data/lib/writefully/tools/dispatcher.rb +59 -0
  86. data/lib/writefully/tools/eraser.rb +0 -0
  87. data/lib/writefully/tools/hammer.rb +41 -0
  88. data/lib/writefully/tools/initializer.rb +38 -0
  89. data/lib/writefully/tools/pencil.rb +71 -0
  90. data/lib/writefully/tools/pigeon.rb +19 -0
  91. data/lib/writefully/tools/synchronizer.rb +24 -0
  92. data/lib/writefully/tools.rb +13 -0
  93. data/lib/writefully/version.rb +3 -0
  94. data/lib/writefully/workers/base_worker.rb +25 -0
  95. data/lib/writefully/workers/handyman.rb +44 -0
  96. data/lib/writefully/workers/helpers/handyman/builder.rb +17 -0
  97. data/lib/writefully/workers/helpers.rb +8 -0
  98. data/lib/writefully/workers/journalist.rb +23 -0
  99. data/lib/writefully/workers.rb +9 -0
  100. data/lib/writefully/workers_helpers.rb +7 -0
  101. data/lib/writefully.rb +77 -0
  102. data/scripts/initialize.sh +30 -0
  103. data/scripts/sync.sh +17 -0
  104. data/spec/controllers/writefully/hooks_controller_spec.rb +35 -0
  105. data/spec/controllers/writefully/posts_controller_spec.rb +46 -0
  106. data/spec/controllers/writefully/sites_controller_spec.rb +91 -0
  107. data/spec/dummy/Rakefile +8 -0
  108. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  109. data/spec/dummy/app/models/playlist.rb +3 -0
  110. data/spec/dummy/app/models/post.rb +3 -0
  111. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  112. data/spec/dummy/bin/bundle +3 -0
  113. data/spec/dummy/bin/rails +4 -0
  114. data/spec/dummy/bin/rake +4 -0
  115. data/spec/dummy/config/application.rb +22 -0
  116. data/spec/dummy/config/boot.rb +5 -0
  117. data/spec/dummy/config/database.yml +25 -0
  118. data/spec/dummy/config/environment.rb +5 -0
  119. data/spec/dummy/config/environments/development.rb +29 -0
  120. data/spec/dummy/config/environments/production.rb +80 -0
  121. data/spec/dummy/config/environments/test.rb +36 -0
  122. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  123. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  124. data/spec/dummy/config/initializers/inflections.rb +16 -0
  125. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  126. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  127. data/spec/dummy/config/initializers/session_store.rb +3 -0
  128. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  129. data/spec/dummy/config/locales/en.yml +23 -0
  130. data/spec/dummy/config/routes.rb +3 -0
  131. data/spec/dummy/config/writefully.yml +9 -0
  132. data/spec/dummy/config.ru +4 -0
  133. data/spec/dummy/content/codemy-net/posts/1-hash-selector-pattern/README.md +119 -0
  134. data/spec/dummy/content/codemy-net/posts/1-hash-selector-pattern/assets/hash-selector-cover.png +0 -0
  135. data/spec/dummy/content/codemy-net/posts/1-hash-selector-pattern/assets/hash-selector-icon.png +0 -0
  136. data/spec/dummy/content/codemy-net/posts/1-hash-selector-pattern/benchmark/selector.rb +77 -0
  137. data/spec/dummy/content/codemy-net/posts/1-hash-selector-pattern/meta.yml +7 -0
  138. data/spec/dummy/content/codemy-net/posts/2-rails-flash-partials/README.md +171 -0
  139. data/spec/dummy/content/codemy-net/posts/2-rails-flash-partials/assets/cover.png +0 -0
  140. data/spec/dummy/content/codemy-net/posts/2-rails-flash-partials/meta.yml +7 -0
  141. data/spec/dummy/db/schema.rb +89 -0
  142. data/spec/dummy/log/development.log +13946 -0
  143. data/spec/dummy/log/test.log +100164 -0
  144. data/spec/dummy/tmp/cache/assets/development/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/application.sassc +0 -0
  145. data/spec/dummy/tmp/cache/assets/development/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/bootstrap.cssc +0 -0
  146. data/spec/dummy/tmp/cache/assets/development/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/setups.sassc +0 -0
  147. data/spec/dummy/tmp/cache/assets/development/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/writefully.sassc +0 -0
  148. data/spec/dummy/tmp/cache/assets/development/sprockets/04641fdb653c0ff3c557033d87eb6a16 +0 -0
  149. data/spec/dummy/tmp/cache/assets/development/sprockets/064b3076e29f54ea572ca43d6c5950cc +0 -0
  150. data/spec/dummy/tmp/cache/assets/development/sprockets/0d2e79f7f8c9026d7d8a7f6dc63fb4a8 +0 -0
  151. data/spec/dummy/tmp/cache/assets/development/sprockets/0f1c342384786865a6200cc3ed6234a3 +0 -0
  152. data/spec/dummy/tmp/cache/assets/development/sprockets/13c3568b2854b103512b2658e6507d4b +0 -0
  153. data/spec/dummy/tmp/cache/assets/development/sprockets/18eb9f12c7e8971e0e2fad29c85a8b8e +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sprockets/18f8d9596e0fba3397539181f63befe1 +0 -0
  155. data/spec/dummy/tmp/cache/assets/development/sprockets/1977498f5af78beca26942a7c812b294 +0 -0
  156. data/spec/dummy/tmp/cache/assets/development/sprockets/1ae121eed970dfdb5f4f09953ade4de2 +0 -0
  157. data/spec/dummy/tmp/cache/assets/development/sprockets/1b5404b64386f619af12582a1a634574 +0 -0
  158. data/spec/dummy/tmp/cache/assets/development/sprockets/22b701cb6ffd8eac83ec1bfc563b54cb +0 -0
  159. data/spec/dummy/tmp/cache/assets/development/sprockets/2d27da60cfa2f1952c3aadd169ea2570 +0 -0
  160. data/spec/dummy/tmp/cache/assets/development/sprockets/2e33b23d27ad5b8771d09ed8a1435cf6 +0 -0
  161. data/spec/dummy/tmp/cache/assets/development/sprockets/3063f229c5edc0e8a3d82d7bf78024de +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sprockets/31c84f37a0c92c38be6459f19997c981 +0 -0
  163. data/spec/dummy/tmp/cache/assets/development/sprockets/320d61138ae0221b11c7e4ea0f3d53d3 +0 -0
  164. data/spec/dummy/tmp/cache/assets/development/sprockets/3355368d663ec5236287158290d6c297 +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sprockets/3df2d5c2f4f6b6d502c017346b915051 +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sprockets/4596b288fc67fdb9037e06897d416879 +0 -0
  167. data/spec/dummy/tmp/cache/assets/development/sprockets/47381977da0f1b2165bdbb09480ccff3 +0 -0
  168. data/spec/dummy/tmp/cache/assets/development/sprockets/4aab863b927c65a4b9e70c43e4e6d482 +0 -0
  169. data/spec/dummy/tmp/cache/assets/development/sprockets/4c0271d24537b8a24979e07bbd75956c +0 -0
  170. data/spec/dummy/tmp/cache/assets/development/sprockets/4c16c5c88ae074d893e1de2ad787b031 +0 -0
  171. data/spec/dummy/tmp/cache/assets/development/sprockets/51610d35f263eb68b1cf73737045113d +0 -0
  172. data/spec/dummy/tmp/cache/assets/development/sprockets/5af65427549750bdf60b3f06ce273b41 +0 -0
  173. data/spec/dummy/tmp/cache/assets/development/sprockets/63958de32a7352bcfb139639ba2d4209 +0 -0
  174. data/spec/dummy/tmp/cache/assets/development/sprockets/63f349e6a646ae0252d46e1816064e0c +0 -0
  175. data/spec/dummy/tmp/cache/assets/development/sprockets/67ae1c504593279ebd6da7b6fdbe99b7 +0 -0
  176. data/spec/dummy/tmp/cache/assets/development/sprockets/68e61e8d5ac667de89a4bf1e732cde0a +0 -0
  177. data/spec/dummy/tmp/cache/assets/development/sprockets/69dfb59cc80e2c111bfbfc108371b27b +0 -0
  178. data/spec/dummy/tmp/cache/assets/development/sprockets/6d0103100e416966beba1039661e234e +0 -0
  179. data/spec/dummy/tmp/cache/assets/development/sprockets/71ea75f9945cdb543e0dc44527fcd926 +0 -0
  180. data/spec/dummy/tmp/cache/assets/development/sprockets/7556620a4f8405144dca74330e54608c +0 -0
  181. data/spec/dummy/tmp/cache/assets/development/sprockets/76598a5aebf24a1b763f5b10ae223c15 +0 -0
  182. data/spec/dummy/tmp/cache/assets/development/sprockets/7af8770b019b471931e4f6cb86027307 +0 -0
  183. data/spec/dummy/tmp/cache/assets/development/sprockets/7b696db3b421aeaa1afd210b07db8aae +0 -0
  184. data/spec/dummy/tmp/cache/assets/development/sprockets/7ff072db2442371da6ee49c9b279efdc +0 -0
  185. data/spec/dummy/tmp/cache/assets/development/sprockets/82b92bb7c88523dc617b3c0c877aeade +0 -0
  186. data/spec/dummy/tmp/cache/assets/development/sprockets/8c388cf0035e064a06ae30a03d96b51b +0 -0
  187. data/spec/dummy/tmp/cache/assets/development/sprockets/95703f30550e80a229dd0ec4a6ddc85c +0 -0
  188. data/spec/dummy/tmp/cache/assets/development/sprockets/98ccb36ebbfc6f6ac684a05ad8543c01 +0 -0
  189. data/spec/dummy/tmp/cache/assets/development/sprockets/9ad5688a6dad8d54658f492eb1fa07d6 +0 -0
  190. data/spec/dummy/tmp/cache/assets/development/sprockets/9b9ee2a899dd8b3bfa592fba44ebf8d2 +0 -0
  191. data/spec/dummy/tmp/cache/assets/development/sprockets/9c48c31b831040e919db903d9edef2ab +0 -0
  192. data/spec/dummy/tmp/cache/assets/development/sprockets/9f9f72b9edf89242aada0d52dbc57635 +0 -0
  193. data/spec/dummy/tmp/cache/assets/development/sprockets/a0e14dd5894f94a561a349d40037db07 +0 -0
  194. data/spec/dummy/tmp/cache/assets/development/sprockets/a125c2261ecc9d800e450373950ea433 +0 -0
  195. data/spec/dummy/tmp/cache/assets/development/sprockets/a3999d8baf1b9ed61d91ea6bd5e42951 +0 -0
  196. data/spec/dummy/tmp/cache/assets/development/sprockets/a8b93e1f061f64547b92633c5bde6b13 +0 -0
  197. data/spec/dummy/tmp/cache/assets/development/sprockets/ad8f1428d5543a9fc4ed7a9e9526e40a +0 -0
  198. data/spec/dummy/tmp/cache/assets/development/sprockets/adae8faa21b116471ec4285998d3f3cf +0 -0
  199. data/spec/dummy/tmp/cache/assets/development/sprockets/aea01e6a7f75a01b9f61f7e0430bd61b +0 -0
  200. data/spec/dummy/tmp/cache/assets/development/sprockets/b690c630e4500da8d405b10c5d827ac9 +0 -0
  201. data/spec/dummy/tmp/cache/assets/development/sprockets/b83537e814e13cf03642ccc3d90fda13 +0 -0
  202. data/spec/dummy/tmp/cache/assets/development/sprockets/ba4f054949cb1c1bea0fd796890fcb11 +0 -0
  203. data/spec/dummy/tmp/cache/assets/development/sprockets/bccc085acd77705bf4cd104dbd5dbec3 +0 -0
  204. data/spec/dummy/tmp/cache/assets/development/sprockets/c0c44ab8b0b90fb0287ca1400731f920 +0 -0
  205. data/spec/dummy/tmp/cache/assets/development/sprockets/c1208bf8d0e9714161d8e6ae61781efc +0 -0
  206. data/spec/dummy/tmp/cache/assets/development/sprockets/c6dae51db325ad18ac445895075e66b5 +0 -0
  207. data/spec/dummy/tmp/cache/assets/development/sprockets/ca8c11b2ed33b38e8b65858a2ba66d6f +0 -0
  208. data/spec/dummy/tmp/cache/assets/development/sprockets/ce5a98586efc888dc74dff9380760c33 +0 -0
  209. data/spec/dummy/tmp/cache/assets/development/sprockets/d0e440792b09f3cc258704d7850f0652 +0 -0
  210. data/spec/dummy/tmp/cache/assets/development/sprockets/d0e6d527077e64dc87dfa25abccd4dd3 +0 -0
  211. data/spec/dummy/tmp/cache/assets/development/sprockets/d10e06dee94ddaa562f7df319407bf18 +0 -0
  212. data/spec/dummy/tmp/cache/assets/development/sprockets/d1238ae38ca7b9522d86d67ee367223e +0 -0
  213. data/spec/dummy/tmp/cache/assets/development/sprockets/d2c2fff5893ce8979ca48bab1c6f1c3a +0 -0
  214. data/spec/dummy/tmp/cache/assets/development/sprockets/e1a679a58449aa2ee72eb4341d85b5d6 +0 -0
  215. data/spec/dummy/tmp/cache/assets/development/sprockets/e8fafe37de58ddbf16ebaf5cdc988320 +0 -0
  216. data/spec/dummy/tmp/cache/assets/development/sprockets/f15276b8745ef08f03a61f6fabe0001f +0 -0
  217. data/spec/dummy/tmp/cache/assets/development/sprockets/f79e04c0583c4be5f17610f948bc7436 +0 -0
  218. data/spec/dummy/tmp/cache/assets/development/sprockets/f966462e6d5e859d5be8f52161d2f53b +0 -0
  219. data/spec/dummy/tmp/cache/assets/development/sprockets/f977be4be94ab364314f054e18c53742 +0 -0
  220. data/spec/dummy/tmp/cache/assets/test/sass/23cfae14a65dc753e1ade92b6095067a45aad26f/bootstrap.scssc +0 -0
  221. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_alerts.scssc +0 -0
  222. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_badges.scssc +0 -0
  223. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_breadcrumbs.scssc +0 -0
  224. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_button-groups.scssc +0 -0
  225. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_buttons.scssc +0 -0
  226. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_carousel.scssc +0 -0
  227. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_close.scssc +0 -0
  228. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_code.scssc +0 -0
  229. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_component-animations.scssc +0 -0
  230. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_dropdowns.scssc +0 -0
  231. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_forms.scssc +0 -0
  232. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_glyphicons.scssc +0 -0
  233. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_grid.scssc +0 -0
  234. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_input-groups.scssc +0 -0
  235. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_jumbotron.scssc +0 -0
  236. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_labels.scssc +0 -0
  237. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_list-group.scssc +0 -0
  238. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_media.scssc +0 -0
  239. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_mixins.scssc +0 -0
  240. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_modals.scssc +0 -0
  241. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_navbar.scssc +0 -0
  242. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_navs.scssc +0 -0
  243. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_normalize.scssc +0 -0
  244. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_pager.scssc +0 -0
  245. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_pagination.scssc +0 -0
  246. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_panels.scssc +0 -0
  247. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_popovers.scssc +0 -0
  248. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_print.scssc +0 -0
  249. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_progress-bars.scssc +0 -0
  250. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_responsive-utilities.scssc +0 -0
  251. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_scaffolding.scssc +0 -0
  252. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_tables.scssc +0 -0
  253. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_thumbnails.scssc +0 -0
  254. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_tooltip.scssc +0 -0
  255. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_type.scssc +0 -0
  256. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_utilities.scssc +0 -0
  257. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_variables.scssc +0 -0
  258. data/spec/dummy/tmp/cache/assets/test/sass/6cd443894d18a18028b11ff7afc2188b8e6a0c6d/_wells.scssc +0 -0
  259. data/spec/dummy/tmp/cache/assets/test/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/base.sassc +0 -0
  260. data/spec/dummy/tmp/cache/assets/test/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/sessions.sassc +0 -0
  261. data/spec/dummy/tmp/cache/assets/test/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/sites.sassc +0 -0
  262. data/spec/dummy/tmp/cache/assets/test/sass/77bc3b7f842c905df4dddb7e3ac7b7cf15d9035b/writefully.sassc +0 -0
  263. data/spec/dummy/tmp/cache/assets/test/sprockets/064b3076e29f54ea572ca43d6c5950cc +0 -0
  264. data/spec/dummy/tmp/cache/assets/test/sprockets/0d2e79f7f8c9026d7d8a7f6dc63fb4a8 +0 -0
  265. data/spec/dummy/tmp/cache/assets/test/sprockets/18eb9f12c7e8971e0e2fad29c85a8b8e +0 -0
  266. data/spec/dummy/tmp/cache/assets/test/sprockets/1977498f5af78beca26942a7c812b294 +0 -0
  267. data/spec/dummy/tmp/cache/assets/test/sprockets/2d27da60cfa2f1952c3aadd169ea2570 +0 -0
  268. data/spec/dummy/tmp/cache/assets/test/sprockets/2e33b23d27ad5b8771d09ed8a1435cf6 +0 -0
  269. data/spec/dummy/tmp/cache/assets/test/sprockets/3063f229c5edc0e8a3d82d7bf78024de +0 -0
  270. data/spec/dummy/tmp/cache/assets/test/sprockets/31c84f37a0c92c38be6459f19997c981 +0 -0
  271. data/spec/dummy/tmp/cache/assets/test/sprockets/3df2d5c2f4f6b6d502c017346b915051 +0 -0
  272. data/spec/dummy/tmp/cache/assets/test/sprockets/4aab863b927c65a4b9e70c43e4e6d482 +0 -0
  273. data/spec/dummy/tmp/cache/assets/test/sprockets/4c0271d24537b8a24979e07bbd75956c +0 -0
  274. data/spec/dummy/tmp/cache/assets/test/sprockets/4c16c5c88ae074d893e1de2ad787b031 +0 -0
  275. data/spec/dummy/tmp/cache/assets/test/sprockets/63f349e6a646ae0252d46e1816064e0c +0 -0
  276. data/spec/dummy/tmp/cache/assets/test/sprockets/67ae1c504593279ebd6da7b6fdbe99b7 +0 -0
  277. data/spec/dummy/tmp/cache/assets/test/sprockets/68e61e8d5ac667de89a4bf1e732cde0a +0 -0
  278. data/spec/dummy/tmp/cache/assets/test/sprockets/6cf5095a6f2a3e346267010d81431898 +0 -0
  279. data/spec/dummy/tmp/cache/assets/test/sprockets/71ea75f9945cdb543e0dc44527fcd926 +0 -0
  280. data/spec/dummy/tmp/cache/assets/test/sprockets/74d56087624f43b73234c3691a21203b +0 -0
  281. data/spec/dummy/tmp/cache/assets/test/sprockets/76598a5aebf24a1b763f5b10ae223c15 +0 -0
  282. data/spec/dummy/tmp/cache/assets/test/sprockets/7af8770b019b471931e4f6cb86027307 +0 -0
  283. data/spec/dummy/tmp/cache/assets/test/sprockets/7ff072db2442371da6ee49c9b279efdc +0 -0
  284. data/spec/dummy/tmp/cache/assets/test/sprockets/82b92bb7c88523dc617b3c0c877aeade +0 -0
  285. data/spec/dummy/tmp/cache/assets/test/sprockets/8789652d56b500257c05b6b3370096a2 +0 -0
  286. data/spec/dummy/tmp/cache/assets/test/sprockets/95703f30550e80a229dd0ec4a6ddc85c +0 -0
  287. data/spec/dummy/tmp/cache/assets/test/sprockets/98ccb36ebbfc6f6ac684a05ad8543c01 +0 -0
  288. data/spec/dummy/tmp/cache/assets/test/sprockets/9ad5688a6dad8d54658f492eb1fa07d6 +0 -0
  289. data/spec/dummy/tmp/cache/assets/test/sprockets/9b9ee2a899dd8b3bfa592fba44ebf8d2 +0 -0
  290. data/spec/dummy/tmp/cache/assets/test/sprockets/9c48c31b831040e919db903d9edef2ab +0 -0
  291. data/spec/dummy/tmp/cache/assets/test/sprockets/9f9f72b9edf89242aada0d52dbc57635 +0 -0
  292. data/spec/dummy/tmp/cache/assets/test/sprockets/a2398b853766dfb3e66e6709e65e0fe8 +0 -0
  293. data/spec/dummy/tmp/cache/assets/test/sprockets/a8b93e1f061f64547b92633c5bde6b13 +0 -0
  294. data/spec/dummy/tmp/cache/assets/test/sprockets/adae8faa21b116471ec4285998d3f3cf +0 -0
  295. data/spec/dummy/tmp/cache/assets/test/sprockets/b776b64154999147a7219e7ab2ec18c5 +0 -0
  296. data/spec/dummy/tmp/cache/assets/test/sprockets/b83537e814e13cf03642ccc3d90fda13 +0 -0
  297. data/spec/dummy/tmp/cache/assets/test/sprockets/bccc085acd77705bf4cd104dbd5dbec3 +0 -0
  298. data/spec/dummy/tmp/cache/assets/test/sprockets/c1208bf8d0e9714161d8e6ae61781efc +0 -0
  299. data/spec/dummy/tmp/cache/assets/test/sprockets/d0e6d527077e64dc87dfa25abccd4dd3 +0 -0
  300. data/spec/dummy/tmp/cache/assets/test/sprockets/d10e06dee94ddaa562f7df319407bf18 +0 -0
  301. data/spec/dummy/tmp/cache/assets/test/sprockets/d1238ae38ca7b9522d86d67ee367223e +0 -0
  302. data/spec/dummy/tmp/cache/assets/test/sprockets/d2c2fff5893ce8979ca48bab1c6f1c3a +0 -0
  303. data/spec/dummy/tmp/cache/assets/test/sprockets/d743017d31a484ac9254192a452e4619 +0 -0
  304. data/spec/dummy/tmp/cache/assets/test/sprockets/e1c18951e718ae5b0d527ddf0099a3b0 +0 -0
  305. data/spec/dummy/tmp/cache/assets/test/sprockets/e1eb88bc099cda2e70c0a0ebc1e99665 +0 -0
  306. data/spec/dummy/tmp/cache/assets/test/sprockets/e8fafe37de58ddbf16ebaf5cdc988320 +0 -0
  307. data/spec/features/writefully/sites_feature_spec.rb +27 -0
  308. data/spec/fixtures/writefully/authorships.yml +11 -0
  309. data/spec/fixtures/writefully/github_hook_test.json +4 -0
  310. data/spec/fixtures/writefully/github_member_add_hook.json +127 -0
  311. data/spec/fixtures/writefully/github_push_hook.json +94 -0
  312. data/spec/fixtures/writefully/posts.yml +14 -0
  313. data/spec/fixtures/writefully/sites.yml +10 -0
  314. data/spec/lib/writefully/asset_spec.rb +22 -0
  315. data/spec/lib/writefully/content_spec.rb +22 -0
  316. data/spec/lib/writefully/indices_spec.rb +17 -0
  317. data/spec/lib/writefully/postable_spec.rb +27 -0
  318. data/spec/lib/writefully/source_spec.rb +23 -0
  319. data/spec/lib/writefully/taxon_spec.rb +27 -0
  320. data/spec/lib/writefully/tools/dispatcher_spec.rb +75 -0
  321. data/spec/lib/writefully/tools/hammer_spec.rb +78 -0
  322. data/spec/lib/writefully/tools/initializer_spec.rb +18 -0
  323. data/spec/lib/writefully/tools/pencil_spec.rb +72 -0
  324. data/spec/lib/writefully/tools/synchronizer_spec.rb +17 -0
  325. data/spec/lib/writefully/workers/handyman_spec.rb +50 -0
  326. data/spec/lib/writefully/workers/journalist_spec.rb +30 -0
  327. data/spec/spec_helper.rb +56 -0
  328. metadata +903 -0
@@ -0,0 +1,5 @@
1
+ <%= content_tag type, class: path_active?(path) do %>
2
+ <%= link_to path, options do %>
3
+ <%= link_icon(options[:icon]) %> <%= name %>
4
+ <% end %>
5
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <div class='alert <%= flash_color %>'>
2
+ <div class='cotainer'>
3
+ <%= render flash_path, object: flash_object %>
4
+ </div>
5
+ </div>
@@ -0,0 +1,23 @@
1
+ <nav class="navbar navbar-default navbar-static-top" role="navigation">
2
+ <div class='container-fluid'>
3
+ <div class="navbar-header">
4
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-8">
5
+ <span class="sr-only">Toggle navigation</span>
6
+ <span class="icon-bar"></span>
7
+ <span class="icon-bar"></span>
8
+ <span class="icon-bar"></span>
9
+ </button>
10
+ <%= link_to "Writefully", root_path, class: 'navbar-brand' %>
11
+ </div>
12
+ <div class="collapse navbar-collapse">
13
+ <ul class='nav navbar-nav'>
14
+ <%= activeable_link_to :li, "Dashboard", root_path, icon: 'home' %>
15
+ <%= activeable_link_to :li, "New Site", new_site_path, icon: 'plus' %>
16
+ </ul>
17
+ <ul class="nav navbar-nav navbar-right">
18
+ <li><p class='navbar-text'><%= current_wf_authorship %></p></li>
19
+ <li><%= link_to "Sign Out", signout_path %></li>
20
+ </ul>
21
+ </div>
22
+ </div>
23
+ </nav>
@@ -0,0 +1 @@
1
+ <span class='label label-default'>Not Published</span>
@@ -0,0 +1,14 @@
1
+ <%= div_for post, class: 'media' do %>
2
+ <%= link_to site_post_path(@site, post), class: 'pull-left' do %>
3
+ <%= image_tag post.details.cover, size: '64x64', alt: post.title %>
4
+ <% end %>
5
+ <div class='media-body'>
6
+ <h4 class='media-heading'><%= link_to post.title, site_post_path(@site, post) %></h4>
7
+ <div class='media-blurb'>
8
+ <%= post.details.blurb %>
9
+ </div>
10
+ <div class='media-status'>
11
+ <%= render publish_tag(post) %>
12
+ </div>
13
+ </div>
14
+ <% end %>
@@ -0,0 +1 @@
1
+ <span class='label label-success'>Published</span>
@@ -0,0 +1,7 @@
1
+ <%= render 'writefully/sites/show/heading' %>
2
+ <%= render 'writefully/sites/show/tabs' %>
3
+ <div id='posts' class='panel panel-default'>
4
+ <div class='panel-body'>
5
+ <%= render @site.posts %>
6
+ </div>
7
+ </div>
File without changes
@@ -0,0 +1,7 @@
1
+ <div id='new-session' class='row'>
2
+ <div class='col-md-4 col-md-offset-4'>
3
+ <h1 class='text-center'>Welcome to Writefully</h1>
4
+ <p class='lead text-center'>Lets get started!</p>
5
+ <%= link_to "Authenticate with Github", @github_app.authorize_url(scope: Writefully::SCOPES), class: 'btn btn-primary text-center btn-block' %>
6
+ </div>
7
+ </div>
File without changes
@@ -0,0 +1,15 @@
1
+ <%= form_for @site, html: { class: 'form-horizontal', role: 'form' } do |f| %>
2
+ <div class='form-group'>
3
+ <div class='col-sm-12'>
4
+ <%= f.text_field :name, class: 'form-control input-lg', placeholder: 'Site Name' %>
5
+ </div>
6
+ </div>
7
+ <div class='form-group'>
8
+ <div class='col-sm-12'>
9
+ <%= f.text_field :domain, class: 'form-control input-lg', placeholder: 'Site Domain' %>
10
+ <span class='help-block'>http://www.example.com for github web hook</span>
11
+ </div>
12
+ </div>
13
+ <p class='bg-primary form-info'>Lets give your site a name. This name will be used as your github repository name.</p>
14
+ <%= f.submit "Next", class: 'btn btn-success btn-block' %>
15
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <%= div_for site, class: 'row media' do %>
2
+ <div class='col-md-4'>
3
+ <h2>
4
+ <%= link_to site do %>
5
+ <%= site.name %>
6
+ <small><span class='glyphicon glyphicon-zoom-in'></span></small>
7
+ <% end %>
8
+ </h2>
9
+ </div>
10
+ <div class='col-md-4 text-center'>
11
+ <%= render processing_partial site %>
12
+ </div>
13
+ <div class='col-md-4'>
14
+ <%= render healthy_partial site %>
15
+ </div>
16
+ <% end %>
File without changes
@@ -0,0 +1,2 @@
1
+ <h4>Congratulations!</h4>
2
+ Your site has been created, now Writefully is going to set up a github repository.
@@ -0,0 +1,3 @@
1
+ <div class='status status-warning text-center'>
2
+ <span class='glyphicon glyphicon-warning-sign'></span>
3
+ </div>
@@ -0,0 +1,3 @@
1
+ <div class='status status-success text-center'>
2
+ <span class='glyphicon glyphicon-ok'></span>
3
+ </div>
@@ -0,0 +1,14 @@
1
+ <h1>Sites</h1>
2
+ <div class='panel panel-default'>
3
+ <div class='panel-heading'>
4
+ <div class='row'>
5
+ <div class='col-md-4'><h3>Site Name</h3></div>
6
+ <div class='col-md-4 text-center'><h3>Processing</h3></div>
7
+ <div class='col-md-4 text-center'><h3>Healthy</h3></div>
8
+ </div>
9
+ </div>
10
+ <div class='panel-body'>
11
+ <%= render @sites %>
12
+ </div>
13
+ </div>
14
+
@@ -0,0 +1,7 @@
1
+ <%#= content_for(:title, "Site Setup") %>
2
+ <div class='row'>
3
+ <div class='col-md-4 col-md-offset-4'>
4
+ <h1 class='text-center'>Site Setup</h1>
5
+ <%= render 'form' %>
6
+ </div>
7
+ </div>
@@ -0,0 +1,3 @@
1
+ <div class='status status-success text-center'>
2
+ <span class='glyphicon glyphicon-minus'></span>
3
+ </div>
@@ -0,0 +1,3 @@
1
+ <div class='status status-warning text-center'>
2
+ <span class='glyphicon glyphicon-refresh'></span>
3
+ </div>
File without changes
@@ -0,0 +1,6 @@
1
+ <h1>
2
+ <%= link_to sites_path do %>
3
+ <%= @site.name %>
4
+ <small><span class='glyphicon glyphicon-zoom-out'></span></small>
5
+ <% end %>
6
+ </h1>
@@ -0,0 +1,5 @@
1
+ <ul class="nav nav-tabs">
2
+ <%= activeable_link_to :li, 'Posts', site_posts_path(@site) %>
3
+ <%= activeable_link_to :li, 'Processing', tab_site_path(@site, 'processing') %>
4
+ <%= activeable_link_to :li, "Errors #{@site.processing_errors.count}", tab_site_path(@site, 'errors') %>
5
+ </ul>
@@ -0,0 +1,3 @@
1
+ <%= render 'writefully/sites/show/heading' %>
2
+ <%= render 'writefully/sites/show/tabs' %>
3
+ <%= render "writefully/sites/show/#{site_tab(params[:tab])}" %>
data/bin/rails ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/writefully/engine', __FILE__)
6
+
7
+ # Set up gems listed in the Gemfile.
8
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
9
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
10
+
11
+ require 'rails/all'
12
+ require 'rails/engine/commands'
data/bin/writefully ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'writefully'
4
+ require 'writefully/cli'
5
+
6
+
7
+ Writefully::CLI.start
data/config/routes.rb ADDED
@@ -0,0 +1,16 @@
1
+ Writefully::Engine.routes.draw do
2
+
3
+ resources :sites do
4
+ get 'tab/:tab', to: 'sites#show', as: :tab, on: :member
5
+ resources :posts, only: [:index, :show]
6
+ end
7
+
8
+ resources :authorships
9
+ resource :hook, only: [:create]
10
+
11
+ get '/signin', to: 'sessions#new'
12
+ get '/owner/auth', to: 'sessions#create'
13
+ get '/signout', to: 'sessions#destroy'
14
+
15
+ root to: 'sites#index'
16
+ end
@@ -0,0 +1,22 @@
1
+ class CreateWritefullyPosts < ActiveRecord::Migration
2
+ def change
3
+ create_table :writefully_posts do |t|
4
+ t.string :title
5
+ t.string :slug
6
+ t.string :type
7
+ t.text :content
8
+ t.hstore :details
9
+ t.datetime :published_at
10
+ t.integer :position
11
+ t.string :locale, default: 'en'
12
+ t.integer :translation_source_id
13
+ t.references :site, index: true
14
+ t.references :authorship, index: true
15
+
16
+ t.timestamps
17
+ end
18
+
19
+ add_index :writefully_posts, :slug, unique: true
20
+ add_index :writefully_posts, :translation_source_id
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ class CreateWritefullyTags < ActiveRecord::Migration
2
+ def change
3
+ create_table :writefully_tags do |t|
4
+ t.string :name
5
+ t.string :slug
6
+ t.string :type
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :writefully_tags, :slug, unique: true
12
+ add_index :writefully_tags, :type
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ class CreateWritefullyTaggings < ActiveRecord::Migration
2
+ def change
3
+ create_table :writefully_taggings do |t|
4
+ t.references :tag, index: true
5
+ t.references :post, index: true
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class CreateWritefullyAuthorships < ActiveRecord::Migration
2
+ def change
3
+ create_table :writefully_authorships do |t|
4
+ t.references :user, index: true
5
+ t.hstore :data
6
+ t.string :role
7
+ t.boolean :active, default: true
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ class CreateWritefullySites < ActiveRecord::Migration
2
+ def change
3
+ create_table :writefully_sites do |t|
4
+ t.string :name
5
+ t.string :branch, default: 'master'
6
+ t.string :slug
7
+ t.hstore :repository
8
+ t.string :domain
9
+ t.boolean :processing, default: true
10
+ t.boolean :healthy, default: false
11
+ t.integer :owner_id
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ add_index :writefully_sites, :slug, unique: true
17
+ add_index :writefully_sites, :repository, using: :gin
18
+ add_index :writefully_sites, :owner_id
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # Welcome to Writefully!
2
+
3
+ This readme should help you get started with how to write your content with writefully
4
+
5
+ ![An Image](assets/writefully.png)
6
+
7
+ Thats how you include an image
8
+
9
+ Checkout `meta.yml` you can add extra details to the 'details' area. Anything you like for example
10
+
11
+ ```yml
12
+ title: "Sample Post"
13
+ slug: "sample-post"
14
+ tags: ["Writefully"]
15
+ publish: true # this marks the content as published
16
+ details:
17
+ blurb: "This is a sample post for Writefully"
18
+ cover: "assets/writefully.png"
19
+ price: "10" # this is the extra detail
20
+ ```
21
+
22
+ Now try cloning this repository into your local machine, edit it to you heart's content and try doing a push into github!
23
+
24
+ To create another post simply create a new directory 2-another-post and follow the structure provided in the first post.
25
+
26
+ Check out the documentation at [Writefully](https://github.com/codemy/writefully) for more details.
@@ -0,0 +1,7 @@
1
+ title: "Change Me"
2
+ slug: "change-me"
3
+ tags: ["Writefully"]
4
+ publish: true
5
+ details:
6
+ blurb: "This is a sample post for Writefully"
7
+ cover: "assets/writefully.png"
Binary file
@@ -0,0 +1,9 @@
1
+ require 'writefully/process'
2
+
3
+ namespace :writefully do
4
+ desc "Starts the writefully monitor"
5
+ task :start do
6
+ Signal.trap("INT") { $stdout.puts "Writefully exiting..."; exit }
7
+ Writefully::Process.new(Writefully.options).listen
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module Writefully
2
+ class Asset
3
+ attr_reader :path, :endpoint
4
+
5
+ def initialize(index)
6
+ base_path = [Writefully.options[:content], index[:site], index[:resource], index[:slug]]
7
+ @path = File.join(base_path, 'assets')
8
+ @endpoint = File.join(index[:site], index[:resource], index[:slug], 'assets')
9
+ end
10
+
11
+ def names
12
+ Dir.chdir(path) { Dir.glob('*') }
13
+ end
14
+
15
+ def regex
16
+ ::Regexp.new('assets\/')
17
+ end
18
+
19
+ def url storage_endpoint
20
+ Writefully.options[:assets_host] || File.join(storage_endpoint, endpoint, '/')
21
+ end
22
+
23
+ def convert_for content
24
+ if content.is_a?(String)
25
+ content.gsub(regex, url(Writefully::Storage.endpoint))
26
+ elsif content.is_a?(Hash)
27
+ content.inject({}) do |h, (k, v)|
28
+ h[k] = v.gsub(regex, url(Writefully::Storage.endpoint)); h
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,57 @@
1
+ require 'thor'
2
+ require 'writefully/process'
3
+
4
+ module Writefully
5
+ class CLI < Thor
6
+ desc "start", "Start listening to the content directory"
7
+
8
+ method_options %w( daemonize -d ) => :boolean
9
+ method_options %w( config -c ) => :string
10
+
11
+ def start
12
+ config = Writefully.config_from(options.config)
13
+
14
+ if options.daemonize?
15
+ Process.daemon(true, true)
16
+ pid = waitpid(spawn(listen(config)))
17
+ write pid, config[:pidfile]
18
+ else
19
+ listen(config)
20
+ end
21
+ end
22
+
23
+ desc "stop", "Stop listening for content directory changes"
24
+ def stop(pidfile = nil)
25
+ pid = open(pidfile).read.strip.to_i
26
+ Process.kill("HUP", pid)
27
+ true
28
+ rescue Errno::ENOENT
29
+ $stdout.puts "#{pidfile} does not exist: Errno::ENOENT"
30
+ true
31
+ rescue Errno::ESRCH
32
+ $stdout.puts "The process #{pid} did not exist: Errno::ESRCH"
33
+ true
34
+ rescue Errno::EPERM
35
+ $stderr.puts "Lack of privileges to manage the process #{pid}: Errno::EPERM"
36
+ false
37
+ rescue ::Exception => e
38
+ $stderr.puts "While signaling the PID, unexpected #{e.class}: #{e}"
39
+ false
40
+ end
41
+
42
+ no_tasks do
43
+ def listen(config)
44
+ Writefully::Process.new(config).listen
45
+ end
46
+
47
+ def write pid, pidfile
48
+ File.open pidfile, "w" do |f|
49
+ f.write pid
50
+ end
51
+ rescue ::Exception => e
52
+ $stderr.puts "While writing the PID to file, unexpected #{e.class}: #{e}"
53
+ Process.kill "HUP", pid
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ module Writefully
2
+ class Content
3
+ attr_reader :index, :path
4
+ attr_accessor :body
5
+
6
+ def initialize(index)
7
+ @index = index
8
+ @path = File.join(Writefully.options[:content], index[:site], index[:resource], index[:slug])
9
+ end
10
+
11
+ def body
12
+ Dir.chdir(path) { File.open(Dir['README.*'].first).read }
13
+ end
14
+
15
+ def meta
16
+ YAML.load(File.read(File.join(path, "meta.yml"))).merge({ "position" => position })
17
+ end
18
+
19
+ def details
20
+ Hashie::Mash.new(meta["details"])
21
+ end
22
+
23
+ def slug
24
+ index[:slug].split(/\d-/).last
25
+ end
26
+
27
+ def position
28
+ index[:slug].match(/\d/).to_s.to_i
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ require 'jquery-rails'
2
+ require 'coffee_script'
3
+ require 'turbolinks'
4
+ require 'transponder'
5
+ require 'bootstrap-sass'
6
+ require 'friendly_id'
7
+
8
+ module Writefully
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace Writefully
11
+
12
+ initializer 'Writefully precompile hook', group: :all do |app|
13
+ app.config.assets.precompile += %w[
14
+ writefully/writefully.js
15
+ writefully/writefully.css
16
+ ]
17
+ end
18
+
19
+ config.generators do |g|
20
+ g.test_framework :rspec
21
+ g.assets false
22
+ g.helper false
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module Writefully
2
+ module Indices
3
+ def self.build_from(modified)
4
+ modified.map do |file_name|
5
+ index_hash_from(index_name_from(remove_content_path(file_name)))
6
+ end
7
+ end
8
+
9
+ def self.remove_content_path(file_name)
10
+ file_name.split('/') - Writefully.options[:content].split('/')
11
+ end
12
+
13
+ def self.index_name_from(array)
14
+ [:site, :resource, :slug].zip(array).flatten
15
+ end
16
+
17
+ def self.index_hash_from(array)
18
+ Hash[*array]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ module Writefully
2
+ class NewsAgency < Celluloid::SupervisionGroup
3
+ pool Tools::Pigeon, as: :pigeons, size: ((Writefully.options[:concurrency] * 4) rescue 2)
4
+ pool Workers::Journalist, as: :journalists, size: (Writefully.options[:concurrency] rescue 2)
5
+
6
+ supervise Workers::Handyman, as: :handyman
7
+ end
8
+ end
@@ -0,0 +1,57 @@
1
+ require 'active_support/concern'
2
+
3
+ module Writefully
4
+ module Postable
5
+ extend ActiveSupport::Concern
6
+ class NoContentField < StandardError ; end
7
+
8
+ included do
9
+ after_initialize :check_content_field_existence
10
+ attr_accessor :publish
11
+
12
+ before_save :publish_resource, if: -> { respond_to?(:published_at) }
13
+ end
14
+
15
+ def taxonomize_with(tokens, type)
16
+ type_singular = type.to_s.singularize
17
+ type_klass = klass_from(type_singular).constantize
18
+ self.send(:"#{type_singular}_ids=", type_klass.ids_from_tokens(tokens))
19
+ end
20
+
21
+ def klass_from type_singular
22
+ type_singular == "tag" ? "Writefully::Tag" : type_singular.classify
23
+ end
24
+
25
+ def publish_resource
26
+ if publish
27
+ self.published_at = Time.now
28
+ else
29
+ self.published_at = nil
30
+ end
31
+ end
32
+
33
+ def check_content_field_existence
34
+ unless respond_to?(:content)
35
+ raise NoContentField, "No content field defined please define a content field"
36
+ end
37
+ end
38
+
39
+ module ClassMethods
40
+ def wf_taxonomize(type, *args)
41
+ class_eval do
42
+ has_many :"#{type}", *args
43
+
44
+ define_method("#{type}=") do |tokens|
45
+ self.taxonomize_with(tokens, type)
46
+ end
47
+ end
48
+ end
49
+
50
+ def wf_content(field_name)
51
+ class_eval do
52
+ alias_attribute :content, :"#{field_name}" unless field_name == :content
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end