unpoly-rails 1.0.3 → 2.0.0.pre.rc2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of unpoly-rails might be problematic. Click here for more details.

Files changed (344) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/CHANGELOG.md +43 -25
  4. data/README.md +5 -6
  5. data/README_RAILS.md +295 -14
  6. data/dist/unpoly-bootstrap3.css +9 -14
  7. data/dist/unpoly-bootstrap3.js +4 -18
  8. data/dist/unpoly-bootstrap3.min.css +1 -1
  9. data/dist/unpoly-bootstrap3.min.js +1 -1
  10. data/dist/unpoly-bootstrap4.css +9 -0
  11. data/dist/unpoly-bootstrap4.js +16 -0
  12. data/dist/unpoly-bootstrap4.min.css +1 -0
  13. data/dist/unpoly-bootstrap4.min.js +1 -0
  14. data/dist/unpoly-bootstrap5.css +9 -0
  15. data/dist/unpoly-bootstrap5.js +14 -0
  16. data/dist/unpoly-bootstrap5.min.css +1 -0
  17. data/dist/unpoly-bootstrap5.min.js +1 -0
  18. data/dist/unpoly-migrate.js +1213 -0
  19. data/dist/unpoly-migrate.min.js +1 -0
  20. data/dist/unpoly.css +109 -140
  21. data/dist/unpoly.js +15376 -10484
  22. data/dist/unpoly.min.css +1 -1
  23. data/dist/unpoly.min.js +6 -4
  24. data/lib/unpoly/rails/change/cache.rb +26 -0
  25. data/lib/unpoly/rails/change/context.rb +80 -0
  26. data/lib/unpoly/rails/change/field.rb +117 -0
  27. data/lib/unpoly/rails/change/field_definition.rb +74 -0
  28. data/lib/unpoly/rails/change/layer.rb +60 -0
  29. data/lib/unpoly/rails/change.rb +372 -0
  30. data/lib/unpoly/rails/controller.rb +47 -0
  31. data/lib/unpoly/rails/error.rb +5 -0
  32. data/lib/unpoly/rails/request_echo_headers.rb +2 -2
  33. data/lib/unpoly/rails/version.rb +1 -1
  34. data/lib/unpoly/tasks.rb +45 -0
  35. data/lib/unpoly-rails.rb +9 -3
  36. metadata +42 -316
  37. data/.gitignore +0 -10
  38. data/.ruby-version +0 -1
  39. data/Gemfile +0 -7
  40. data/Gemfile.lock +0 -39
  41. data/Rakefile +0 -154
  42. data/bower.json +0 -27
  43. data/design/animation-ghosting.txt +0 -72
  44. data/design/design.txt +0 -34
  45. data/design/draft.html.erb +0 -48
  46. data/design/draft.rb +0 -9
  47. data/design/es6.js +0 -32
  48. data/design/ghost-debugging.txt +0 -118
  49. data/design/homepage.txt +0 -236
  50. data/design/ie11.txt +0 -9
  51. data/design/measure_import_node.js +0 -330
  52. data/design/measure_jquery/element_list.js +0 -41
  53. data/design/measure_jquery/up.on_vs_addEventListener.js +0 -56
  54. data/design/positioning.txt +0 -28
  55. data/design/query-params-in-form-actions/cases.html +0 -125
  56. data/design/rename.txt +0 -0
  57. data/design/test_rejected_promise.txt +0 -5
  58. data/design/unpoly errors.txt +0 -19
  59. data/lib/assets/javascripts/unpoly/browser.coffee.erb +0 -240
  60. data/lib/assets/javascripts/unpoly/classes/body_shifter.coffee +0 -45
  61. data/lib/assets/javascripts/unpoly/classes/cache.coffee +0 -127
  62. data/lib/assets/javascripts/unpoly/classes/compile_pass.coffee +0 -93
  63. data/lib/assets/javascripts/unpoly/classes/config.coffee +0 -9
  64. data/lib/assets/javascripts/unpoly/classes/css_transition.coffee +0 -118
  65. data/lib/assets/javascripts/unpoly/classes/divertible_chain.coffee +0 -39
  66. data/lib/assets/javascripts/unpoly/classes/event_listener.coffee +0 -116
  67. data/lib/assets/javascripts/unpoly/classes/extract_cascade.coffee +0 -86
  68. data/lib/assets/javascripts/unpoly/classes/extract_plan.coffee +0 -111
  69. data/lib/assets/javascripts/unpoly/classes/field_observer.coffee +0 -80
  70. data/lib/assets/javascripts/unpoly/classes/focus_follower.coffee +0 -29
  71. data/lib/assets/javascripts/unpoly/classes/follow_variant.coffee +0 -64
  72. data/lib/assets/javascripts/unpoly/classes/html_parser.coffee +0 -46
  73. data/lib/assets/javascripts/unpoly/classes/motion_controller.coffee +0 -157
  74. data/lib/assets/javascripts/unpoly/classes/params.coffee.erb +0 -544
  75. data/lib/assets/javascripts/unpoly/classes/record.coffee +0 -22
  76. data/lib/assets/javascripts/unpoly/classes/rect.js +0 -21
  77. data/lib/assets/javascripts/unpoly/classes/request.coffee +0 -247
  78. data/lib/assets/javascripts/unpoly/classes/response.coffee +0 -157
  79. data/lib/assets/javascripts/unpoly/classes/reveal_motion.coffee +0 -102
  80. data/lib/assets/javascripts/unpoly/classes/scroll_motion.coffee +0 -67
  81. data/lib/assets/javascripts/unpoly/classes/selector.coffee +0 -60
  82. data/lib/assets/javascripts/unpoly/classes/store/memory.coffee +0 -26
  83. data/lib/assets/javascripts/unpoly/classes/store/session.coffee +0 -59
  84. data/lib/assets/javascripts/unpoly/classes/tether.coffee +0 -105
  85. data/lib/assets/javascripts/unpoly/classes/url_set.coffee +0 -32
  86. data/lib/assets/javascripts/unpoly/cookie.coffee +0 -56
  87. data/lib/assets/javascripts/unpoly/element.coffee.erb +0 -1129
  88. data/lib/assets/javascripts/unpoly/event.coffee.erb +0 -445
  89. data/lib/assets/javascripts/unpoly/feedback.coffee +0 -353
  90. data/lib/assets/javascripts/unpoly/form.coffee.erb +0 -1084
  91. data/lib/assets/javascripts/unpoly/fragment.coffee.erb +0 -928
  92. data/lib/assets/javascripts/unpoly/framework.coffee +0 -65
  93. data/lib/assets/javascripts/unpoly/history.coffee +0 -268
  94. data/lib/assets/javascripts/unpoly/legacy.coffee +0 -60
  95. data/lib/assets/javascripts/unpoly/link.coffee.erb +0 -622
  96. data/lib/assets/javascripts/unpoly/log.coffee +0 -253
  97. data/lib/assets/javascripts/unpoly/modal.coffee.erb +0 -827
  98. data/lib/assets/javascripts/unpoly/motion.coffee.erb +0 -668
  99. data/lib/assets/javascripts/unpoly/namespace.coffee.erb +0 -5
  100. data/lib/assets/javascripts/unpoly/popup.coffee.erb +0 -515
  101. data/lib/assets/javascripts/unpoly/protocol.coffee +0 -300
  102. data/lib/assets/javascripts/unpoly/proxy.coffee +0 -672
  103. data/lib/assets/javascripts/unpoly/radio.coffee +0 -60
  104. data/lib/assets/javascripts/unpoly/rails.coffee +0 -24
  105. data/lib/assets/javascripts/unpoly/syntax.coffee.erb +0 -476
  106. data/lib/assets/javascripts/unpoly/toast.coffee +0 -67
  107. data/lib/assets/javascripts/unpoly/tooltip.coffee +0 -276
  108. data/lib/assets/javascripts/unpoly/util.coffee.erb +0 -1677
  109. data/lib/assets/javascripts/unpoly/viewport.coffee.erb +0 -830
  110. data/lib/assets/javascripts/unpoly-bootstrap3/feedback-ext.coffee +0 -5
  111. data/lib/assets/javascripts/unpoly-bootstrap3/form-ext.coffee +0 -1
  112. data/lib/assets/javascripts/unpoly-bootstrap3/modal-ext.coffee +0 -14
  113. data/lib/assets/javascripts/unpoly-bootstrap3/viewport-ext.coffee +0 -5
  114. data/lib/assets/javascripts/unpoly-bootstrap3.coffee +0 -2
  115. data/lib/assets/javascripts/unpoly.coffee +0 -28
  116. data/lib/assets/stylesheets/unpoly/close.sass +0 -2
  117. data/lib/assets/stylesheets/unpoly/dom.sass +0 -5
  118. data/lib/assets/stylesheets/unpoly/layout.sass +0 -2
  119. data/lib/assets/stylesheets/unpoly/link.sass +0 -2
  120. data/lib/assets/stylesheets/unpoly/modal.sass +0 -116
  121. data/lib/assets/stylesheets/unpoly/popup.sass +0 -7
  122. data/lib/assets/stylesheets/unpoly/toast.sass +0 -33
  123. data/lib/assets/stylesheets/unpoly/tooltip.sass +0 -62
  124. data/lib/assets/stylesheets/unpoly-bootstrap3/modal-ext.sass +0 -27
  125. data/lib/assets/stylesheets/unpoly-bootstrap3.sass +0 -1
  126. data/lib/assets/stylesheets/unpoly.sass +0 -1
  127. data/lib/unpoly/rails/inspector.rb +0 -149
  128. data/lib/unpoly/rails/inspector_accessor.rb +0 -30
  129. data/package.json +0 -38
  130. data/spec_app/.firefox-version +0 -1
  131. data/spec_app/.gitignore +0 -17
  132. data/spec_app/.rspec +0 -2
  133. data/spec_app/Gemfile +0 -29
  134. data/spec_app/Gemfile.lock +0 -223
  135. data/spec_app/README.rdoc +0 -28
  136. data/spec_app/Rakefile +0 -6
  137. data/spec_app/app/assets/images/.keep +0 -0
  138. data/spec_app/app/assets/images/favicon.png +0 -0
  139. data/spec_app/app/assets/images/grid.png +0 -0
  140. data/spec_app/app/assets/javascripts/bootstrap_manifest.coffee +0 -6
  141. data/spec_app/app/assets/javascripts/integration_test.coffee +0 -5
  142. data/spec_app/app/assets/javascripts/jasmine_specs.coffee +0 -6
  143. data/spec_app/app/assets/stylesheets/_helpers.sass +0 -5
  144. data/spec_app/app/assets/stylesheets/bootstrap_manifest.sass +0 -2
  145. data/spec_app/app/assets/stylesheets/integration_test.sass +0 -88
  146. data/spec_app/app/assets/stylesheets/jasmine_specs.sass +0 -20
  147. data/spec_app/app/controllers/application_controller.rb +0 -14
  148. data/spec_app/app/controllers/binding_test_controller.rb +0 -51
  149. data/spec_app/app/controllers/boot_test_controller.rb +0 -31
  150. data/spec_app/app/controllers/compiler_test_controller.rb +0 -5
  151. data/spec_app/app/controllers/css_test_controller.rb +0 -5
  152. data/spec_app/app/controllers/error_test_controller.rb +0 -5
  153. data/spec_app/app/controllers/form_test/basics_controller.rb +0 -14
  154. data/spec_app/app/controllers/form_test/redirects_controller.rb +0 -17
  155. data/spec_app/app/controllers/form_test/uploads_controller.rb +0 -15
  156. data/spec_app/app/controllers/hash_test_controller.rb +0 -5
  157. data/spec_app/app/controllers/method_test_controller.rb +0 -16
  158. data/spec_app/app/controllers/motion_test_controller.rb +0 -5
  159. data/spec_app/app/controllers/pages_controller.rb +0 -17
  160. data/spec_app/app/controllers/replace_test_controller.rb +0 -5
  161. data/spec_app/app/controllers/reveal_test_controller.rb +0 -5
  162. data/spec_app/app/controllers/scroll_test_controller.rb +0 -5
  163. data/spec_app/app/helpers/application_helper.rb +0 -11
  164. data/spec_app/app/mailers/.keep +0 -0
  165. data/spec_app/app/models/concerns/.keep +0 -0
  166. data/spec_app/app/views/boot_test/defer.erb +0 -18
  167. data/spec_app/app/views/boot_test/module.erb +0 -18
  168. data/spec_app/app/views/boot_test/sync.erb +0 -17
  169. data/spec_app/app/views/compiler_test/timestamp.erb +0 -10
  170. data/spec_app/app/views/css_test/modal.erb +0 -47
  171. data/spec_app/app/views/css_test/modal_contents.erb +0 -5
  172. data/spec_app/app/views/css_test/modal_contents_wide.erb +0 -5
  173. data/spec_app/app/views/css_test/popup.erb +0 -81
  174. data/spec_app/app/views/css_test/popup_contents.erb +0 -5
  175. data/spec_app/app/views/css_test/tooltip.erb +0 -48
  176. data/spec_app/app/views/error_test/trigger.erb +0 -80
  177. data/spec_app/app/views/error_test/unexpected_response.erb +0 -3
  178. data/spec_app/app/views/form_test/basics/new.erb +0 -60
  179. data/spec_app/app/views/form_test/redirects/new.erb +0 -27
  180. data/spec_app/app/views/form_test/redirects/target.erb +0 -6
  181. data/spec_app/app/views/form_test/submission_result.erb +0 -30
  182. data/spec_app/app/views/form_test/uploads/new.erb +0 -44
  183. data/spec_app/app/views/hash_test/unpoly.erb +0 -30
  184. data/spec_app/app/views/hash_test/vanilla.erb +0 -13
  185. data/spec_app/app/views/layouts/integration_test.erb +0 -22
  186. data/spec_app/app/views/layouts/jasmine_rails/spec_runner.html.erb +0 -20
  187. data/spec_app/app/views/method_test/form_target.erb +0 -17
  188. data/spec_app/app/views/method_test/page1.erb +0 -11
  189. data/spec_app/app/views/method_test/page2.erb +0 -6
  190. data/spec_app/app/views/motion_test/animations.erb +0 -16
  191. data/spec_app/app/views/motion_test/transitions.erb +0 -13
  192. data/spec_app/app/views/pages/start.erb +0 -82
  193. data/spec_app/app/views/replace_test/_nav.erb +0 -6
  194. data/spec_app/app/views/replace_test/page1.erb +0 -14
  195. data/spec_app/app/views/replace_test/page2.erb +0 -14
  196. data/spec_app/app/views/replace_test/table.erb +0 -16
  197. data/spec_app/app/views/reveal_test/long1.erb +0 -17
  198. data/spec_app/app/views/reveal_test/long2.erb +0 -17
  199. data/spec_app/app/views/reveal_test/within_document_viewport.erb +0 -24
  200. data/spec_app/app/views/reveal_test/within_overflowing_div_viewport.erb +0 -28
  201. data/spec_app/app/views/scroll_test/long1.erb +0 -30
  202. data/spec_app/bin/bundle +0 -3
  203. data/spec_app/bin/rails +0 -8
  204. data/spec_app/bin/rake +0 -8
  205. data/spec_app/bin/setup +0 -29
  206. data/spec_app/bin/spring +0 -18
  207. data/spec_app/config/application.rb +0 -28
  208. data/spec_app/config/boot.rb +0 -3
  209. data/spec_app/config/database.yml +0 -25
  210. data/spec_app/config/environment.rb +0 -5
  211. data/spec_app/config/environments/development.rb +0 -41
  212. data/spec_app/config/environments/production.rb +0 -79
  213. data/spec_app/config/environments/test.rb +0 -42
  214. data/spec_app/config/initializers/assets.rb +0 -19
  215. data/spec_app/config/initializers/backtrace_silencers.rb +0 -7
  216. data/spec_app/config/initializers/bower_rails.rb +0 -16
  217. data/spec_app/config/initializers/cookies_serializer.rb +0 -3
  218. data/spec_app/config/initializers/filter_parameter_logging.rb +0 -4
  219. data/spec_app/config/initializers/inflections.rb +0 -16
  220. data/spec_app/config/initializers/mime_types.rb +0 -4
  221. data/spec_app/config/initializers/session_store.rb +0 -3
  222. data/spec_app/config/initializers/wrap_parameters.rb +0 -14
  223. data/spec_app/config/locales/en.yml +0 -23
  224. data/spec_app/config/routes.rb +0 -33
  225. data/spec_app/config/secrets.yml +0 -22
  226. data/spec_app/config.ru +0 -4
  227. data/spec_app/db/schema.rb +0 -23
  228. data/spec_app/db/seeds.rb +0 -7
  229. data/spec_app/lib/assets/.keep +0 -0
  230. data/spec_app/lib/tasks/.keep +0 -0
  231. data/spec_app/lib/tasks/cucumber.rake +0 -65
  232. data/spec_app/log/.keep +0 -0
  233. data/spec_app/public/404.html +0 -67
  234. data/spec_app/public/422.html +0 -67
  235. data/spec_app/public/500.html +0 -66
  236. data/spec_app/public/favicon.ico +0 -0
  237. data/spec_app/public/robots.txt +0 -5
  238. data/spec_app/script/cucumber +0 -10
  239. data/spec_app/spec/controllers/binding_test_controller_spec.rb +0 -248
  240. data/spec_app/spec/javascripts/helpers/agent_detector.coffee +0 -20
  241. data/spec_app/spec/javascripts/helpers/async_sequence.js.coffee +0 -103
  242. data/spec_app/spec/javascripts/helpers/browser_switches.js.coffee +0 -21
  243. data/spec_app/spec/javascripts/helpers/enable_logging.js.coffee +0 -2
  244. data/spec_app/spec/javascripts/helpers/fixture.js.coffee +0 -25
  245. data/spec_app/spec/javascripts/helpers/index.js.coffee +0 -1
  246. data/spec_app/spec/javascripts/helpers/jquery_no_conflict.js +0 -1
  247. data/spec_app/spec/javascripts/helpers/knife.js.coffee +0 -69
  248. data/spec_app/spec/javascripts/helpers/last_request.js.coffee +0 -25
  249. data/spec_app/spec/javascripts/helpers/mock_ajax.js.coffee +0 -8
  250. data/spec_app/spec/javascripts/helpers/mock_clock.js.coffee +0 -2
  251. data/spec_app/spec/javascripts/helpers/parse_form_data.js.coffee +0 -24
  252. data/spec_app/spec/javascripts/helpers/promise_state.js +0 -18
  253. data/spec_app/spec/javascripts/helpers/protect_jasmine_runner.coffee +0 -12
  254. data/spec_app/spec/javascripts/helpers/remove_body_margin.js.coffee +0 -8
  255. data/spec_app/spec/javascripts/helpers/reset_history.js.coffee +0 -23
  256. data/spec_app/spec/javascripts/helpers/reset_knife.js.coffee +0 -2
  257. data/spec_app/spec/javascripts/helpers/reset_up.js.coffee +0 -25
  258. data/spec_app/spec/javascripts/helpers/restore_body_scroll.js.coffee +0 -5
  259. data/spec_app/spec/javascripts/helpers/show_lib_versions.coffee +0 -12
  260. data/spec_app/spec/javascripts/helpers/spec_util.coffee +0 -47
  261. data/spec_app/spec/javascripts/helpers/to_be_around.js.coffee +0 -8
  262. data/spec_app/spec/javascripts/helpers/to_be_array.coffee +0 -5
  263. data/spec_app/spec/javascripts/helpers/to_be_attached.coffee +0 -9
  264. data/spec_app/spec/javascripts/helpers/to_be_blank.js.coffee +0 -8
  265. data/spec_app/spec/javascripts/helpers/to_be_detached.coffee +0 -9
  266. data/spec_app/spec/javascripts/helpers/to_be_element.js.coffee +0 -8
  267. data/spec_app/spec/javascripts/helpers/to_be_error.coffee +0 -8
  268. data/spec_app/spec/javascripts/helpers/to_be_given.js.coffee +0 -8
  269. data/spec_app/spec/javascripts/helpers/to_be_hidden.js.coffee +0 -8
  270. data/spec_app/spec/javascripts/helpers/to_be_jquery.js.coffee +0 -5
  271. data/spec_app/spec/javascripts/helpers/to_be_missing.js.coffee +0 -8
  272. data/spec_app/spec/javascripts/helpers/to_be_present.js.coffee +0 -8
  273. data/spec_app/spec/javascripts/helpers/to_be_scrolled_to.coffee +0 -11
  274. data/spec_app/spec/javascripts/helpers/to_be_visible.js.coffee +0 -9
  275. data/spec_app/spec/javascripts/helpers/to_contain.js.coffee +0 -8
  276. data/spec_app/spec/javascripts/helpers/to_end_with.js.coffee +0 -11
  277. data/spec_app/spec/javascripts/helpers/to_equal_jquery.js.coffee +0 -8
  278. data/spec_app/spec/javascripts/helpers/to_equal_node_list.coffee +0 -7
  279. data/spec_app/spec/javascripts/helpers/to_equal_via_is_equal.js.coffee +0 -7
  280. data/spec_app/spec/javascripts/helpers/to_have_class.js.coffee +0 -10
  281. data/spec_app/spec/javascripts/helpers/to_have_descendant.js.coffee +0 -10
  282. data/spec_app/spec/javascripts/helpers/to_have_length.js.coffee +0 -8
  283. data/spec_app/spec/javascripts/helpers/to_have_opacity.coffee +0 -15
  284. data/spec_app/spec/javascripts/helpers/to_have_own_property.js.coffee +0 -8
  285. data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +0 -16
  286. data/spec_app/spec/javascripts/helpers/to_have_text.js.coffee +0 -9
  287. data/spec_app/spec/javascripts/helpers/to_have_unhandled_rejections.coffee +0 -18
  288. data/spec_app/spec/javascripts/helpers/to_match_list.coffee +0 -14
  289. data/spec_app/spec/javascripts/helpers/to_match_selector.coffee +0 -8
  290. data/spec_app/spec/javascripts/helpers/to_match_text.js.coffee +0 -13
  291. data/spec_app/spec/javascripts/helpers/to_match_url.coffee +0 -14
  292. data/spec_app/spec/javascripts/helpers/trigger.js.coffee +0 -200
  293. data/spec_app/spec/javascripts/helpers/wait_until_dom_ready.js.coffee +0 -5
  294. data/spec_app/spec/javascripts/support/jasmine.yml +0 -51
  295. data/spec_app/spec/javascripts/up/browser_spec.js.coffee +0 -150
  296. data/spec_app/spec/javascripts/up/classes/cache_spec.js.coffee +0 -82
  297. data/spec_app/spec/javascripts/up/classes/config_spec.coffee +0 -24
  298. data/spec_app/spec/javascripts/up/classes/divertible_chain_spec.coffee +0 -45
  299. data/spec_app/spec/javascripts/up/classes/focus_tracker_spec.coffee +0 -34
  300. data/spec_app/spec/javascripts/up/classes/params_spec.coffee +0 -557
  301. data/spec_app/spec/javascripts/up/classes/request_spec.coffee +0 -50
  302. data/spec_app/spec/javascripts/up/classes/scroll_motion_spec.js.coffee +0 -51
  303. data/spec_app/spec/javascripts/up/classes/store/memory_spec.js.coffee +0 -70
  304. data/spec_app/spec/javascripts/up/classes/store/session_spec.js.coffee +0 -114
  305. data/spec_app/spec/javascripts/up/element_spec.coffee +0 -897
  306. data/spec_app/spec/javascripts/up/event_spec.js.coffee +0 -530
  307. data/spec_app/spec/javascripts/up/feedback_spec.js.coffee +0 -401
  308. data/spec_app/spec/javascripts/up/form_spec.js.coffee +0 -1527
  309. data/spec_app/spec/javascripts/up/fragment_spec.js.coffee +0 -2624
  310. data/spec_app/spec/javascripts/up/history_spec.js.coffee +0 -340
  311. data/spec_app/spec/javascripts/up/jquery_spec.js.coffee +0 -4
  312. data/spec_app/spec/javascripts/up/legacy_spec.js.coffee +0 -27
  313. data/spec_app/spec/javascripts/up/link_spec.js.coffee +0 -1098
  314. data/spec_app/spec/javascripts/up/log_spec.js.coffee +0 -119
  315. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +0 -939
  316. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +0 -582
  317. data/spec_app/spec/javascripts/up/popup_spec.js.coffee +0 -508
  318. data/spec_app/spec/javascripts/up/protocol_spec.js.coffee +0 -39
  319. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +0 -1145
  320. data/spec_app/spec/javascripts/up/radio_spec.js.coffee +0 -212
  321. data/spec_app/spec/javascripts/up/rails_spec.js.coffee +0 -118
  322. data/spec_app/spec/javascripts/up/spec_spec.js.coffee +0 -9
  323. data/spec_app/spec/javascripts/up/syntax_spec.js.coffee +0 -304
  324. data/spec_app/spec/javascripts/up/toast_spec.js.coffee +0 -37
  325. data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +0 -163
  326. data/spec_app/spec/javascripts/up/util_spec.js.coffee +0 -1434
  327. data/spec_app/spec/javascripts/up/viewport_spec.js.coffee +0 -655
  328. data/spec_app/spec/spec_helper.rb +0 -62
  329. data/spec_app/test/controllers/.keep +0 -0
  330. data/spec_app/test/fixtures/.keep +0 -0
  331. data/spec_app/test/helpers/.keep +0 -0
  332. data/spec_app/test/integration/.keep +0 -0
  333. data/spec_app/test/mailers/.keep +0 -0
  334. data/spec_app/test/models/.keep +0 -0
  335. data/spec_app/test/test_helper.rb +0 -10
  336. data/spec_app/vendor/asset-libs/es6-promise-4.1.6/es6-promise.auto.js +0 -1159
  337. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.bower.json +0 -43
  338. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.gitignore +0 -6
  339. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.npmignore +0 -10
  340. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.pairs +0 -6
  341. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/.travis.yml +0 -56
  342. data/spec_app/vendor/asset-libs/jasmine-ajax-3.3.1/jasmine-ajax.js +0 -790
  343. data/spec_app/vendor/assets/.keep +0 -0
  344. data/unpoly-rails.gemspec +0 -24
