phlex-rails 0.6.1 → 0.7.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/phlex/component/USAGE +8 -0
  3. data/lib/generators/phlex/component/component_generator.rb +12 -0
  4. data/lib/generators/phlex/component/templates/component.rb.erb +9 -0
  5. data/lib/generators/phlex/controller/USAGE +2 -2
  6. data/lib/generators/phlex/controller/controller_generator.rb +56 -54
  7. data/lib/generators/phlex/controller/templates/controller.rb.erb +5 -1
  8. data/lib/generators/phlex/controller/templates/view.rb.erb +7 -10
  9. data/lib/generators/phlex/install/USAGE +8 -0
  10. data/lib/generators/phlex/install/install_generator.rb +61 -0
  11. data/lib/generators/phlex/install/templates/application_component.rb +12 -0
  12. data/lib/generators/phlex/install/templates/application_layout.rb +24 -0
  13. data/lib/generators/phlex/install/templates/application_view.rb +9 -0
  14. data/lib/generators/phlex/view/USAGE +2 -3
  15. data/lib/generators/phlex/view/templates/view.rb.erb +7 -12
  16. data/lib/generators/phlex/view/view_generator.rb +6 -17
  17. data/lib/phlex/rails/helpers/routes.rb +2 -0
  18. data/lib/phlex/rails/helpers/tag.rb +4 -0
  19. data/lib/phlex/rails/helpers/turbo_stream.rb +14 -0
  20. data/lib/phlex/rails/helpers.rb +7 -7
  21. data/lib/phlex/rails/html/format.rb +7 -0
  22. data/lib/phlex/rails/layout.rb +45 -0
  23. data/lib/phlex/rails/{html → sgml}/append_method_added_warning.rb +2 -2
  24. data/lib/phlex/rails/{html → sgml}/class_methods.rb +1 -1
  25. data/lib/phlex/rails/{html → sgml}/overrides.rb +17 -16
  26. data/lib/phlex/rails/version.rb +1 -1
  27. data/lib/phlex/rails.rb +21 -9
  28. metadata +21 -25
  29. data/lib/generators/phlex/layout/USAGE +0 -8
  30. data/lib/generators/phlex/layout/layout_generator.rb +0 -13
  31. data/lib/generators/phlex/layout/templates/layout.rb.erb +0 -30
  32. data/lib/generators/phlex/page/USAGE +0 -8
  33. data/lib/generators/phlex/page/page_generator.rb +0 -13
  34. data/lib/generators/phlex/page/templates/page.rb.erb +0 -11
  35. data/lib/install/phlex.rb +0 -26
  36. data/lib/tasks/phlex_tasks.rake +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a8bd607660e006f23f20771fbe0436868b61b8d6d1ad068cb594851c5acb2b0
4
- data.tar.gz: 66667a6b88c77bfedea6b3381efc0d13c08659ebc82b82f0ab92aa7fd9c7c028
3
+ metadata.gz: 90e5d36afb3e649892cc3e9c72fb4f5f9e7b6638ae50c95a0791ede0afe4355b
4
+ data.tar.gz: 22ae3aecb60afc9e72be8bc5e7b13736e9901ccb0ada86d5a2dbfa5a69319166
5
5
  SHA512:
