super 0.0.11 → 0.0.16

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +0 -9
  3. data/README.md +42 -54
  4. data/app/assets/javascripts/super/application.js +5617 -3806
  5. data/app/assets/stylesheets/super/application.css +114687 -71486
  6. data/app/controllers/super/application_controller.rb +41 -47
  7. data/app/controllers/super/substructure_controller.rb +265 -0
  8. data/app/helpers/super/form_builder_helper.rb +7 -0
  9. data/app/views/layouts/super/application.html.erb +4 -21
  10. data/app/views/super/application/_collection_header.html.erb +2 -2
  11. data/app/views/super/application/{_super_schema_display_actions.html.erb → _display_actions.html.erb} +1 -1
  12. data/app/views/super/application/{_super_schema_display_index.html.erb → _display_index.html.erb} +5 -5
  13. data/app/views/super/application/_display_show.html.erb +8 -0
  14. data/app/views/super/application/_filter_type_select.html.erb +1 -1
  15. data/app/views/super/application/_filter_type_text.html.erb +1 -1
  16. data/app/views/super/application/_filter_type_timestamp.html.erb +3 -3
  17. data/app/views/super/application/{_super_schema_form.html.erb → _form.html.erb} +2 -2
  18. data/app/views/super/application/_form_field.html.erb +5 -0
  19. data/app/views/super/application/{_super_layout.html.erb → _layout.html.erb} +8 -8
  20. data/app/views/super/application/_member_header.html.erb +2 -2
  21. data/app/views/super/application/{_super_pagination.html.erb → _pagination.html.erb} +1 -1
  22. data/app/views/super/application/{_super_panel.html.erb → _panel.html.erb} +2 -2
  23. data/app/views/super/application/_site_footer.html.erb +3 -0
  24. data/app/views/super/application/_site_header.html.erb +17 -0
  25. data/app/views/super/feather/README.md +0 -1
  26. data/frontend/super-frontend/dist/application.css +114687 -71486
  27. data/frontend/super-frontend/dist/application.js +5617 -3806
  28. data/lib/generators/super/install/install_generator.rb +16 -23
  29. data/lib/generators/super/install/templates/base_controller.rb.tt +1 -1
  30. data/lib/generators/super/install/templates/initializer.rb.tt +9 -2
  31. data/lib/generators/super/resource/resource_generator.rb +105 -30
  32. data/lib/generators/super/resource/templates/resources_controller.rb.tt +4 -10
  33. data/lib/generators/super/webpacker/webpacker_generator.rb +9 -5
  34. data/lib/super.rb +6 -2
  35. data/lib/super/action_inquirer.rb +18 -3
  36. data/lib/super/assets.rb +44 -23
  37. data/lib/super/badge.rb +60 -0
  38. data/lib/super/cheat.rb +17 -0
  39. data/lib/super/compatibility.rb +19 -0
  40. data/lib/super/configuration.rb +14 -23
  41. data/lib/super/display.rb +16 -8
  42. data/lib/super/display/guesser.rb +2 -0
  43. data/lib/super/display/schema_types.rb +116 -29
  44. data/lib/super/error.rb +7 -0
  45. data/lib/super/form.rb +1 -1
  46. data/lib/super/form/builder.rb +107 -27
  47. data/lib/super/form/guesser.rb +10 -1
  48. data/lib/super/form/schema_types.rb +73 -7
  49. data/lib/super/layout.rb +1 -1
  50. data/lib/super/link.rb +42 -31
  51. data/lib/super/link_builder.rb +58 -0
  52. data/lib/super/navigation.rb +164 -0
  53. data/lib/super/pagination.rb +3 -45
  54. data/lib/super/panel.rb +1 -1
  55. data/lib/super/reset.rb +22 -0
  56. data/lib/super/useful/builder.rb +25 -0
  57. data/lib/super/useful/enum.rb +63 -0
  58. data/lib/super/version.rb +1 -1
  59. data/lib/tasks/super/cheat.rake +9 -0
  60. metadata +27 -31
  61. data/CONTRIBUTING.md +0 -56
  62. data/Rakefile +0 -36
  63. data/STABILITY.md +0 -50
  64. data/app/views/super/application/_form_field_checkbox.html.erb +0 -1
  65. data/app/views/super/application/_form_field_rich_text_area.html.erb +0 -1
  66. data/app/views/super/application/_form_field_text.html.erb +0 -1
  67. data/app/views/super/application/_super_schema_display_show.html.erb +0 -8
  68. data/app/views/super/feather/_chevron_down.html +0 -1
  69. data/docs/README.md +0 -8
  70. data/docs/action_text.md +0 -48
  71. data/docs/cheat.md +0 -41
  72. data/docs/faq.md +0 -44
  73. data/docs/installation.md +0 -21
  74. data/docs/quick_start.md +0 -30
  75. data/docs/webpacker.md +0 -25
  76. data/docs/yard_customizations.rb +0 -43
  77. data/lib/super/controls.rb +0 -17
  78. data/lib/super/controls/optional.rb +0 -112
  79. data/lib/super/controls/required.rb +0 -15
  80. data/lib/super/controls/steps.rb +0 -106
  81. data/lib/super/controls/view.rb +0 -55
  82. data/lib/super/navigation/automatic.rb +0 -73