@@ -0,0 +1,372 @@
1
+ module Unpoly
2
+ module Rails
3
+ ##
4
+ # This object allows the server to inspect the current request
5
+ # for Unpoly-related concerns such as "is this a page fragment update?".
6
+ #
7
+ # Available through the `#up` method in all controllers, helpers and views.
8
+ class Change
9
+ include Memoized
10
+ include FieldDefinition
11
+
12
+ def initialize(controller)
13
+ @controller = controller
14
+ end
15
+
16
+ # Generate helpers to get, set and cast fields in request and response headers.
17
+ field :version, Field::String
18
+ field :target, Field::String
19
+ field :fail_target, Field::String
20
+ field :validate, Field::String
21
+ field :mode, Field::String
22
+ field :fail_mode, Field::String
23
+ field :context, Field::Hash, method: :input_context
24
+ field :fail_context, Field::Hash, method: :input_fail_context
25
+ field :context_changes, Field::Hash, response_header_name: 'X-Up-Context'
26
+ field :events, Field::Array
27
+ field :clear_cache, Field::String
28
+ field :reload_from_time, Field::Time
29
+
30
+ ##
31
+ # Returns whether the current request is an
32
+ # [page fragment update](https://unpoly.com/up.replace) triggered by an
33
+ # Unpoly frontend.
34
+ def up?
35
+ # This will eventually just check for the X-Up-Version header.
36
+ # Just in case a user still has an older version of Unpoly running on the frontend,
37
+ # we also check for the X-Up-Target header.
38
+ version.present? || target.present?
39
+ end
40
+
41
+ alias_method :unpoly?, :up?
42
+
43
+ ##
44
+ # Returns the version of Unpoly running in the browser that made
45
+ # the request.
46
+ memoize def version
47
+ version_from_request
48
+ end
49
+
50
+ ##
51
+ # Returns the CSS selector for a fragment that Unpoly will update in
52
+ # case of a successful response (200 status code).
53
+ #
54
+ # The Unpoly frontend will expect an HTML response containing an element
55
+ # that matches this selector.
56
+ #
57
+ # Server-side code is free to optimize its successful response by only returning HTML
58
+ # that matches this selector.
59
+ def target
60
+ @server_target || target_from_request
61
+ end
62
+
63
+ def target=(new_target)
64
+ @server_target = new_target
65
+ end
66
+
67
+ def target_changed?
68
+ target != target_from_request
69
+ end
70
+
71
+ ##
72
+ # Returns whether the given CSS selector is targeted by the current fragment
73
+ # update in case of a successful response (200 status code).
74
+ #
75
+ # Note that the matching logic is very simplistic and does not actually know
76
+ # how your page layout is structured. It will return `true` if
77
+ # the tested selector and the requested CSS selector matches exactly, or if the
78
+ # requested selector is `body` or `html`.
79
+ #
80
+ # Always returns `true` if the current request is not an Unpoly fragment update.
81
+ def target?(tested_target)
82
+ test_target(target, tested_target)
83
+ end
84
+
85
+ def render_nothing(options = {})
86
+ status = options.fetch(:status, :ok)
87
+ self.target = ':none'
88
+ controller.head(status)
89
+ end
90
+
91
+ ##
92
+ # Returns the CSS selector for a fragment that Unpoly will update in
93
+ # case of an failed response. Server errors or validation failures are
94
+ # all examples for a failed response (non-200 status code).
95
+ #
96
+ # The Unpoly frontend will expect an HTML response containing an element
97
+ # that matches this selector.
98
+ #
99
+ # Server-side code is free to optimize its response by only returning HTML
100
+ # that matches this selector.
101
+ #
102
+ memoize def fail_target
103
+ @server_target || fail_target_from_request
104
+ end
105
+
106
+ ##
107
+ # Returns whether the given CSS selector is targeted by the current fragment
108
+ # update in case of a failed response (non-200 status code).
109
+ #
110
+ # Note that the matching logic is very simplistic and does not actually know
111
+ # how your page layout is structured. It will return `true` if
112
+ # the tested selector and the requested CSS selector matches exactly, or if the
113
+ # requested selector is `body` or `html`.
114
+ #
115
+ # Always returns `true` if the current request is not an Unpoly fragment update.
116
+ def fail_target?(tested_target)
117
+ test_target(fail_target, tested_target)
118
+ end
119
+
120
+ ##
121
+ # Returns whether the given CSS selector is targeted by the current fragment
122
+ # update for either a success or a failed response.
123
+ #
124
+ # Note that the matching logic is very simplistic and does not actually know
125
+ # how your page layout is structured. It will return `true` if
126
+ # the tested selector and the requested CSS selector matches exactly, or if the
127
+ # requested selector is `body` or `html`.
128
+ #
129
+ # Always returns `true` if the current request is not an Unpoly fragment update.
130
+ def any_target?(tested_target)
131
+ target?(tested_target) || fail_target?(tested_target)
132
+ end
133
+
134
+ ##
135
+ # Returns whether the current form submission should be
136
+ # [validated](https://unpoly.com/input-up-validate) (and not be saved to the database).
137
+ def validate?
138
+ validate.present?
139
+ end
140
+
141
+ alias validating? validate?
142
+
143
+ ##
144
+ # If the current form submission is a [validation](https://unpoly.com/input-up-validate),
145
+ # this returns the name attribute of the form field that has triggered
146
+ # the validation.
147
+ memoize def validate
148
+ validate_from_request
149
+ end
150
+
151
+ alias validate_name validate
152
+
153
+ ##
154
+ # TODO: Docs
155
+ memoize def mode
156
+ mode_from_request
157
+ end
158
+
159
+ ##
160
+ # TODO: Docs
161
+ memoize def fail_mode
162
+ fail_mode_from_request
163
+ end
164
+
165
+ ##
166
+ # Returns the context object as sent from the frontend,
167
+ # before any changes made on the server.
168
+ #
169
+ memoize def input_context
170
+ input_context_from_request
171
+ end
172
+
173
+ ##
174
+ # TODO: Docs
175
+ memoize def context
176
+ Context.new(input_context, unfinalized_context_changes)
177
+ end
178
+
179
+ memoize def unfinalized_context_changes
180
+ context_changes_from_params&.dup || {}
181
+ end
182
+
183
+ def context_changes
184
+ context.finalize_changes
185
+ fail_context.finalize_changes
186
+ unfinalized_context_changes
187
+ end
188
+
189
+ ##
190
+ # Returns the context object for failed responses as
191
+ # sent from the frontend, before any changes made on the server.
192
+ #
193
+ memoize def input_fail_context
194
+ input_fail_context_from_request
195
+ end
196
+
197
+ ##
198
+ # TODO: Docs
199
+ memoize def fail_context
200
+ Context.new(input_fail_context, unfinalized_context_changes)
201
+ end
202
+
203
+ memoize def events
204
+ # Events are outgoing only. They wouldn't be passed as a request header.
205
+ # We might however pass them as params so they can survive a redirect.
206
+ events_from_params.dup
207
+ end
208
+
209
+ ##
210
+ # TODO: Docs
211
+ def emit(*args)
212
+ event_plan = args.extract_options!
213
+
214
+ # We support two call styles:
215
+ # up.emit('event:type', prop: value)
216
+ # up.emit(type: 'event:type', prop: value)
217
+ if args[0].is_a?(String)
218
+ event_plan[:type] = args[0]
219
+ end
220
+
221
+ # Track the given props in an array. If the method is called a second time,
222
+ # we can re-set the X-Up-Events header with the first and second props hash.
223
+ events.push(event_plan)
224
+ end
225
+
226
+ ##
227
+ # Forces Unpoly to use the given string as the document title when processing
228
+ # this response.
229
+ #
230
+ # This is useful when you skip rendering the `<head>` in an Unpoly request.
231
+ def title=(new_title)
232
+ # We don't make this a field since it belongs to *this* response
233
+ # and should not survive a redirect.
234
+ response.headers['X-Up-Title'] = new_title
235
+ end
236
+
237
+ def after_action
238
+ write_events_to_response_headers
239
+
240
+ write_clear_cache_to_response_headers
241
+
242
+ if context_changes.present?
243
+ write_context_changes_to_response_headers
244
+ end
245
+
246
+ if target_changed?
247
+ # Only write the target to the response if it has changed.
248
+ # The client might have a more abstract target like :main
249
+ # that we don't want to override with an echo of the first match.
250
+ write_target_to_response_headers
251
+ end
252
+ end
253
+
254
+ def url_with_field_values(url)
255
+ append_params_to_url(url, fields_as_params)
256
+ end
257
+
258
+ # Used by RequestEchoHeaders to prevent up[...] params from showing up
259
+ # in a history URL.
260
+ def request_url_without_up_params
261
+ original_url = request.original_url
262
+
263
+ original_url.include?(Field::PARAM_PREFIX) or return original_url
264
+
265
+ # Parse the URL to extract the ?query part below.
266
+ uri = URI.parse(original_url)
267
+
268
+ # This parses the query as a flat list of key/value pairs.
269
+ params = Rack::Utils.parse_query(uri.query)
270
+
271
+ # We only used the up[...] params to transport headers, but we don't
272
+ # want them to appear in a history URL.
273
+ non_up_params = params.reject { |key, _value| key.starts_with?(Field::PARAM_PREFIX) }
274
+
275
+ append_params_to_url(uri.path, non_up_params)
276
+ end
277
+
278
+ memoize def layer
279
+ Layer.new(self, mode: mode, context: context)
280
+ end
281
+
282
+ memoize def fail_layer
283
+ Layer.new(self, mode: fail_mode, context: fail_context)
284
+ end
285
+
286
+ memoize def cache
287
+ Cache.new(self)
288
+ end
289
+
290
+ def clear_cache
291
+ # Cache commands are outgoing only. They wouldn't be passed as a request header.
292
+ # We might however pass them as params so they can survive a redirect.
293
+ if @clear_cache.nil?
294
+ clear_cache_from_params
295
+ else
296
+ @clear_cache
297
+ end
298
+ end
299
+
300
+ def clear_cache=(value)
301
+ @clear_cache = value
302
+ end
303
+
304
+ def reload_from_time
305
+ reload_from_time_from_request
306
+ end
307
+
308
+ def reload?
309
+ !!reload_from_time
310
+ end
311
+
312
+ private
313
+
314
+ attr_reader :controller
315
+
316
+ delegate :request, :params, :response, to: :controller
317
+
318
+ def test_target(frontend_target, tested_target)
319
+ # We must test whether the frontend has passed us a target.
320
+ # The user may have chosen to not reveal their target for better
321
+ # cacheability (see up.network.config#requestMetaKeys).
322
+ if up? && frontend_target.present?
323
+ parts = frontend_target.split(/\s*,\s*/)
324
+ parts.any? do |part|
325
+ if part == tested_target
326
+ true
327
+ elsif part == 'html'
328
+ true
329
+ elsif part == 'body'
330
+ not ['head', 'title', 'meta'].include?(tested_target)
331
+ else
332
+ false
333
+ end
334
+ end
335
+ else
336
+ true
337
+ end
338
+ end
339
+
340
+ def fields_as_params
341
+ params = {}
342
+ params[version_param_name] = serialized_version
343
+ params[target_param_name] = serialized_target
344
+ params[fail_target_param_name] = serialized_fail_target
345
+ params[validate_param_name] = serialized_validate
346
+ params[mode_param_name] = serialized_mode
347
+ params[fail_mode_param_name] = serialized_fail_mode
348
+ params[input_context_param_name] = serialized_input_context
349
+ params[input_fail_context_param_name] = serialized_input_fail_context
350
+ params[context_changes_param_name] = serialized_context_changes
351
+ params[events_param_name] = serialized_events
352
+ params[clear_cache_param_name] = serialized_clear_cache
353
+ params[reload_from_time_param_name] = serialized_reload_from_time
354
+
355
+ # Don't send empty response headers.
356
+ params = params.select { |_key, value| value.present? }
357
+
358
+ params
359
+ end
360
+
361
+ def append_params_to_url(url, params)
362
+ if params.blank?
363
+ url
364
+ else
365
+ separator = url.include?('?') ? '&' : '?'
366
+ [url, params.to_query].join(separator)
367
+ end
368
+ end
369
+
370
+ end
371
+ end
372
+ end
@@ -0,0 +1,47 @@
1
+ module Unpoly
2
+ module Rails
3
+ ##
4
+ # This adds two methods `#up` and `#up?` to all controllers,
5
+ # helpers and views, allowing the server to inspect the current request
6
+ # for Unpoly-related concerns such as "is this a page fragment update?".
7
+ module Controller
8
+
9
+ def self.prepended(base)
10
+ base.helper_method :up, :up?, :unpoly, :unpoly?
11
+ if base.respond_to?(:after_action)
12
+ base.after_action { up.after_action }
13
+ else
14
+ base.after_filter { up.after_action }
15
+ end
16
+ end
17
+
18
+ ##
19
+ # TODO: Docs
20
+ def up
21
+ @up_change ||= Change.new(self)
22
+ end
23
+
24
+ alias_method :unpoly, :up
25
+
26
+ ##
27
+ # :method: up?
28
+ # Returns whether the current request is an
29
+ # [page fragment update](https://unpoly.com/up.replace) triggered by an
30
+ # Unpoly frontend.
31
+ delegate :up?, :unpoly?, to: :up
32
+
33
+ ##
34
+ # TODO: Docs
35
+ def redirect_to(target, *args)
36
+ if up?
37
+ target = url_for(target)
38
+ target = up.url_with_field_values(target)
39
+ end
40
+ super(target, *args)
41
+ end
42
+
43
+ ActionController::Base.prepend(self)
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ module Unpoly
2
+ module Rails
3
+ class Error < StandardError; end
4
+ end
5
+ end
@@ -20,8 +20,8 @@ module Unpoly
20
20
  private