6
- metadata.gz: b313cf89df6a1afc6effdcaceced045e32f9c58f17e2623c9672c4101842e19d2ce5b33e587034b6713f6dd0a099276e5d9425b7579a88af83e0c8ddb264fedb
7
- data.tar.gz: 8f6e2347f5c189f8b7d893838e0eba727980c80f9f4678baea8e38cfd5f6b5d3b8b26cbe788c5dfdf56cd4ef6d238943380c7a7b5582789c79ff592481408551
6
+ metadata.gz: 833b460794df4a260a766ebbf226b62d8b482e6c62a0c847499c9f59ce2a6b620e626885a8bd0ace726046ee095d32d95673c0fa5ad2a62d0c929520c6989710
7
+ data.tar.gz: 995bce4e399888efb0c35fd3f6a0d5c8c6fab5a7b230b613b4c61e71946c4380643dae8273e1ad4cab86a61c04f7a1d43b7229b86c4c0817e42b84a7db8f06fe
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generates a Phlex component with the given name
3
+
4
+ Example:
5
+ rails generate phlex:component Sidebar
6
+
7
+ This will create:
8
+ app/components/sidebar_component.rb
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Phlex::Generators
4
+ class ComponentGenerator < ::Rails::Generators::NamedBase
5
+ source_root File.expand_path("templates", __dir__)
6
+
7
+ def create_view
8
+ @path = File.join("app/views/components", class_path, "#{file_name}_component.rb")
9
+ template "component.rb.erb", @path
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %>Component < ApplicationComponent
5
+ def template
6
+ h1 { "<%= class_name %>" }
7
+ p { "Find me in <%= @path %>" }
8
+ end
9
+ end<% end %>
@@ -6,5 +6,5 @@ Example:
6
6
 
7
7
  This will create:
8
8
  app/controllers/articles_controller.rb
9
- app/views/articles/index.rb
10
- app/views/articles/show.rb
9
+ app/views/articles/index_view.rb
10
+ app/views/articles/show_view.rb
@@ -1,72 +1,74 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Phlex
4
- module Generators
5
- class ControllerGenerator < ::Rails::Generators::NamedBase # :nodoc:
6
- source_root File.expand_path("templates", __dir__)
7
-
8
- argument :actions,
9
- type: :array,
10
- default: [],
11
- banner: "action action"
12
-
13
- class_option :skip_routes,
14
- type: :boolean,
15
- desc: "Don't add routes to config/routes.rb."
16
-
17
- class_option :parent,
18
- type: :string,
19
- default: "ApplicationController",
20
- desc: "The parent class for the generated controller"
21
-
22
- check_class_collision suffix: "Controller"
23
-
24
- def create_controller_files
25
- template "controller.rb.erb", File.join("app/controllers", class_path, "#{file_name}_controller.rb")
26
- end
3
+ module Phlex::Generators
4
+ class ControllerGenerator < ::Rails::Generators::NamedBase # :nodoc:
5
+ source_root File.expand_path("templates", __dir__)
6
+
7
+ check_class_collision suffix: "Controller"
8
+
9
+ argument :actions,
10
+ type: :array,
11
+ default: [],
12
+ banner: "action action"
13
+
14
+ class_option :skip_routes,
15
+ type: :boolean,
16
+ desc: "Don't add routes to config/routes.rb."
17
+
18
+ class_option :parent,
19
+ type: :string,
20
+ default: "ApplicationController",
21
+ desc: "The parent class for the generated controller"
22
+
23
+ def create_controllers
24
+ template "controller.rb.erb", File.join(
25
+ "app/controllers", class_path, "#{file_name}_controller.rb"
26
+ )
27
+ end
27
28
 
28
- def copy_view_files
29
- base_path = File.join("app/views", class_path, file_name)
30
- empty_directory base_path
29
+ def copy_views
30
+ actions.each do |action|
31
+ @action = action
32
+ @path = File.join(
33
+ "app/views", class_path, file_name, "#{action}_view.rb"
34
+ )
31
35
 
32
- actions.each do |action|
33
- ::Rails::Generators.invoke("phlex:page", [name + "/" + action])
34
- end
36
+ template "view.rb.erb", @path
35
37
  end
38
+ end
36
39
 
37
- def add_routes
38
- return if options[:skip_routes]
39
-
40
- routing_code = "resources :#{file_name}"
40
+ def add_routes
41
+ return if options[:skip_routes]
41
42
 
42
- if actions.any?
43
- routing_code << ", only: [#{actions.map { ":#{_1}" }.join(', ')}]"
44
- end
43
+ routing_code = "resources :#{file_name}"
45
44
 
46
- route routing_code, namespace: regular_class_path
45
+ if actions.any?
46
+ routing_code << ", only: [#{actions.map { ":#{_1}" }.join(', ')}]"
47
47
  end
48
48
 
49
- hook_for :test_framework, as: :controller do |generator|
50
- invoke generator, [remove_possible_suffix(name), actions]
51
- end
49
+ route routing_code, namespace: regular_class_path
50
+ end
52
51
 
