superglue 0.40.0
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.
- checksums.yaml +7 -0
- data/lib/generators/rails/scaffold_controller_generator.rb +12 -0
- data/lib/generators/rails/superglue_generator.rb +92 -0
- data/lib/generators/rails/templates/_form.json.props +13 -0
- data/lib/generators/rails/templates/controller.rb.tt +82 -0
- data/lib/generators/rails/templates/edit.json.props +14 -0
- data/lib/generators/rails/templates/index.json.props +13 -0
- data/lib/generators/rails/templates/new.json.props +15 -0
- data/lib/generators/rails/templates/show.json.props +7 -0
- data/lib/generators/rails/templates/web/edit.html.erb +12 -0
- data/lib/generators/rails/templates/web/edit.js +31 -0
- data/lib/generators/rails/templates/web/index.html.erb +7 -0
- data/lib/generators/rails/templates/web/index.js +49 -0
- data/lib/generators/rails/templates/web/new.html.erb +7 -0
- data/lib/generators/rails/templates/web/new.js +29 -0
- data/lib/generators/rails/templates/web/show.html.erb +7 -0
- data/lib/generators/rails/templates/web/show.js +28 -0
- data/lib/install/templates/web/action_creators.js +14 -0
- data/lib/install/templates/web/actions.js +4 -0
- data/lib/install/templates/web/application.js +114 -0
- data/lib/install/templates/web/application.json.props +27 -0
- data/lib/install/templates/web/application_visit.js +65 -0
- data/lib/install/templates/web/initializer.rb +1 -0
- data/lib/install/templates/web/reducer.js +72 -0
- data/lib/install/web.rb +66 -0
- data/lib/superglue/helpers.rb +552 -0
- data/lib/superglue/redirection.rb +30 -0
- data/lib/superglue.rb +38 -0
- data/lib/tasks/install.rake +42 -0
- data/test/engine_test.rb +7 -0
- data/test/helpers_test.rb +23 -0
- data/test/render_test.rb +81 -0
- data/test/test_helper.rb +20 -0
- 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
|
+
|
data/test/engine_test.rb
ADDED
@@ -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
|
data/test/render_test.rb
ADDED
@@ -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
|
data/test/test_helper.rb
ADDED
@@ -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
|