super 0.0.11 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
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