@@ -9,6 +9,12 @@ module Super
9
9
  class_option :route_namespace, type: :string, default: "admin",
10
10
  banner: "Specifies the route namespace for admin controllers"
11
11
 
12
+ def assert_not_controller_namespace_not_super
13
+ if controller_namespace == "super"
14
+ raise Super::Error::ArgumentError, "controller_namespace can not be `super`"
15
+ end
16
+ end
17
+
12
18
  def create_initializer
13
19
  template("initializer.rb", "config/initializers/super.rb")
14
20
  end
@@ -16,8 +22,7 @@ module Super
16
22
  def create_base_admin_controller
17
23
  template(
18
24
  "base_controller.rb",
19
- "app/controllers/#{controller_namespace}_controller.rb",
20
- controller_namespace: controller_namespace
25
+ "app/controllers/#{parent_controller_name}_controller.rb"
21
26
  )
22
27
  end
23
28
 
@@ -31,34 +36,22 @@ module Super
31
36
  create_file("app/controllers/#{controller_namespace}/.keep", "")
32
37
  end
33
38
 
34
- def copy_cheatsheet
35
- super_path = Pathname.new(Gem.loaded_specs["super"].full_gem_path).expand_path
36
- super_cheat_path = super_path.join("docs", "cheat.md")
37
-
38
- path =
39
- if options["controller_namespace"].present?
40
- "app/controllers/#{controller_namespace}/README.md"
41
- else
42
- "app/controllers/README.md"
43
- end
44
-
45
- create_file(path) do
46
- super_cheat_path.read.sub(%r{<!--.*?-->}m, "").strip + "\n"
47
- end
48
- end
49
-
50
39
  def setup_sprockets4_manifest
51
40
  append_to_file "app/assets/config/manifest.js", "//= link super_manifest.js\n"
52
41
  end
53
42
 
54
43
  private
55
44
 
45
+ def route_namespace
46
+ options[:route_namespace].strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
47
+ end
48
+
56
49
  def controller_namespace
57
- if options["controller_namespace"].blank?
58
- "admin"
59
- else
60
- options["controller_namespace"]
61
- end
50
+ options["controller_namespace"].strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
51
+ end
52
+
53
+ def parent_controller_name
54
+ controller_namespace.presence || "admin"
62
55
  end
63
56
  end
64
57
  end
@@ -1,2 +1,2 @@
1
- class <%= config[:controller_namespace].classify %>Controller < Super::ApplicationController
1
+ class <%= parent_controller_name.classify %>Controller < Super::ApplicationController
2
2
  end
@@ -1,5 +1,12 @@
1
1
  Super.configuration do |c|
2
2
  c.title = "My Admin Site"
3
- c.controller_namespace = "<%= options["controller_namespace"] %>"
4
- c.route_namespace = "<%= options["route_namespace"] %>"
3
+ <% if route_namespace != "admin" -%>
4
+ c.path = "/<%= route_namespace %>"
5
+ <% end -%>
6
+ <% if route_namespace != "admin" -%>
7
+ c.generator_as = "<%= route_namespace.gsub(%r{/}, "_") %>"
8
+ <% end -%>
9
+ <% if controller_namespace != "admin" -%>
10
+ c.generator_module = "<%= controller_namespace %>"
11
+ <% end -%>
5
12
  end
@@ -1,54 +1,129 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails/generators/resource_helpers"
4
+
3
5
  module Super
4
6
  class ResourceGenerator < Rails::Generators::NamedBase