53
- private
52
+ hook_for :test_framework, as: :controller do |generator|
53
+ invoke generator, [remove_possible_suffix(name), actions]
54
+ end
54
55
 
55
- def parent_class_name
56
- options[:parent]
57
- end
56
+ private
58
57
 
59
- def file_name
60
- remove_possible_suffix(super)
61
- end
58
+ def parent_class_name
59
+ options[:parent]
60
+ end
62
61
 
63
- def name
64
- remove_possible_suffix(super)
65
- end
62
+ def file_name
63
+ remove_possible_suffix(super)
64
+ end
66
65
 
67
- def remove_possible_suffix(name)
68
- name.sub(/_?controller$/i, "")
69
- end
66
+ def name
67
+ remove_possible_suffix(super)
68
+ end
69
+
70
+ def remove_possible_suffix(name)
71
+ name.sub(/_?controller$/i, "")
70
72
  end
71
73
  end
72
74
  end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  <% module_namespacing do -%>
2
4
  class <%= class_name %>Controller < <%= parent_class_name.classify %>
5
+ layout -> { ApplicationLayout }
6
+
3
7
  <% actions.each do |action| -%>
4
8
  def <%= action %>
5
- render Views::<%= class_name %>::<%= action.camelize %>.new
9
+ render <%= class_name %>::<%= action.camelize %>View.new
6
10
  end
7
11
  <%= "\n" unless action == actions.last -%>
8
12
  <% end -%>
@@ -1,12 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  <% module_namespacing do -%>
2
- module Views
3
- class <%= class_name %>::<%= @action.camelize %> < Phlex::HTML
4
- def template
5
- <%= "# " unless @has_layout %>render Layout.new(title: "<%= class_name.gsub("::", " ").titlecase %> - <%= @action.titlecase %>") do
6
- h1 { "<%= class_name %>#<%= @action %>" }
7
- p { "Find me in <%= @path %>" }
8
- <%= "# " unless @has_layout %>end
9
- end
4
+ class <%= class_name %>::<%= @action.classify %>View < ApplicationView
5
+ def template
6
+ h1 { "<%= class_name %> <%= @action %>" }
7
+ p { "Find me in <%= @path %>" }
10
8
  end
11
- end
12
- <% end %>
9
+ end<% end %>
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Installs Phlex
3
+
4
+ Example:
5
+ rails generate phlex:install
6
+
7
+ This will create:
8
+ app/views/application_view.rb
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Phlex::Generators
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ source_root File.expand_path("templates", __dir__)
6
+
7
+ APPLICATION_CONFIGURATION_PATH = Rails.root.join("config/application.rb")
8
+ TAILWIND_CONFIGURATION_PATH = Rails.root.join("config/tailwind.config.js")
9
+
10
+ def autoload_components
11
+ return unless APPLICATION_CONFIGURATION_PATH.exist?
12
+
13
+ inject_into_class(
14
+ APPLICATION_CONFIGURATION_PATH,
15
+ "Application",
16
+ %( config.autoload_paths << "\#{root}/app/views/components"\n)
17
+ )
18
+ end
19
+
20
+ def autoload_layouts
21
+ return unless APPLICATION_CONFIGURATION_PATH.exist?
22
+
23
+ inject_into_class(
24
+ APPLICATION_CONFIGURATION_PATH,
25
+ "Application",
26
+ %( config.autoload_paths << "\#{root}/app/views/layouts"\n)
27
+ )
28
+ end
29
+
30
+ def autoload_views
31
+ return unless APPLICATION_CONFIGURATION_PATH.exist?
32
+
33
+ inject_into_class(
34
+ APPLICATION_CONFIGURATION_PATH,
35
+ "Application",
36
+ %( config.autoload_paths << "\#{root}/app/views"\n)
37
+ )
38
+ end
39
+
40
+ def configure_tailwind
41
+ return unless TAILWIND_CONFIGURATION_PATH.exist?
42
+
43
+ insert_into_file TAILWIND_CONFIGURATION_PATH, after: "content: [" do
44
+ "\n './app/views/**/*.rb'," \
45
+ "\n './app/components/**/*rb',"
46
+ end
47
+ end
48
+
49
+ def create_application_component
50
+ template "application_component.rb", Rails.root.join("app/views/components/application_component.rb")
51
+ end
52
+
53
+ def create_application_layout
54
+ template "application_layout.rb", Rails.root.join("app/views/layouts/application_layout.rb")
55
+ end
56
+
57
+ def create_application_view
58
+ template "application_view.rb", Rails.root.join("app/views/application_view.rb")
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationComponent < Phlex::HTML
4
+ include Phlex::Rails::Helpers::Routes
5
+
6
+ if Rails.env.development?
7
+ def before_template
8
+ comment { "Before #{self.class.name}" }
9
+ super
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationLayout < ApplicationView
4
+ include Phlex::Rails::Layout
5
+
6
+ def template(&block)
7
+ doctype
8
+
9
+ html do
10
+ head do
11
+ title { "You're awesome" }
12
+ meta name: "viewport", content: "width=device-width,initial-scale=1"
13
+ csp_meta_tag
14
+ csrf_meta_tags
15
+ stylesheet_link_tag "application", data_turbo_track: "reload"
16
+ javascript_importmap_tags
17
+ end
18
+
19
+ body do
20
+ main(&block)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationView < ApplicationComponent
4
+ # The ApplicationView is an abstract class for all your views.
5
+
6
+ # By default, it inherits from `ApplicationComponent`, but you
7
+ # can change that to `Phlex::HTML` if you want to keep views and
8
+ # components independent.
9
+ end
@@ -2,8 +2,7 @@ Description:
2
2
  Generates a Phlex view with the given name
