superglue 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +7 -0
  2. data/lib/generators/rails/scaffold_controller_generator.rb +12 -0
  3. data/lib/generators/rails/superglue_generator.rb +92 -0
  4. data/lib/generators/rails/templates/_form.json.props +13 -0
  5. data/lib/generators/rails/templates/controller.rb.tt +82 -0
  6. data/lib/generators/rails/templates/edit.json.props +14 -0
  7. data/lib/generators/rails/templates/index.json.props +13 -0
  8. data/lib/generators/rails/templates/new.json.props +15 -0
  9. data/lib/generators/rails/templates/show.json.props +7 -0
  10. data/lib/generators/rails/templates/web/edit.html.erb +12 -0
  11. data/lib/generators/rails/templates/web/edit.js +31 -0
  12. data/lib/generators/rails/templates/web/index.html.erb +7 -0
  13. data/lib/generators/rails/templates/web/index.js +49 -0
  14. data/lib/generators/rails/templates/web/new.html.erb +7 -0
  15. data/lib/generators/rails/templates/web/new.js +29 -0
  16. data/lib/generators/rails/templates/web/show.html.erb +7 -0
  17. data/lib/generators/rails/templates/web/show.js +28 -0
  18. data/lib/install/templates/web/action_creators.js +14 -0
  19. data/lib/install/templates/web/actions.js +4 -0
  20. data/lib/install/templates/web/application.js +114 -0
  21. data/lib/install/templates/web/application.json.props +27 -0
  22. data/lib/install/templates/web/application_visit.js +65 -0
  23. data/lib/install/templates/web/initializer.rb +1 -0
  24. data/lib/install/templates/web/reducer.js +72 -0
  25. data/lib/install/web.rb +66 -0
  26. data/lib/superglue/helpers.rb +552 -0
  27. data/lib/superglue/redirection.rb +30 -0
  28. data/lib/superglue.rb +38 -0
  29. data/lib/tasks/install.rake +42 -0
  30. data/test/engine_test.rb +7 -0
  31. data/test/helpers_test.rb +23 -0
  32. data/test/render_test.rb +81 -0
  33. data/test/test_helper.rb +20 -0
  34. metadata +218 -0
