semantic-administrate 0.1.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 (174) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +32 -0
  3. data/app/assets/fonts/administrate/semantic-ui/icons.eot +0 -0
  4. data/app/assets/fonts/administrate/semantic-ui/icons.otf +0 -0
  5. data/app/assets/fonts/administrate/semantic-ui/icons.svg +2671 -0
  6. data/app/assets/fonts/administrate/semantic-ui/icons.ttf +0 -0
  7. data/app/assets/fonts/administrate/semantic-ui/icons.woff +0 -0
  8. data/app/assets/fonts/administrate/semantic-ui/icons.woff2 +0 -0
  9. data/app/assets/images/administrate/semantic-ui/flags.png +0 -0
  10. data/app/assets/javascripts/administrate/application.js +7 -0
  11. data/app/assets/javascripts/administrate/components/date_time_picker.js +6 -0
  12. data/app/assets/javascripts/administrate/components/has_many_form.js +3 -0
  13. data/app/assets/javascripts/administrate/components/table.js +23 -0
  14. data/app/assets/javascripts/administrate/vendor/semantic-ui.js +22943 -0
  15. data/app/assets/stylesheets/administrate/application.scss +27 -0
  16. data/app/assets/stylesheets/administrate/base/_forms.scss +106 -0
  17. data/app/assets/stylesheets/administrate/base/_layout.scss +10 -0
  18. data/app/assets/stylesheets/administrate/base/_lists.scss +19 -0
  19. data/app/assets/stylesheets/administrate/base/_typography.scss +48 -0
  20. data/app/assets/stylesheets/administrate/components/_app-container.scss +27 -0
  21. data/app/assets/stylesheets/administrate/components/_attributes.scss +34 -0
  22. data/app/assets/stylesheets/administrate/components/_buttons.scss +43 -0
  23. data/app/assets/stylesheets/administrate/components/_cells.scss +59 -0
  24. data/app/assets/stylesheets/administrate/components/_field-unit.scss +36 -0
  25. data/app/assets/stylesheets/administrate/components/_flashes.scss +28 -0
  26. data/app/assets/stylesheets/administrate/components/_form-actions.scss +3 -0
  27. data/app/assets/stylesheets/administrate/components/_main-content.scss +42 -0
  28. data/app/assets/stylesheets/administrate/components/_pagination.scss +18 -0
  29. data/app/assets/stylesheets/administrate/components/_search.scss +45 -0
  30. data/app/assets/stylesheets/administrate/components/nav-drawer.scss +156 -0
  31. data/app/assets/stylesheets/administrate/library/_clearfix.scss +7 -0
  32. data/app/assets/stylesheets/administrate/library/_data-label.scss +8 -0
  33. data/app/assets/stylesheets/administrate/library/_variables.scss +65 -0
  34. data/app/assets/stylesheets/administrate/vendor/semantic-ui.scss +37123 -0
  35. data/app/assets/stylesheets/docs.scss +93 -0
  36. data/app/controllers/administrate/application_controller.rb +162 -0
  37. data/app/helpers/administrate/application_helper.rb +51 -0
  38. data/app/views/administrate/application/_collection.html.erb +92 -0
  39. data/app/views/administrate/application/_flashes.html.erb +20 -0
  40. data/app/views/administrate/application/_form.html.erb +42 -0
  41. data/app/views/administrate/application/_icons.erb +13 -0
  42. data/app/views/administrate/application/_javascript.html.erb +21 -0
  43. data/app/views/administrate/application/_navigation.html.erb +19 -0
  44. data/app/views/administrate/application/_navigation_extra_links.html.erb +13 -0
  45. data/app/views/administrate/application/_navigation_footer.html.erb +44 -0
  46. data/app/views/administrate/application/_navigation_links.html.erb +16 -0
  47. data/app/views/administrate/application/_search.html.erb +25 -0
  48. data/app/views/administrate/application/_stylesheet.html.erb +14 -0
  49. data/app/views/administrate/application/edit.html.erb +36 -0
  50. data/app/views/administrate/application/index.html.erb +63 -0
  51. data/app/views/administrate/application/new.html.erb +32 -0
  52. data/app/views/administrate/application/show.html.erb +49 -0
  53. data/app/views/fields/belongs_to/_form.html.erb +26 -0
  54. data/app/views/fields/belongs_to/_index.html.erb +27 -0
  55. data/app/views/fields/belongs_to/_show.html.erb +27 -0
  56. data/app/views/fields/boolean/_form.html.erb +23 -0
  57. data/app/views/fields/boolean/_index.html.erb +19 -0
  58. data/app/views/fields/boolean/_show.html.erb +19 -0
  59. data/app/views/fields/date_time/_form.html.erb +24 -0
  60. data/app/views/fields/date_time/_index.html.erb +21 -0
  61. data/app/views/fields/date_time/_show.html.erb +21 -0
  62. data/app/views/fields/email/_form.html.erb +23 -0
  63. data/app/views/fields/email/_index.html.erb +18 -0
  64. data/app/views/fields/email/_show.html.erb +18 -0
  65. data/app/views/fields/has_many/_form.html.erb +29 -0
  66. data/app/views/fields/has_many/_index.html.erb +19 -0
  67. data/app/views/fields/has_many/_show.html.erb +35 -0
  68. data/app/views/fields/has_one/_form.html.erb +28 -0
  69. data/app/views/fields/has_one/_index.html.erb +23 -0
  70. data/app/views/fields/has_one/_show.html.erb +40 -0
  71. data/app/views/fields/number/_form.html.erb +23 -0
  72. data/app/views/fields/number/_index.html.erb +19 -0
  73. data/app/views/fields/number/_show.html.erb +19 -0
  74. data/app/views/fields/polymorphic/_form.html.erb +32 -0
  75. data/app/views/fields/polymorphic/_index.html.erb +24 -0
  76. data/app/views/fields/polymorphic/_show.html.erb +28 -0
  77. data/app/views/fields/select/_form.html.erb +31 -0
  78. data/app/views/fields/select/_index.html.erb +16 -0
  79. data/app/views/fields/select/_show.html.erb +16 -0
  80. data/app/views/fields/string/_form.html.erb +23 -0
  81. data/app/views/fields/string/_index.html.erb +18 -0
  82. data/app/views/fields/string/_show.html.erb +18 -0
  83. data/app/views/fields/text/_form.html.erb +22 -0
  84. data/app/views/fields/text/_index.html.erb +18 -0
  85. data/app/views/fields/text/_show.html.erb +19 -0
  86. data/app/views/layouts/administrate/application.html.erb +43 -0
  87. data/config/i18n-tasks.yml +18 -0
  88. data/config/locales/administrate.ar.yml +26 -0
  89. data/config/locales/administrate.bs.yml +25 -0
  90. data/config/locales/administrate.ca.yml +26 -0
  91. data/config/locales/administrate.da.yml +26 -0
  92. data/config/locales/administrate.de.yml +26 -0
  93. data/config/locales/administrate.en.yml +26 -0
  94. data/config/locales/administrate.es.yml +26 -0
  95. data/config/locales/administrate.fr.yml +26 -0
  96. data/config/locales/administrate.it.yml +26 -0
  97. data/config/locales/administrate.ja.yml +26 -0
  98. data/config/locales/administrate.ko.yml +26 -0
  99. data/config/locales/administrate.nl.yml +26 -0
  100. data/config/locales/administrate.pl.yml +26 -0
  101. data/config/locales/administrate.pt-BR.yml +27 -0
  102. data/config/locales/administrate.pt.yml +27 -0
  103. data/config/locales/administrate.ru.yml +26 -0
  104. data/config/locales/administrate.sv.yml +26 -0
  105. data/config/locales/administrate.uk.yml +26 -0
  106. data/config/locales/administrate.vi.yml +26 -0
  107. data/config/locales/administrate.zh-CN.yml +26 -0
  108. data/config/locales/administrate.zh-TW.yml +26 -0
  109. data/config/routes.rb +2 -0
  110. data/config/unicorn.rb +30 -0
  111. data/docs/adding_custom_field_types.md +79 -0
  112. data/docs/authentication.md +61 -0
  113. data/docs/customizing_attribute_partials.md +53 -0
  114. data/docs/customizing_controller_actions.md +42 -0
  115. data/docs/customizing_dashboards.md +202 -0
  116. data/docs/customizing_page_views.md +78 -0
  117. data/docs/getting_started.md +115 -0
  118. data/lib/administrate.rb +4 -0
  119. data/lib/administrate/base_dashboard.rb +72 -0
  120. data/lib/administrate/engine.rb +44 -0
  121. data/lib/administrate/field/associative.rb +33 -0
  122. data/lib/administrate/field/base.rb +54 -0
  123. data/lib/administrate/field/belongs_to.rb +36 -0
  124. data/lib/administrate/field/boolean.rb +15 -0
  125. data/lib/administrate/field/date_time.rb +21 -0
  126. data/lib/administrate/field/deferred.rb +35 -0
  127. data/lib/administrate/field/email.rb +11 -0
  128. data/lib/administrate/field/has_many.rb +87 -0
  129. data/lib/administrate/field/has_one.rb +27 -0
  130. data/lib/administrate/field/number.rb +35 -0
  131. data/lib/administrate/field/polymorphic.rb +51 -0
  132. data/lib/administrate/field/select.rb +21 -0
  133. data/lib/administrate/field/string.rb +21 -0
  134. data/lib/administrate/field/text.rb +21 -0
  135. data/lib/administrate/generator_helpers.rb +13 -0
  136. data/lib/administrate/namespace.rb +31 -0
  137. data/lib/administrate/namespace/resource.rb +28 -0
  138. data/lib/administrate/order.rb +45 -0
  139. data/lib/administrate/page.rb +4 -0
  140. data/lib/administrate/page/base.rb +35 -0
  141. data/lib/administrate/page/collection.rb +33 -0
  142. data/lib/administrate/page/form.rb +28 -0
  143. data/lib/administrate/page/show.rb +24 -0
  144. data/lib/administrate/resource_resolver.rb +43 -0
  145. data/lib/administrate/search.rb +47 -0
  146. data/lib/administrate/version.rb +3 -0
  147. data/lib/administrate/view_generator.rb +36 -0
  148. data/lib/generators/administrate/assets/assets_generator.rb +12 -0
  149. data/lib/generators/administrate/assets/javascripts_generator.rb +17 -0
  150. data/lib/generators/administrate/assets/stylesheets_generator.rb +17 -0
  151. data/lib/generators/administrate/dashboard/USAGE +9 -0
  152. data/lib/generators/administrate/dashboard/dashboard_generator.rb +141 -0
  153. data/lib/generators/administrate/dashboard/templates/controller.rb.erb +21 -0
  154. data/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +56 -0
  155. data/lib/generators/administrate/field/field_generator.rb +31 -0
  156. data/lib/generators/administrate/field/templates/_form.html.erb +6 -0
  157. data/lib/generators/administrate/field/templates/_index.html.erb +1 -0
  158. data/lib/generators/administrate/field/templates/_show.html.erb +1 -0
  159. data/lib/generators/administrate/field/templates/field_object.rb.erb +7 -0
  160. data/lib/generators/administrate/install/install_generator.rb +49 -0
  161. data/lib/generators/administrate/install/templates/application_controller.rb.erb +21 -0
  162. data/lib/generators/administrate/routes/routes_generator.rb +91 -0
  163. data/lib/generators/administrate/routes/templates/routes.rb.erb +5 -0
  164. data/lib/generators/administrate/views/edit_generator.rb +16 -0
  165. data/lib/generators/administrate/views/field_generator.rb +50 -0
  166. data/lib/generators/administrate/views/form_generator.rb +15 -0
  167. data/lib/generators/administrate/views/index_generator.rb +16 -0
  168. data/lib/generators/administrate/views/layout_generator.rb +23 -0
  169. data/lib/generators/administrate/views/navigation_generator.rb +15 -0
  170. data/lib/generators/administrate/views/new_generator.rb +16 -0
  171. data/lib/generators/administrate/views/show_generator.rb +15 -0
  172. data/lib/generators/administrate/views/views_generator.rb +14 -0
  173. data/lib/tasks/administrate_tasks.rake +4 -0
  174. metadata +388 -0