3
3
 
4
4
  Example:
5
- rails generate phlex:view Sidebar
5
+ rails generate phlex:view Articles::Index
6
6
 
7
7
  This will create:
8
- app/views/sidebar.rb
9
- spec/views/sidebar_spec.rb or test/views/sidebar_test.rb
8
+ app/views/articles/index_view.rb
@@ -1,14 +1,9 @@
1
- <% module_namespacing do -%>
2
- module Views
3
- class <%= class_name %> < Phlex::HTML
4
- include ApplicationView
1
+ # frozen_string_literal: true
5
2
 
6
- def template
7
- <%= "# " unless @layout %>render Layout.new(title: "<%= class_name.gsub("::", " ").titlecase %>") do
8
- h1 { "<%= class_name %>" }
9
- p { "Find me in <%= @path %>" }
10
- <%= "# " unless @layout %>end
11
- end
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %>View < ApplicationView
5
+ def template
6
+ h1 { "<%= class_name %>" }
7
+ p { "Find me in <%= @path %>" }
12
8
  end
13
- end
14
- <% end %>
9
+ end<% end %>
@@ -1,23 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Phlex
4
- module Generators
5
- class ViewGenerator < ::Rails::Generators::NamedBase
6
- source_root File.expand_path("templates", __dir__)
3
+ module Phlex::Generators
4
+ class ViewGenerator < ::Rails::Generators::NamedBase
5
+ source_root File.expand_path("templates", __dir__)
7
6
 
8
- def create_view
9
- @layout = layout
10
- @path = File.join("app/views", class_path, "#{file_name}.rb")
11
- template "view.rb.erb", @path
12
- end
13
-
14
- private
15
-
16
- def layout
17
- ::Rails.root.join("app/views/layout.rb").exist?
18
- end
19
-
20
- # hook_for :test_framework
7
+ def create_view
8
+ @path = File.join("app/views", class_path, "#{file_name}_view.rb")
9
+ template "view.rb.erb", @path
21
10
  end
22
11
  end
23
12
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # An adapter for Rails routing helpers, such as <code>article_path</code>.
3
4
  module Phlex::Rails::Helpers
4
5
  module Routes
6
+ include URLOptions
5
7
  include DefaultURLOptions
6
8
  include Rails.application.routes.url_helpers