21
21
 
22
22
  def set_up_request_echo_headers
23
- headers['X-Up-Location'] = request.original_url
24
- headers['X-Up-Method'] = request.method
23
+ response.headers['X-Up-Location'] = up.request_url_without_up_params
24
+ response.headers['X-Up-Method'] = request.method
25
25
  end
26
26
 
27
27
  ActionController::Base.send(:include, self)
@@ -4,6 +4,6 @@ module Unpoly
4
4
  # The current version of the unpoly-rails gem.
5
5
  # This version number is also used for releases of the Unpoly
6
6
  # frontend code.
7
- VERSION = '1.0.3'
7
+ VERSION = '2.0.0-rc2'
8
8
  end
9
9
  end
@@ -0,0 +1,45 @@
1
+ require 'unpoly/rails/version'
2
+
3
+ module Unpoly
4
+ module Tasks
5
+ SPROCKETS_MANIFESTS = %w(
6
+ unpoly.js
7
+ unpoly.css
8
+ unpoly-migrate.js
9
+ unpoly-bootstrap3.js
10
+ unpoly-bootstrap3.css
11
+ unpoly-bootstrap4.js
12
+ unpoly-bootstrap4.css
13
+ unpoly-bootstrap5.js
14
+ unpoly-bootstrap5.css
15
+ )
16
+
17
+ SPROCKETS_SOURCES = %w(lib/assets/javascripts lib/assets/stylesheets)
18
+
19
+ SPROCKETS_OUTPUT_FOLDER = 'dist'
20
+
21
+ NPM_MANIFEST = 'package.json'
22
+
23
+ # VISIBLE_TASKS = %w(
24
+ # publish:build
25
+ # publish:clean
26
+ # publish:commit
27
+ # publish:release
28
+ # publish:all
29
+ # )
30
+
31
+ module_function
32
+
33
+ def pre_release?
34
+ Unpoly::Rails::VERSION =~ /rc|beta|pre|alpha/
35
+ end
36
+
37
+ def dist_paths
38
+ Dir["#{SPROCKETS_OUTPUT_FOLDER}/**/*.{js,css}"]
39
+ end
40
+
41
+ def run(command)
42
+ system(command) or raise "Error running command: #{command}"
43
+ end
44
+ end
45
+ end
data/lib/unpoly-rails.rb CHANGED
@@ -1,7 +1,13 @@
1
+ require 'memoized'
1
2
  require 'unpoly/rails/version'
3
+ require 'unpoly/rails/error'
2
4
  require 'unpoly/rails/engine'
3
5
  require 'unpoly/rails/request_echo_headers'
4
6
  require 'unpoly/rails/request_method_cookie'
5
- require 'unpoly/rails/inspector'
6
- require 'unpoly/rails/inspector_accessor'
7
-
7
+ require 'unpoly/rails/change/field_definition'
8
+ require 'unpoly/rails/change/field'
9
+ require 'unpoly/rails/change/layer'
10
+ require 'unpoly/rails/change/cache'
11
+ require 'unpoly/rails/change/context'
12
+ require 'unpoly/rails/change'
13
+ require 'unpoly/rails/controller'