7
+ include Rails::Generators::ResourceHelpers
5
8
  source_root File.expand_path("templates", __dir__)
6
9
 
7
- def create_controller
8
- controller_subdir =
9
- if Super.configuration.controller_namespace.present?
10
- "#{Super.configuration.controller_namespace}/"
11
- else
12
- ""
13
- end
10
+ check_class_collision suffix: "Controller"
11
+
12
+ class_option :skip_routes, type: :boolean, desc: "Don't add routes to config/routes.rb."
13
+
14
+ def initialize(*)
15
+ super
16
+
17
+ controller_namespace = Super.configuration.generator_module
18
+ if controller_namespace.present?
19
+ controller_name =
20
+ if controller_namespace.include?("/")
21
+ "#{controller_namespace}/#{name}"
22
+ else
23
+ "#{controller_namespace}::#{name}"
24
+ end
25
+ self.options = options.dup
26
+ options[:model_name] = name
27
+ options.freeze
28
+ assign_names!(name)
29
+ assign_controller_names!(controller_name.pluralize)
30
+ else
31
+ assign_names!(name)
32
+ assign_controller_names!(name.pluralize)
33
+ end
34
+ end
14
35
 
36
+ def create_controller
15
37
  template(
16
38
  "resources_controller.rb",
17
- "app/controllers/#{controller_subdir}#{file_path.pluralize}_controller.rb"
39
+ File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
18
40
  )
19
41
  end
20
42
 
21
- private
43
+ def create_route_namespace
44
+ data = route_scope
45
+ return if data.nil?
46
+ return if File.read(File.join(destination_root, "config", "routes.rb")).include?(data)
22
47
 
23
- def wrap_with_configured_module(&block)
24
- indentation_amount =
25
- if Super.configuration.controller_namespace.present?
26
- 2
27
- else
28
- 0
29
- end
48
+ inject_into_file(
49
+ "config/routes.rb",
50
+ "#{data}\nend\n".indent(2),
51
+ after: /^Rails\.application\.routes\.draw\b.*$\r?\n\r?/,
52
+ verbose: true,
53
+ force: false
54
+ )
55
+ end
30
56
 
31
- inner = capture(&block)
32
- inner = indent(inner, indentation_amount).chomp
57
+ def add_admin_route
58
+ data = route_scope
33
59
 
34
- if Super.configuration.controller_namespace.present?
35
- concat("module #{Super.configuration.controller_namespace.camelize}\n")
60
+ if data.nil?
61
+ route("resources :#{file_name.pluralize}")
62
+ else
63
+ inject_into_file(
64
+ "config/routes.rb",
65
+ "resources :#{file_name.pluralize}\n".indent(4),
66
+ after: /#{data}.*$\r?\n\r?/,
67
+ verbose: true,
68
+ force: false
69
+ )
36
70
  end
71
+ end
37
72
 
38
- concat(inner)
39
- concat("\n")
73
+ private
40
74
 
41
- if Super.configuration.controller_namespace.present?
42
- concat("end\n")
43
- end
75
+ def parent_controller_name
76
+ controller_namespace.presence || "admin"
44
77
  end
45
78
 