7
9
  end
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # An adapter for the <code>tag</code> helper.
4
+ # @note This helper is provided for completeness, but you should probably use Phlex tag methods directly instead.
3
5
  module Phlex::Rails::Helpers::Tag
6
+ # Builds HTML tags
7
+ # @see https://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-tag
4
8
  def tag(...)
5
9
  result = helpers.tag(...)
6
10
 
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # An adapter for the turbo-rails <code>turbo_stream</code> helper.
4
+ # @see https://github.com/hotwired/turbo-rails
5
+ module Phlex::Rails::Helpers::TurboStream
6
+ extend Phlex::Rails::HelperMacros
7
+
8
+ def turbo_stream(...)
9
+ Phlex::Rails::Buffered.new(
10
+ helpers.turbo_stream(...),
11
+ view: self
12
+ )
13
+ end
14
+ end
@@ -1283,13 +1283,6 @@ module Phlex::Rails::Helpers
1283
1283
  define_output_helper :turbo_include_tags
1284
1284
  end
1285
1285
 
1286
- module TurboStream
1287
- extend Phlex::Rails::HelperMacros
1288
-
1289
- # @!method turbo_stream(...)
1290
- define_builder_yielding_helper :turbo_stream, Phlex::Rails::Buffered
1291
- end
1292
-
1293
1286
  module TurboStreamFrom
1294
1287
  extend Phlex::Rails::HelperMacros
1295
1288
 
@@ -1313,6 +1306,13 @@ module Phlex::Rails::Helpers
1313
1306
  define_output_helper :url_field_tag
1314
1307
  end
1315
1308
 
1309
+ module URLOptions
1310
+ extend Phlex::Rails::HelperMacros
1311
+
1312
+ # @!method url_options(...)
1313
+ define_value_helper :url_options
1314
+ end
1315
+
1316
1316
  module URLToAsset
1317
1317
  extend Phlex::Rails::HelperMacros
1318
1318
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Phlex::Rails::HTML::Format
4
+ def format
5
+ :html
6
+ end
7
+ end
@@ -12,5 +12,50 @@ module Phlex::Rails
12
12
  include Helpers::JavaScriptIncludeTag
13
13
  include Helpers::JavaScriptImportMapTags
14
14
  include Helpers::JavaScriptImportModuleTag
15
+
16
+ module Interface
17
+ def render(view, _locals, &block)
18
+ component = new
19
+
20
+ component.call(view_context: view) do |yielded|
21
+ case yielded
22
+ when Symbol
23
+ output = view.view_flow.get(yielded)
24
+ else
25
+ output = yield
26
+ end
27
+
28
+ case output
29
+ when ActiveSupport::SafeBuffer
30
+ component.unsafe_raw output
31
+ end
32
+
33
+ nil
34
+ end
35
+ end
36
+
37
+ def identifier
38
+ name
39
+ end
40
+
41
+ def virtual_path
42
+ return @virtual_path if defined? @virtual_path
43
+
44
+ @virtual_path = name&.dup.tap do |n|
45
+ n.gsub!("::", ".")
46
+ n.gsub!(/([a-z])([A-Z])/, '\1_\2')
47
+ n.downcase!
48
+ end
49
+ end
50
+ end
51
+
52
+ def self.included(klass)
53
+ unless klass < Phlex::HTML
54
+ raise Phlex::ArgumentError,
55
+ "👋 #{name} should only be included into Phlex::HTML classes."
56
+ end
57
+
58
+ klass.extend(Interface)
59
+ end
15
60
  end
16
61
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Phlex
4
4
  module Rails
5
- module HTML
5
+ module SGML
6
6
  module AppendMethodAddedWarning
7
7
  def method_added(name)
8
- if name == :append || name == :safe_append
8
+ if name == :append || name == :safe_append= || name == :safe_concat
9
9
  raise Phlex::NameError, "You shouldn't redefine the #{name} method as it's required for safe HTML output."
10
10
  end
11
11
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Phlex
4
4
  module Rails
5
- module HTML
5
+ module SGML
6
6
  module ClassMethods
7
7
  def render_in(...)
8
8
  new.render_in(...)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Phlex
4
4
  module Rails