@@ -0,0 +1,30 @@
1
+ module Superglue
2
+ module Redirection
3
+ def _compute_redirect_to_location(request, options)
4
+ computed_location = URI.parse(super)
5
+ next_param = Rack::Utils
6
+ .parse_nested_query(computed_location.query)
7
+
8
+ if request.params[:__] == "0"
9
+ computed_location.query = next_param.merge({__: "0"}).to_query
10
+ end
11
+
12
+ computed_location.to_s
13
+ end
14
+
15
+ def redirect_back_with_props_at(opts)
16
+ if request.referrer && params[:props_at]
17
+ referrer_url = URI.parse(request.referrer)
18
+ referrer_url.query = Rack::Utils
19
+ .parse_nested_query(referrer_url.query)
20
+ .merge({props_at: params[:props_at]})
21
+ .to_query
22
+
23
+ redirect_to referrer_url.to_s, opts
24
+ else
25
+ redirect_back(opts)
26
+ end
27
+ end
28
+ end
29
+ end
30
+
data/lib/superglue.rb ADDED
@@ -0,0 +1,38 @@
1
+ require 'superglue/helpers'
2
+ require 'superglue/redirection'
3
+ require 'props_template'
4
+
5
+ module Superglue
6
+ module Controller
7
+ include Helpers, Redirection
8
+
9
+ def self.included(base)
10
+ if base.respond_to?(:helper_method)
11
+ base.helper_method :param_to_search_path
12
+ base.helper_method :props_from_form_with
13
+ base.helper_method :search_path_to_camelized_param
14
+ end
15
+ end
16
+ end
17
+
18
+ class Engine < ::Rails::Engine
19
+ config.superglue = ActiveSupport::OrderedOptions.new
20
+ config.superglue.auto_include = true
21
+
22
+ generators do |app|
23
+ Rails::Generators.configure! app.config.generators
24
+ Rails::Generators.hidden_namespaces.uniq!
25
+ require 'generators/rails/scaffold_controller_generator'
26
+ end
27
+
28
+ initializer :superglue do |app|
29
+ ActiveSupport.on_load(:action_controller) do
30
+ next if self != ActionController::Base
31
+
32
+ if app.config.superglue.auto_include
33
+ include Controller
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,42 @@
1
+ namespace :superglue do
2
+ desc "Verifies if any version of Yarn is installed"
3
+ task :verify_yarn do
4
+ begin
5
+ yarn_version = `yarn --version`
6
+ raise Errno::ENOENT if yarn_version.blank?
7
+ rescue Errno::ENOENT
8
+ $stderr.puts "Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/"
9
+ $stderr.puts "Exiting!" && exit!
10
+ end
11
+ end
12
+
13
+ desc "Verifies if any version of react is in package.json"
14
+ task :verify_react do
15
+ package_json = JSON.parse(File.read(Rails.root.join("package.json")))
16
+
17
+ if package_json['dependencies']['react'].nil?
18
+ $stderr.puts "React not installed. Did you install React? https://github.com/rails/webpacker#react"
19
+ $stderr.puts "Exiting!" && exit!
20
+ end
21
+ end
22
+
23
+ desc "Verifies webpacker has been installed"
24
+ task "verify_webpacker" do
25
+ begin
26
+ require "webpacker/configuration"
27
+ rescue LoadError
28
+ $stderr.puts "Superglue's web install requires webpacker!"
29
+ $stderr.puts "https://github.com/rails/webpacker#installation"
30
+ $stderr.puts "Exiting!" && exit!
31
+ end
32
+ end
33
+
34
+ namespace :install do
35
+ desc "Install everything needed for superglue web"
36
+ task 'web' => ["superglue:verify_webpacker", "webpacker:verify_install", "superglue:verify_react"] do
37
+ template = File.expand_path("../install/web.rb", __dir__)
38
+ exec "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{template}"
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class EngineTest < ActiveSupport::TestCase
4
+ test "does not include itself in action controller base when superglue auto include is false" do
5
+ refute ActionController::Base.included_modules.any? { |m| m.name && m.name.include?('Superglue') }
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class HelpersTest < ActiveSupport::TestCase
4
+ include Superglue::Helpers
5
+
6
+ test 'clean_props_at returns nil if qry is nil' do
7
+ qry = nil
8
+
9
+ assert_nil param_to_search_path(qry)
10
+ end
11
+
12
+ test 'clean_props_at returns a refined qry' do
13
+ qry = 'foo...bar/?)()-'
14
+
15
+ assert_equal param_to_search_path(qry), ['foo', 'bar']
16
+ end
17
+
18
+ test 'camelize_path' do
19
+ path = ['foo_bar', 'foo_bar=1', 'foo_baz_roo']
20
+
21
+ assert_equal search_path_to_camelized_param(path), 'fooBar.fooBar=1.fooBazRoo'
22
+ end
23
+ end
@@ -0,0 +1,81 @@
1
+ require 'test_helper'
2
+
3
+ class RenderController < TestController
4
+ require 'action_view/testing/resolvers'
5
+
6
+ append_view_path(ActionView::FixtureResolver.new(
7
+ 'render/simple_render_with_superglue.json.props' => 'json.author "john smith"',
8
+ 'render/simple_render_with_superglue_with_bad_layout.json.props' => 'json.author "john smith"',
9
+ 'layouts/application.json.props' => 'json.data {yield json}',
10
+ 'layouts/does_not_exist.html.erb' => '',
11
+ 'layouts/application.html.erb' => <<~HTML
12
+ <html>
13
+ <head>
14
+ <script><%= @initial_state.strip.html_safe %></script>
15
+ </head>
16
+ <body><%=yield%></body>
17
+ </html>
18
+ HTML
19
+ ))
20
+
21
+ layout 'application'
22
+
23
+ def render_action
24
+ render :action
25
+ end
26
+
27
+ def simple_render_with_superglue
28
+ @initial_state = render_to_string(formats: [:json], layout: true)
29
+ render inline: '', layout: true
30
+ end
31
+
32
+ def simple_render_with_superglue_with_bad_layout
33
+ @initial_state = render_to_string(formats: [:json], layout: 'does_not_exist')
34
+ render inline: '', layout: true
35
+ end
36
+
37
+ def form_authenticity_token
38
+ "secret"
39
+ end
40
+ end
41
+
42
+ class RenderTest < ActionController::TestCase
43
+ tests RenderController
44
+
45
+
46
+ setup do
47
+ if Rails.version >= '6'
48
+ # In rails 6, the fixture orders the templates based on their appearance in the handler
49
+ # This doesn't happen IRL, so I'm going to explicitly set the handler here.
50
+ #
51
+ # Note that the original is the following
52
+ # @controller.lookup_context.handlers = [:raw, :superglue, :erb, :js, :html, :builder, :ruby]
53
+ @controller.lookup_context.handlers = [:props, :erb]
54
+ end
55
+ end
56
+
57
+ test "simple render with superglue" do
58
+ get :simple_render_with_superglue
59
+
60
+ assert_response 200
61
+ rendered = <<~HTML
62
+ <html>
63
+ <head>
64
+ <script>{"data":{"author":"john smith"}}</script>
65
+ </head>
66
+ <body></body>
67
+ </html>
68
+ HTML
69
+
70
+ assert_equal rendered, @response.body
71
+ assert_equal 'text/html', @response.media_type
72
+ end
73
+
74
+ test "simple render when the layout doesn't exist" do
75
+ err = assert_raise ActionView::MissingTemplate do |e|
76
+ get :simple_render_with_superglue_with_bad_layout
77
+ end
78
+
79
+ assert_equal(true, err.message.starts_with?('Missing template layouts/does_not_exist with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:props, :erb]}.'))
80
+ end
81
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails'
2
+ require 'abstract_controller'
3
+ require 'abstract_controller/railties/routes_helpers'
4
+ require 'action_controller'
5
+ require 'superglue'
6
+ require "active_support"
7
+ require 'active_record'
8
+ require 'active_support/testing/autorun'
9
+ require 'active_support/test_case'
10
+
11
+ require 'props_template'
12
+
13
+ ActiveSupport::TestCase.test_order = :random if ActiveSupport::TestCase.respond_to?(:test_order=)
14
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
15
+ Rails.cache = ActiveSupport::Cache::MemoryStore.new
16
+
17
+ load File.dirname(__FILE__) + '/support/schema.rb'
18
+ require 'support/models'
19
+ require 'support/test_application'
20
+
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: superglue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.40.0
5
+ platform: ruby
6
+ authors:
7
+ - Johny Ho
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: props_template
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.21.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.21.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: webpacker
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activerecord
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '6.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '6.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '12.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '12.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '9.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '9.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.3'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.3'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '5.10'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '5.10'
125
+ - !ruby/object:Gem::Dependency
126
+ name: capybara
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: selenium-webdriver
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.11'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.11'
153
+ description: Rails integration for SuperglueJS
154
+ email: jho406@gmail.com
155
+ executables: []
156
+ extensions: []
157
+ extra_rdoc_files: []
158
+ files:
159
+ - lib/generators/rails/scaffold_controller_generator.rb
160
+ - lib/generators/rails/superglue_generator.rb
161
+ - lib/generators/rails/templates/_form.json.props
162
+ - lib/generators/rails/templates/controller.rb.tt
163
+ - lib/generators/rails/templates/edit.json.props
164
+ - lib/generators/rails/templates/index.json.props
165
+ - lib/generators/rails/templates/new.json.props
166
+ - lib/generators/rails/templates/show.json.props
167
+ - lib/generators/rails/templates/web/edit.html.erb
168
+ - lib/generators/rails/templates/web/edit.js
169
+ - lib/generators/rails/templates/web/index.html.erb
170
+ - lib/generators/rails/templates/web/index.js
171
+ - lib/generators/rails/templates/web/new.html.erb
172
+ - lib/generators/rails/templates/web/new.js
173
+ - lib/generators/rails/templates/web/show.html.erb
174
+ - lib/generators/rails/templates/web/show.js
175
+ - lib/install/templates/web/action_creators.js
176
+ - lib/install/templates/web/actions.js
177
+ - lib/install/templates/web/application.js
178
+ - lib/install/templates/web/application.json.props
179
+ - lib/install/templates/web/application_visit.js
180
+ - lib/install/templates/web/initializer.rb
181
+ - lib/install/templates/web/reducer.js
182
+ - lib/install/web.rb
183
+ - lib/superglue.rb
184
+ - lib/superglue/helpers.rb
185
+ - lib/superglue/redirection.rb
186
+ - lib/tasks/install.rake
187
+ - test/engine_test.rb
188
+ - test/helpers_test.rb
189
+ - test/render_test.rb
190
+ - test/test_helper.rb
191
+ homepage: https://github.com/thoughtbot/superglue/
192
+ licenses:
193
+ - MIT
194
+ metadata: {}
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubygems_version: 3.1.4
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Rails integration for SuperglueJS
214
+ test_files:
215
+ - test/render_test.rb
216
+ - test/helpers_test.rb
217
+ - test/engine_test.rb
218
+ - test/test_helper.rb