46
- def parent_controller_name
47
- if Super.configuration.controller_namespace.present?
48
- "#{Super.configuration.controller_namespace.camelize}Controller"
49
- else
50
- "AdminController"
79
+ def controller_namespace
80
+ Super.configuration.generator_module.strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
81
+ end
82
+
83
+ def route_scope
84
+ return nil if no_scope?
85
+
86
+ if use_scope?
87
+ kwargs = []
88
+ kwargs.push(%(path: "/#{g_path}")) if g_path.present?
89
+ kwargs.push(%(module: "#{g_module}")) if g_module.present?
90
+ kwargs.push(%(as: "#{g_as}")) if g_as.present?
91
+ return %(scope #{kwargs.join(", ")} do)
51
92
  end
93
+
94
+ %(namespace :#{g_module} do)
95
+ end
96
+
97
+ def use_scope?
98
+ return true if !same?
99
+ return true if g_module.include?("/")
100
+ return true if g_path.include?("/")
101
+
102
+ false
103
+ end
104
+
105
+ def no_scope?
106
+ g_module.blank? && g_path.blank? && g_as.blank?
107
+ end
108
+
109
+ def same?
110
+ g_module == g_path && g_path == g_as
111
+ end
112
+
113
+ def g_module
114
+ normalized_scope_part(Super.configuration.generator_module || "")
115
+ end
116
+
117
+ def g_path
118
+ normalized_scope_part(Super.configuration.path || "")
119
+ end
120
+
121
+ def g_as
122
+ normalized_scope_part(Super.configuration.generator_as || "")
123
+ end
124
+
125
+ def normalized_scope_part(part)
126
+ part.strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip
52
127
  end
53
128
  end
54
129
  end
@@ -1,15 +1,9 @@
1
- <% wrap_with_configured_module do -%>
2
- class <%= class_name.pluralize %>Controller < <%= parent_controller_name %>
1
+ <% module_namespacing do -%>
2
+ class <%= controller_class_name %>Controller < <%= parent_controller_name.classify %>Controller
3
3
  private
4
4
 
5
- def new_controls
6
- Controls.new
7
- end
8
-
9
- class Controls < Super::Controls
10
- def model
11
- <%= class_name %>
12
- end
5
+ def model
6
+ <%= class_name %>
13
7
  end
14
8
  end
15
9
  <% end -%>
@@ -5,10 +5,14 @@ module Super
5
5
  source_root File.expand_path("templates", __dir__)
6
6
 
7
7
  def copy_the_pack_file
8
- template(
9
- "pack_super_application.js.erb",
10
- "app/javascript/packs/super/application.js.erb"
11
- )
8
+ path =
9
+ if Gem::Dependency.new("webpacker", ">= 6.0.0.beta2", "!= 6.0.0.pre1", "!= 6.0.0.pre2").matching_specs.any?
10
+ "app/packs/entrypoints/super/application.js.erb"
11
+ else
12
+ "app/javascript/packs/super/application.js.erb"
13
+ end
14
+
15
+ template("pack_super_application.js.erb", path)
12
16
  end
13
17
 
14
18
  def set_asset_handler_to_webpacker
@@ -16,7 +20,7 @@ module Super
16
20
  "config/initializers/super.rb",
17
21
  " c.javascripts = Super::Assets.use_webpacker(c.javascripts)\n" \
18
22
  " c.stylesheets = Super::Assets.use_webpacker(c.stylesheets)\n",
19
- before: /\bend\b/
23
+ before: /^end\b/
20
24
  )
21
25
  end
22
26
 
data/lib/super.rb CHANGED
@@ -5,13 +5,15 @@ require "tsort"
5
5
  require "rails/engine"
6
6
 
7
7
  require "super/schema/common"
8
+ require "super/useful/builder"
9
+ require "super/useful/enum"
8
10
 
9
11
  require "super/action_inquirer"
10
12
  require "super/assets"
13
+ require "super/badge"
11
14
  require "super/client_error"
12
15
  require "super/compatibility"
13
16
  require "super/configuration"
14
- require "super/controls"
15
17
  require "super/display"
16
18
  require "super/display/guesser"
17
19
  require "super/display/schema_types"
@@ -29,12 +31,14 @@ require "super/form/schema_types"
29
31
  require "super/form/strong_params"
30
32
  require "super/layout"
31
33
  require "super/link"
32
- require "super/navigation/automatic"
34
+ require "super/link_builder"
35
+ require "super/navigation"
33
36
  require "super/pagination"
34
37
  require "super/panel"
35
38
  require "super/partial"
36
39
  require "super/plugin"
37
40
  require "super/query/form_object"
41
+ require "super/reset"
38
42
  require "super/schema"
39
43
  require "super/schema/guesser"
40
44
  require "super/sort"
@@ -19,12 +19,27 @@ module Super
19
19
  #
20
20
  def self.default_for_resources
21
21
  {
22
- read: %i[index show new edit],
23
- write: %i[create update destroy],
24
- delete: %i[destroy]
22
+ "read" => %w[index show new edit],
23
+ "write" => %w[create update destroy],
24
+ "delete" => %w[destroy],
25
25
  }
26
26
  end
27
27
 
28
+ # @return [ActionInquirer]
29
+ def self.index!; new(default_for_resources, "index"); end
30
+ # @return [ActionInquirer]
31
+ def self.show!; new(default_for_resources, "show"); end
32
+ # @return [ActionInquirer]
33
+ def self.new!; new(default_for_resources, "new"); end
34
+ # @return [ActionInquirer]
35
+ def self.edit!; new(default_for_resources, "edit"); end
36
+ # @return [ActionInquirer]
37
+ def self.create!; new(default_for_resources, "create"); end
38
+ # @return [ActionInquirer]
39
+ def self.update!; new(default_for_resources, "update"); end
40
+ # @return [ActionInquirer]
41
+ def self.destroy!; new(default_for_resources, "destroy"); end
42
+
28
43
  def initialize(categories_and_their_actions, action)
29
44
  @categories = categories_and_their_actions.keys.map(&:to_s)
30
45
  @actions = categories_and_their_actions.values.flatten.uniq.map(&:to_s)
data/lib/super/assets.rb CHANGED
@@ -21,7 +21,7 @@ module Super
21
21
  assets.map do |asset|
22
22
  grep_matches = grep && asset === grep
23
23
  if grep_matches || !grep
24
- asset.instance_variable_set(:@handler, Handler.webpacker)
24
+ asset.send(:handler=, Handler.webpacker)
25
25
  end
26
26
 
27
27
  asset
@@ -34,7 +34,7 @@ module Super
34
34
  assets.map do |asset|
35
35
  grep_matches = grep && asset === grep
36
36
  if grep_matches || !grep
37
- asset.instance_variable_set(:@asset_handler, Handler.sprockets)
37
+ asset.send(:handler=, Handler.sprockets)
38
38
  end
39
39
 
40
40
  asset
@@ -52,6 +52,14 @@ module Super
52
52
  attr_reader :path
53
53
  attr_reader :arguments
54
54
 
55
+ def ==(other)
56
+ return false if handler != other.handler
57
+ return false if path != other.path
58
+ return false if arguments != other.arguments
59
+
60
+ true
61
+ end
62
+
55
63
  def ===(other)
56
64
  return true if path == other
57
65
  return true if other.is_a?(Regexp) && path.match?(other)
@@ -61,6 +69,10 @@ module Super
61
69
 
62
70
  false
63
71
  end
72
+
73
+ private
74
+
75
+ attr_writer :handler
64
76
  end
65
77
 
66
78
  def self.dist(gem_name, package_name)
@@ -74,29 +86,34 @@ module Super
74
86
  end
75
87
 
76
88
  class Handler
77
- def self.auto
78
- @auto ||=
79
- if Gem::Dependency.new("sprockets", "~> 4.0").matching_specs.any?
80
- sprockets
81
- elsif Gem::Dependency.new("sprockets", "~> 3.0").matching_specs.any?
82
- sprockets
83
- elsif Gem::Dependency.new("sprockets", "~> 2.0").matching_specs.any?
84
- sprockets
85
- elsif Gem::Dependency.new("webpacker", "~> 6.0").matching_specs.any?
86
- webpacker
87
- elsif Gem::Dependency.new("webpacker", "~> 5.0").matching_specs.any?
88
- webpacker
89
- elsif Gem::Dependency.new("webpacker", "~> 4.0").matching_specs.any?
90
- webpacker
91
- elsif Gem::Dependency.new("webpacker", "~> 3.0").matching_specs.any?
92
- webpacker
93
- else
94
- none
89
+ class << self
90
+ def auto
91
+ sprockets_spec = gem_specification("sprockets")
92
+ if sprockets_spec
93
+ major = sprockets_spec.version.segments.first
94
+ if major >= 2
95
+ return sprockets
96
+ end
97
+ end
98
+
99
+ webpacker_spec = gem_specification("webpacker")
100
+ if webpacker_spec
101
+ major = webpacker_spec.version.segments.first
102
+ if major >= 4
103
+ return webpacker
104
+ end
95
105
  end
96
- end
97
106
 
98
- def self.sprockets_available?
99
- Gem::Dependency.new("sprockets").matching_specs.any? && defined?(Sprockets)
107
+ none
108
+ end
109
+
110
+ def sprockets_available?
111
+ !gem_specification("sprockets").nil? && defined?(Sprockets)
112
+ end
113
+
114
+ def gem_specification(gem_name)
115
+ Gem::Dependency.new(gem_name).matching_specs&.sort_by(&:version)&.first
116
+ end
100
117
  end
101
118
 
102
119
  def self.sprockets
@@ -115,6 +132,10 @@ module Super
115
132
  @asset_handler = asset_handler
116
133
  end
117
134
 
135
+ def ==(other)
136
+ to_sym == other.to_sym
137
+ end
138
+
118
139
  def sprockets?
119
140
  @asset_handler == :sprockets
120
141
  end