5
- module HTML
5
+ module SGML
6
6
  module Overrides
7
7
  def helpers
8
8
  if defined?(ViewComponent::Base) && @_view_context.is_a?(ViewComponent::Base)
@@ -12,11 +12,15 @@ module Phlex
12
12
  end
13
13
  end
14
14
 
15
- def render(renderable, *args, **kwargs, &block)
16
- return super if renderable.is_a?(Phlex::HTML)
17
- return super if renderable.is_a?(Class) && renderable < Phlex::HTML
15
+ def render(renderable = nil, *args, **kwargs, &block)
16
+ return super if renderable.is_a?(Phlex::SGML)
17
+ return super if renderable.is_a?(Class) && renderable < Phlex::SGML
18
18
 
19
- @_target << @_view_context.render(renderable, *args, **kwargs, &block)
19
+ if renderable
20
+ @_target << @_view_context.render(renderable, *args, **kwargs, &block)
21
+ else
22
+ @_target << @_view_context.render(*args, **kwargs, &block)
23
+ end
20
24
 
21
25
  nil
22
26
  end
@@ -27,7 +31,7 @@ module Phlex
27
31
  view_context.with_output_buffer(self) do
28
32
  original_length = @_target.length
29
33
 
30
- if args.length == 1 && Phlex::HTML === args[0]
34
+ if args.length == 1 && Phlex::SGML === args[0]
31
35
  output = yield(
32
36
  args[0].unbuffered
33
37
  )
@@ -53,6 +57,7 @@ module Phlex
53
57
  end
54
58
  end
55
59
 
60
+ # @api private
56
61
  def safe_append=(value)
57
62
  return unless value
58
63
 
@@ -63,6 +68,10 @@ module Phlex
63
68
  end
64
69
  end
65
70
 
71
+ # @api private
72
+ alias_method :safe_concat, :safe_append=
73
+
74
+ # @api private
66
75
  def append=(value)
67
76
  case value
68
77
  when ActiveSupport::SafeBuffer
@@ -88,30 +97,22 @@ module Phlex
88
97
  return unless block
89
98
 
90
99
  case block.binding.receiver
91
- when Phlex::HTML
100
+ when Phlex::SGML
92
101
  super
93
102
  else
94
103
  @_view_context.with_output_buffer(self) { super }
95
104
  end
96
-
97
- # If it's a C-level Proc from Symbol#to_proc, it won't have a binding
98
- rescue ::ArgumentError
99
- super
100
105
  end
101
106
 
102
107
  private def yield_content_with_args(*args, &block)
103
108
  return unless block
104
109
 
105
110
  case block.binding.receiver
106
- when Phlex::HTML
111
+ when Phlex::SGML
107
112
  super
108
113
  else
109
114
  @_view_context.with_output_buffer(self) { super }
110
115
  end
111
-
112
- # If it's a C-level Proc from Symbol#to_proc, it won't have a binding
113
- rescue ::ArgumentError
114
- super
115
116
  end
116
117
  end
117
118
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Phlex
4
4
  module Rails
5
- VERSION = "0.6.1"
5
+ VERSION = "0.7.0"
6
6
  end
7
7
  end
data/lib/phlex/rails.rb CHANGED
@@ -3,16 +3,28 @@
3
3
  require "phlex"
4
4
  require "phlex/rails/engine"
5
5
 
6
- module Phlex::Rails
7
- Loader = Zeitwerk::Loader.new.tap do |loader|
8
- loader.push_dir("#{__dir__}/rails", namespace: Phlex::Rails)
9
- loader.inflector = Zeitwerk::GemInflector.new(__FILE__)
10
- loader.inflector.inflect("html" => "HTML")
11
- loader.setup
6
+ module Phlex
7
+ module Rails
8
+ Loader = Zeitwerk::Loader.new.tap do |loader|
9
+ loader.push_dir("#{__dir__}/rails", namespace: Phlex::Rails)
10
+ loader.inflector = Zeitwerk::GemInflector.new(__FILE__)
11
+ loader.inflector.inflect(
12
+ "html" => "HTML",
13
+ "sgml" => "SGML"
14
+ )
15
+ loader.setup
16
+ end
12
17
  end