@@ -0,0 +1,4 @@
1
+ module Administrate
2
+ module Page
3
+ end
4
+ end
@@ -0,0 +1,35 @@
1
+ module Administrate
2
+ module Page
3
+ class Base
4
+ def initialize(dashboard, options = {})
5
+ @dashboard = dashboard
6
+ @options = options
7
+ end
8
+
9
+ def resource_name
10
+ @resource_name ||=
11
+ dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore
12
+ end
13
+
14
+ def resource_path
15
+ @resource_path ||= resource_name.gsub("/", "_")
16
+ end
17
+
18
+ protected
19
+
20
+ def attribute_field(dashboard, resource, attribute_name, page)
21
+ value = get_attribute_value(resource, attribute_name)
22
+ field = dashboard.attribute_type_for(attribute_name)
23
+ field.new(attribute_name, value, page, resource: resource)
24
+ end
25
+
26
+ def get_attribute_value(resource, attribute_name)
27
+ resource.public_send(attribute_name)
28
+ rescue NameError
29
+ nil
30
+ end
31
+
32
+ attr_reader :dashboard, :options
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Collection < Page::Base
6
+ def attribute_names
7
+ dashboard.collection_attributes
8
+ end
9
+
10
+ def attributes_for(resource)
11
+ attribute_names.map do |attr_name|
12
+ attribute_field(dashboard, resource, attr_name, :index)
13
+ end
14
+ end
15
+
16
+ def attribute_types
17
+ dashboard.attribute_types_for(attribute_names)
18
+ end
19
+
20
+ def ordered_html_class(attr)
21
+ ordered_by?(attr) && order.direction
22
+ end
23
+
24
+ delegate :ordered_by?, :order_params_for, to: :order
25
+
26
+ private
27
+
28
+ def order
29
+ options[:order] || Order.new
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Form < Page::Base
6
+ def initialize(dashboard, resource)
7
+ super(dashboard)
8
+ @resource = resource
9
+ end
10
+
11
+ attr_reader :resource
12
+
13
+ def attributes
14
+ dashboard.form_attributes.map do |attribute|
15
+ attribute_field(dashboard, resource, attribute, :form)
16
+ end
17
+ end
18
+
19
+ def page_title
20
+ dashboard.display_resource(resource)
21
+ end
22
+
23
+ protected
24
+
25
+ attr_reader :dashboard
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Show < Page::Base
6
+ def initialize(dashboard, resource)
7
+ super(dashboard)
8
+ @resource = resource
9
+ end
10
+
11
+ attr_reader :resource
12
+
13
+ def page_title
14
+ dashboard.display_resource(resource)
15
+ end
16
+
17
+ def attributes
18
+ dashboard.show_page_attributes.map do |attr_name|
19
+ attribute_field(dashboard, resource, attr_name, :show)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ module Administrate
2
+ class ResourceResolver
3
+ def initialize(controller_path)
4
+ @controller_path = controller_path
5
+ end
6
+
7
+ def dashboard_class
8
+ ActiveSupport::Inflector.constantize("#{resource_class_name}Dashboard")
9
+ end
10
+
11
+ def namespace
12
+ controller_path.split("/").first
13
+ end
14
+
15
+ def resource_class
16
+ ActiveSupport::Inflector.constantize(resource_class_name)
17
+ end
18
+
19
+ def resource_name
20
+ model_path_parts.map(&:underscore).join("__").to_sym
21
+ end
22
+
23
+ def resource_title
24
+ model_path_parts.join(" ")
25
+ end
26
+
27
+ private
28
+
29
+ def resource_class_name
30
+ model_path_parts.join("::")
31
+ end
32
+
33
+ def model_path_parts
34
+ controller_path_parts.map(&:camelize)
35
+ end
36
+
37
+ def controller_path_parts
38
+ controller_path.split("/")[1..-1].map(&:singularize)
39
+ end
40
+
41
+ attr_reader :controller_path
42
+ end
43
+ end
@@ -0,0 +1,47 @@
1
+ require "active_support/core_ext/module/delegation"
2
+ require "active_support/core_ext/object/blank"
3
+
4
+ module Administrate
5
+ class Search
6
+ def initialize(scoped_resource, dashboard_class, term)
7
+ @dashboard_class = dashboard_class
8
+ @scoped_resource = scoped_resource
9
+ @term = term
10
+ end
11
+
12
+ def run
13
+ if @term.blank?
14
+ @scoped_resource.all
15
+ else
16
+ @scoped_resource.where(query, *search_terms)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def query
23
+ search_attributes.map do |attr|
24
+ table_name = ActiveRecord::Base.connection.
25
+ quote_table_name(@scoped_resource.table_name)
26
+ attr_name = ActiveRecord::Base.connection.quote_column_name(attr)
27
+ "lower(#{table_name}.#{attr_name}) LIKE ?"
28
+ end.join(" OR ")
29
+ end
30
+
31
+ def search_terms
32
+ ["%#{term.mb_chars.downcase}%"] * search_attributes.count
33
+ end
34
+
35
+ def search_attributes
36
+ attribute_types.keys.select do |attribute|
37
+ attribute_types[attribute].searchable?
38
+ end
39
+ end
40
+
41
+ def attribute_types
42
+ @dashboard_class::ATTRIBUTE_TYPES
43
+ end
44
+
45
+ attr_reader :resolver, :term
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Administrate
2
+ VERSION = "0.1.0".freeze
3
+ end
@@ -0,0 +1,36 @@
1
+ require "rails/generators/base"
2
+ require "administrate/generator_helpers"
3
+
4
+ module Administrate
5
+ class ViewGenerator < Rails::Generators::Base
6
+ include Administrate::GeneratorHelpers
7
+
8
+ private
9
+
10
+ def self.template_source_path
11
+ File.expand_path(
12
+ "../../../app/views/administrate/application",
13
+ __FILE__,
14
+ )
15
+ end
16
+
17
+ def copy_resource_template(template_name)
18
+ template_file = "#{template_name}.html.erb"
19
+
20
+ copy_file(
21
+ template_file,
22
+ "app/views/admin/#{resource_path}/#{template_file}",
23
+ )
24
+ end
25
+
26
+ def resource_path
27
+ args.first.try(:underscore).try(:pluralize) || BaseResourcePath.new
28
+ end
29
+
30
+ class BaseResourcePath
31
+ def to_s
32
+ "application"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ require "administrate/view_generator"
2
+
3
+ module Administrate
4
+ module Generators
5
+ class AssetsGenerator < Administrate::ViewGenerator
6
+ def copy_assets
7
+ call_generator("administrate:assets:javascripts")
8
+ call_generator("administrate:assets:stylesheets")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require "rails/generators/base"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Assets
6
+ class JavascriptsGenerator < Rails::Generators::Base
7
+ JAVASCRIPTS_PATH = "app/assets/javascripts/administrate"
8
+
9
+ source_root File.expand_path("../../../../../", __FILE__)
10
+
11
+ def copy_javascripts
12
+ directory JAVASCRIPTS_PATH, JAVASCRIPTS_PATH
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require "rails/generators/base"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Assets
6
+ class StylesheetsGenerator < Rails::Generators::Base
7
+ STYLESHEETS_PATH = "app/assets/stylesheets/administrate"
8
+
9
+ source_root File.expand_path("../../../../../", __FILE__)
10
+
11
+ def copy_stylesheets
12
+ directory STYLESHEETS_PATH, STYLESHEETS_PATH
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Generates a Dashboard object for a model,
3
+ pulling the attributes from database columns.
4
+
5
+ Example:
6
+ rails generate administrate:dashboard FooBar [--namespace admin]
7
+
8
+ This will create:
9
+ app/dashboards/foo_bar_dashboard.rb
@@ -0,0 +1,141 @@
1
+ require "rails/generators/named_base"
2
+
3
+ module Administrate
4
+ module Generators
5
+ class DashboardGenerator < Rails::Generators::NamedBase
6
+ ATTRIBUTE_TYPE_MAPPING = {
7
+ boolean: "Field::Boolean",
8
+ date: "Field::DateTime",
9
+ datetime: "Field::DateTime",
10
+ enum: "Field::String",
11
+ float: "Field::Number",
12
+ integer: "Field::Number",
13
+ time: "Field::DateTime",
14
+ text: "Field::Text",
15
+ string: "Field::String",
16
+ }
17
+
18
+ ATTRIBUTE_OPTIONS_MAPPING = {
19
+ enum: { searchable: false },
20
+ float: { decimals: 2 },
21
+ }
22
+
23
+ DEFAULT_FIELD_TYPE = "Field::String.with_options(searchable: false)"
24
+ COLLECTION_ATTRIBUTE_LIMIT = 4
25
+ READ_ONLY_ATTRIBUTES = %w[id created_at updated_at]
26
+
27
+ class_option :namespace, type: :string, default: "admin"
28
+
29
+ source_root File.expand_path("../templates", __FILE__)
30
+
31
+ def create_dashboard_definition
32
+ template(
33
+ "dashboard.rb.erb",
34
+ Rails.root.join("app/dashboards/#{file_name}_dashboard.rb"),
35
+ )
36
+ end
37
+
38
+ def create_resource_controller
39
+ destination = Rails.root.join(
40
+ "app/controllers/#{namespace}/#{file_name.pluralize}_controller.rb",
41
+ )
42
+
43
+ template("controller.rb.erb", destination)
44
+ end
45
+
46
+ private
47
+
48
+ def namespace
49
+ options[:namespace]
50
+ end
51
+
52
+ def attributes
53
+ klass.reflections.keys + klass.attribute_names - redundant_attributes
54
+ end
55
+
56
+ def form_attributes
57
+ attributes - READ_ONLY_ATTRIBUTES
58
+ end
59
+
60
+ def redundant_attributes
61
+ klass.reflections.keys.flat_map do |relationship|
62
+ redundant_attributes_for(relationship)
63
+ end.compact
64
+ end
65
+
66
+ def redundant_attributes_for(relationship)
67
+ case association_type(relationship)
68
+ when "Field::Polymorphic"
69
+ [relationship + "_id", relationship + "_type"]
70
+ when "Field::BelongsTo"
71
+ relationship + "_id"
72
+ end
73
+ end
74
+
75
+ def field_type(attribute)
76
+ type = column_type_for_attribute(attribute.to_s)
77
+
78
+ if type
79
+ ATTRIBUTE_TYPE_MAPPING.fetch(type, DEFAULT_FIELD_TYPE) +
80
+ options_string(ATTRIBUTE_OPTIONS_MAPPING.fetch(type, {}))
81
+ else
82
+ association_type(attribute)
83
+ end
84
+ end
85
+
86
+ def column_type_for_attribute(attr)
87
+ if enum_column?(attr)
88
+ :enum
89
+ else
90
+ column_types(attr)
91
+ end
92
+ end
93
+
94
+ def enum_column?(attr)
95
+ klass.respond_to?(:defined_enums) &&
96
+ klass.defined_enums.keys.include?(attr)
97
+ end
98
+
99
+ def column_types(attr)
100
+ klass.columns.find { |column| column.name == attr }.try(:type)
101
+ end
102
+
103
+ def association_type(attribute)
104
+ relationship = klass.reflections[attribute.to_s]
105
+ if relationship.has_one?
106
+ "Field::HasOne"
107
+ elsif relationship.collection?
108
+ "Field::HasMany" + relationship_options_string(relationship)
109
+ elsif relationship.polymorphic?
110
+ "Field::Polymorphic"
111
+ else
112
+ "Field::BelongsTo" + relationship_options_string(relationship)
113
+ end
114
+ end
115
+
116
+ def klass
117
+ @klass ||= Object.const_get(class_name)
118
+ end
119
+
120
+ def relationship_options_string(relationship)
121
+ if relationship.class_name != relationship.name.to_s.classify
122
+ options_string(class_name: relationship.class_name)
123
+ else
124
+ ""
125
+ end
126
+ end
127
+
128
+ def options_string(options)
129
+ if options.any?
130
+ ".with_options(#{inspect_hash_as_ruby(options)})"
131
+ else
132
+ ""
133
+ end
134
+ end
135
+
136
+ def inspect_hash_as_ruby(hash)
137
+ hash.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")
138
+ end
139
+ end
140
+ end
141
+ end