13
18
 
14
- Phlex::HTML.prepend(Phlex::Rails::HTML::Overrides)
19
+ class SGML
20
+ extend Phlex::Rails::SGML::ClassMethods
21
+ extend Phlex::Rails::SGML::AppendMethodAddedWarning
15
22
 
16
- Phlex::HTML.extend(Phlex::Rails::HTML::ClassMethods)
17
- Phlex::HTML.extend(Phlex::Rails::HTML::AppendMethodAddedWarning)
23
+ prepend Phlex::Rails::SGML::Overrides
24
+ end
25
+
26
+ class HTML
27
+ extend Phlex::Rails::HTML::Format
28
+ include Phlex::Rails::HTML::Format
29
+ end
18
30
  end
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phlex-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Drapper
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-12 00:00:00.000000000 Z
11
+ date: 2023-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: phlex
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.3.1
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '2'
19
+ version: '1.4'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 1.3.1
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '2'
26
+ version: '1.4'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: rails
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,14 +50,14 @@ dependencies:
56
50
  requirements:
57
51
  - - "~>"
58
52
  - !ruby/object:Gem::Version
59
- version: '2'
53
+ version: '2.6'
60
54
  type: :runtime
61
55
  prerelease: false
62
56
  version_requirements: !ruby/object:Gem::Requirement
63
57
  requirements:
64
58
  - - "~>"
65
59
  - !ruby/object:Gem::Version
66
- version: '2'
60
+ version: '2.6'
67
61
  description: A high-performance view framework optimised for developer happiness.
68
62
  email:
69
63
  - joel@drapper.me
@@ -82,16 +76,18 @@ files:
82
76
  - README.md
83
77
  - SECURITY.md
84
78
  - config.ru
79
+ - lib/generators/phlex/component/USAGE
80
+ - lib/generators/phlex/component/component_generator.rb
81
+ - lib/generators/phlex/component/templates/component.rb.erb
85
82
  - lib/generators/phlex/controller/USAGE
86
83
  - lib/generators/phlex/controller/controller_generator.rb
87
84
  - lib/generators/phlex/controller/templates/controller.rb.erb
88
85
  - lib/generators/phlex/controller/templates/view.rb.erb
89
- - lib/generators/phlex/layout/USAGE
90
- - lib/generators/phlex/layout/layout_generator.rb
91
- - lib/generators/phlex/layout/templates/layout.rb.erb
92
- - lib/generators/phlex/page/USAGE
93
- - lib/generators/phlex/page/page_generator.rb
94
- - lib/generators/phlex/page/templates/page.rb.erb
86
+ - lib/generators/phlex/install/USAGE
87
+ - lib/generators/phlex/install/install_generator.rb
88
+ - lib/generators/phlex/install/templates/application_component.rb
89
+ - lib/generators/phlex/install/templates/application_layout.rb
90
+ - lib/generators/phlex/install/templates/application_view.rb
95
91
  - lib/generators/phlex/view/USAGE
96
92
  - lib/generators/phlex/view/templates/view.rb.erb
97
93
  - lib/generators/phlex/view/view_generator.rb
@@ -99,7 +95,6 @@ files:
99
95
  - lib/generators/rspec/view/view_generator.rb
100
96
  - lib/generators/test_unit/templates/view_test.rb.erb
101
97
  - lib/generators/test_unit/view_generator.rb
102
- - lib/install/phlex.rb
103
98
  - lib/phlex-rails.rb
104
99
  - lib/phlex/rails.rb
105
100
  - lib/phlex/rails/buffered.rb
@@ -113,13 +108,14 @@ files:
113
108
  - lib/phlex/rails/helpers.rb
114
109
  - lib/phlex/rails/helpers/routes.rb
115
110
  - lib/phlex/rails/helpers/tag.rb
116
- - lib/phlex/rails/html/append_method_added_warning.rb
117
- - lib/phlex/rails/html/class_methods.rb
118
- - lib/phlex/rails/html/overrides.rb
111
+ - lib/phlex/rails/helpers/turbo_stream.rb
112
+ - lib/phlex/rails/html/format.rb
119
113
  - lib/phlex/rails/layout.rb
114
+ - lib/phlex/rails/sgml/append_method_added_warning.rb
115
+ - lib/phlex/rails/sgml/class_methods.rb
116
+ - lib/phlex/rails/sgml/overrides.rb
120
117
  - lib/phlex/rails/version.rb
121
118
  - lib/phlex/testing/rails/view_helper.rb
122
- - lib/tasks/phlex_tasks.rake
123
119
  - phlex_logo.png
124
120
  homepage: https://www.phlex.fun
125
121
  licenses:
@@ -1,8 +0,0 @@
1
- Description:
2
- Generates a Phlex layout view with the given name
3
-
4
- Example:
5
- rails generate phlex:layout Layout
6
-
7
- This will create:
8
- app/views/layout.rb
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlex
4
- module Generators
5
- class LayoutGenerator < ::Rails::Generators::NamedBase
6
- source_root File.expand_path("templates", __dir__)
7
-
8
- def create_view
9
- template "layout.rb.erb", File.join("app/views", class_path, "#{file_name}.rb")
10
- end
11
- end
12
- end
13
- end
@@ -1,30 +0,0 @@
1
- <% module_namespacing do -%>
2
- module Views
3
- class <%= class_name %> < Phlex::HTML
4
- include Phlex::Rails::Layout
5
-
6
- def initialize(title:)
7
- @title = title
8
- end
9
-
10
- def template(&)
11
- doctype
12
-
13
- html do
14
- head do
15
- meta charset: "utf-8"
16
- csp_meta_tag
17
- csrf_meta_tags
18
- meta name: "viewport", content: "width=device-width,initial-scale=1"
19
- title { @title }
20
- stylesheet_link_tag "application"
21
- end
22
-
23
- body do
24
- main(&)
25
- end
26
- end
27
- end
28
- end
29
- end
30
- <% end %>
@@ -1,8 +0,0 @@
1
- Description:
2
- Generates a Phlex page view with the given name
3
-
4
- Example:
5
- rails generate phlex:page Articles::Index
6
-
7
- This will create:
8
- app/views/articles/index.rb
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlex
4
- module Generators
5
- class PageGenerator < ::Rails::Generators::NamedBase
6
- source_root File.expand_path("templates", __dir__)
7
-
8
- def create_view
9
- template "page.rb.erb", File.join("app/views", class_path, "#{file_name}.rb")
10
- end
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- <% module_namespacing do -%>
2
- module Views
3
- class <%= class_name %> < Phlex::HTML
4
- def template
5
- render Layout.new(title: "<%= class_name.gsub("::", " ") %>") do
6
- h1 { "👋 Hello World!" }
7
- end
8
- end
9
- end
10
- end
11
- <% end %>
data/lib/install/phlex.rb DELETED
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- say "Installing Phlex..."
4
-
5
- application_configuration_path = Rails.root.join("config/application.rb")
6
- application_configuration_content = File.read(application_configuration_path)
7
-
8
- pattern = %r(config.autoload_paths << (Rails.root.join\(.app.\)|.\#{root}/app.)\n)
9
-
10
- unless application_configuration_content.match?(pattern)
11
- inject_into_class(
12
- application_configuration_path,
13
- "Application",
14
- %( config.autoload_paths << "\#{root}/app"\n)
15
- )
16
- end
17
-
18
- tailwind_config_path = Rails.root.join("config/tailwind.config.js")
19
-
20
- if tailwind_config_path.exist?
21
- insert_into_file tailwind_config_path, after: "content: [" do
22
- "\n './app/views/**/*.rb',"
23
- end
24
- end
25
-
26
- say "Phlex successfully installed!"
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :phlex do
4
- desc "Install Phlex in the Rails application"
5
-
6
- task :install do
7
- install_file_path = File.expand_path("../install/phlex.rb", __dir__)
8
-
9
- system "#{RbConfig.ruby} bin/rails app:template LOCATION=#{install_file_path}"
10
- end
11
- end