archangel 0.0.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.jshintrc +1 -1
  3. data/.reek.yml +42 -0
  4. data/.rubocop.yml +1 -12
  5. data/.rubocop_exclude.yml +12 -0
  6. data/.rubocop_todo.yml +0 -4
  7. data/.travis.yml +5 -7
  8. data/Gemfile +12 -14
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +1 -1
  11. data/app/controllers/archangel/application_controller.rb +0 -2
  12. data/app/controllers/archangel/auth/registrations_controller.rb +12 -0
  13. data/app/controllers/archangel/backend/assets_controller.rb +10 -259
  14. data/app/controllers/archangel/backend/collections_controller.rb +5 -214
  15. data/app/controllers/archangel/backend/entries_controller.rb +25 -239
  16. data/app/controllers/archangel/backend/pages_controller.rb +11 -261
  17. data/app/controllers/archangel/backend/profiles_controller.rb +19 -12
  18. data/app/controllers/archangel/backend/sites_controller.rb +17 -16
  19. data/app/controllers/archangel/backend/templates_controller.rb +5 -232
  20. data/app/controllers/archangel/backend/users_controller.rb +10 -260
  21. data/app/controllers/archangel/backend/widgets_controller.rb +5 -226
  22. data/app/controllers/archangel/frontend/pages_controller.rb +6 -7
  23. data/app/controllers/concerns/archangel/actionable_concern.rb +9 -0
  24. data/app/controllers/concerns/archangel/controllers/backend/resourceful_concern.rb +28 -0
  25. data/app/controllers/concerns/archangel/controllers/resourceful_concern.rb +258 -0
  26. data/app/controllers/concerns/archangel/paginatable_concern.rb +2 -0
  27. data/app/controllers/concerns/archangel/seoable_concern.rb +9 -8
  28. data/app/models/archangel/metatag.rb +12 -0
  29. data/app/models/archangel/page.rb +7 -1
  30. data/app/models/archangel/site.rb +6 -1
  31. data/app/models/archangel/user.rb +7 -0
  32. data/app/views/archangel/backend/pages/_form.html.erb +12 -2
  33. data/app/views/archangel/backend/pages/_metatag_fields.html.erb +6 -0
  34. data/app/views/archangel/backend/pages/show.html.erb +0 -10
  35. data/app/views/archangel/backend/profiles/_form.html.erb +2 -0
  36. data/app/views/archangel/backend/sites/_form.html.erb +11 -2
  37. data/app/views/archangel/backend/sites/_metatag_fields.html.erb +6 -0
  38. data/app/views/archangel/backend/sites/show.html.erb +0 -10
  39. data/app/views/archangel/frontend/pages/show.json.jbuilder +1 -2
  40. data/archangel.gemspec +18 -11
  41. data/bin/archangel +6 -4
  42. data/config/locales/active_record.en.yml +3 -4
  43. data/config/locales/en.yml +6 -0
  44. data/db/migrate/20190101220919_add_preferences_to_archangel_users.rb +5 -0
  45. data/db/migrate/20190113130750_create_archangel_metatags.rb +14 -0
  46. data/db/migrate/20190113130751_remove_meta_keywords_and_meta_description_from_archangel_pages.rb +6 -0
  47. data/db/migrate/20190113130752_remove_meta_keywords_and_meta_description_from_archangel_sites.rb +6 -0
  48. data/docs/Developers.md +2 -2
  49. data/docs/Extension/Developers.md +1 -1
  50. data/docs/Extension/Uploaders.md +53 -1
  51. data/docs/Theme/Developers.md +8 -2
  52. data/lib/archangel.rb +2 -2
  53. data/lib/archangel/commands/base_command.rb +35 -0
  54. data/lib/archangel/commands/extension_command.rb +128 -0
  55. data/lib/archangel/{command/templates/extension → commands/templates/common}/.editorconfig +0 -0
  56. data/lib/archangel/{command/templates/extension → commands/templates/common}/.gitignore +0 -0
  57. data/lib/archangel/{command/templates/extension → commands/templates/common}/.rspec +0 -0
  58. data/lib/archangel/{command/templates/extension → commands/templates/common}/.rubocop.yml +0 -0
  59. data/lib/archangel/{command/templates/extension → commands/templates/common}/MIT-LICENSE +0 -0
  60. data/lib/archangel/{command/templates/extension → commands/templates/common}/spec/rails_helper.rb.tt +0 -3
  61. data/lib/archangel/{command/templates/extension → commands/templates/common}/spec/spec_helper.rb +0 -0
  62. data/lib/archangel/{command/templates/extension → commands/templates/common}/spec/support/.keep +0 -0
  63. data/lib/archangel/{command → commands}/templates/extension/Gemfile +9 -10
  64. data/lib/archangel/{command → commands}/templates/extension/README.md +0 -0
  65. data/lib/archangel/{command → commands}/templates/extension/Rakefile +0 -0
  66. data/lib/archangel/{command → commands}/templates/extension/app/assets/javascripts/archangel/auth/%extension_name%.js.tt +0 -0
  67. data/lib/archangel/{command → commands}/templates/extension/app/assets/javascripts/archangel/backend/%extension_name%.js.tt +0 -0
  68. data/lib/archangel/{command → commands}/templates/extension/app/assets/javascripts/archangel/frontend/%extension_name%.js.tt +0 -0
  69. data/lib/archangel/{command → commands}/templates/extension/app/assets/stylesheets/archangel/auth/%extension_name%.css.tt +0 -0
  70. data/lib/archangel/{command → commands}/templates/extension/app/assets/stylesheets/archangel/backend/%extension_name%.css.tt +0 -0
  71. data/lib/archangel/{command → commands}/templates/extension/app/assets/stylesheets/archangel/frontend/%extension_name%.css.tt +0 -0
  72. data/lib/archangel/{command → commands}/templates/extension/bin/rails.tt +0 -0
  73. data/lib/archangel/{command → commands}/templates/extension/config/locales/en.yml.tt +0 -0
  74. data/lib/archangel/{command → commands}/templates/extension/config/routes.rb +0 -0
  75. data/lib/archangel/{command/templates/extension/extension.gemspec → commands/templates/extension/extension.gemspec.tt} +0 -0
  76. data/lib/archangel/{command → commands}/templates/extension/lib/%extension_name%.rb.tt +0 -0
  77. data/lib/archangel/{command → commands}/templates/extension/lib/%extension_name%/engine.rb.tt +0 -0
  78. data/lib/archangel/{command → commands}/templates/extension/lib/%extension_name%/factories.rb.tt +0 -0
  79. data/lib/archangel/{command → commands}/templates/extension/lib/%extension_name%/version.rb.tt +0 -0
  80. data/lib/archangel/{command → commands}/templates/extension/lib/generators/%extension_name%/install/install_generator.rb.tt +0 -0
  81. data/lib/archangel/commands/templates/theme/Gemfile +27 -0
  82. data/lib/archangel/commands/templates/theme/README.md +44 -0
  83. data/lib/archangel/commands/templates/theme/Rakefile +29 -0
  84. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/javascripts/%theme_base_name%/auth.js +2 -0
  85. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/javascripts/%theme_base_name%/backend.js +2 -0
  86. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/javascripts/%theme_base_name%/frontend.js +2 -0
  87. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/stylesheets/%theme_base_name%/auth.css +4 -0
  88. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/stylesheets/%theme_base_name%/backend.css +4 -0
  89. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/assets/stylesheets/%theme_base_name%/frontend.css +4 -0
  90. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/config/locales/en.yml.tt +4 -0
  91. data/lib/archangel/commands/templates/theme/app/themes/%theme_base_name%/views/layouts/frontend.liquid +18 -0
  92. data/lib/archangel/commands/templates/theme/bin/rails.tt +11 -0
  93. data/lib/archangel/commands/templates/theme/lib/%theme_name%.rb.tt +9 -0
  94. data/lib/archangel/commands/templates/theme/lib/%theme_name%/engine.rb.tt +29 -0
  95. data/lib/archangel/commands/templates/theme/lib/%theme_name%/version.rb.tt +5 -0
  96. data/lib/archangel/commands/templates/theme/theme.gemspec.tt +25 -0
  97. data/lib/archangel/commands/theme_command.rb +129 -0
  98. data/lib/archangel/config.rb +11 -2
  99. data/lib/archangel/liquid/drop.rb +26 -0
  100. data/lib/archangel/liquid/drops/page_drop.rb +1 -1
  101. data/lib/archangel/liquid/drops/site_drop.rb +1 -1
  102. data/lib/archangel/liquid/filters/link_to_filter.rb +1 -0
  103. data/lib/archangel/liquid/tags/application_tag.rb +18 -5
  104. data/lib/archangel/liquid/tags/collection_tag.rb +1 -1
  105. data/lib/archangel/liquid/tags/csrf_meta_tags_tag.rb +1 -0
  106. data/lib/archangel/liquid/tags/locale_tag.rb +1 -0
  107. data/lib/archangel/liquid/tags/meta_tags_tag.rb +1 -0
  108. data/lib/archangel/liquid/tags/noembed_tag.rb +140 -0
  109. data/lib/archangel/liquid/tags/text_direction_tag.rb +1 -0
  110. data/lib/archangel/liquid/tags/theme_javascript_tag.rb +1 -0
  111. data/lib/archangel/liquid/tags/theme_stylesheet_tag.rb +1 -0
  112. data/lib/archangel/testing_support/factories/archangel_assets.rb +2 -2
  113. data/lib/archangel/testing_support/factories/archangel_collections.rb +1 -1
  114. data/lib/archangel/testing_support/factories/archangel_entries.rb +1 -1
  115. data/lib/archangel/testing_support/factories/archangel_fields.rb +4 -4
  116. data/lib/archangel/testing_support/factories/archangel_metatags.rb +21 -0
  117. data/lib/archangel/testing_support/factories/archangel_pages.rb +5 -7
  118. data/lib/archangel/testing_support/factories/archangel_sites.rb +1 -3
  119. data/lib/archangel/testing_support/factories/archangel_templates.rb +7 -7
  120. data/lib/archangel/testing_support/factories/archangel_users.rb +10 -10
  121. data/lib/archangel/testing_support/factories/archangel_widgets.rb +2 -2
  122. data/lib/archangel/testing_support/matchers/have_meta.rb +18 -0
  123. data/lib/archangel/testing_support/matchers/have_title.rb +18 -0
  124. data/lib/archangel/testing_support/rake/dummy_rake.rb +0 -2
  125. data/lib/archangel/version.rb +1 -1
  126. data/lib/generators/archangel/install/templates/config/archangel.yml +52 -37
  127. data/spec/controllers/archangel/backend/entries_controller_spec.rb +3 -3
  128. data/spec/controllers/archangel/backend/pages_controller_spec.rb +17 -1
  129. data/spec/controllers/archangel/backend/profiles_controller_spec.rb +1 -1
  130. data/spec/controllers/archangel/backend/sites_controller_spec.rb +6 -6
  131. data/spec/controllers/archangel/backend/users_controller_spec.rb +2 -2
  132. data/spec/controllers/archangel/frontend/pages_controller_spec.rb +2 -6
  133. data/spec/controllers/concerns/archangel/controllers/backend/resourceful_concern_spec.rb +90 -0
  134. data/spec/features/auth/registration_spec.rb +18 -0
  135. data/spec/features/frontend/liquid_drop_variables_spec.rb +51 -57
  136. data/spec/features/frontend/pages/homepage_redirect_spec.rb +2 -2
  137. data/spec/features/frontend/pages/metatags_spec.rb +73 -0
  138. data/spec/helpers/archangel/flash_helper_spec.rb +14 -0
  139. data/spec/lib/archangel/{command/extension_spec.rb → commands/extension_command_spec.rb} +3 -3
  140. data/spec/lib/archangel/commands/theme_command_spec.rb +100 -0
  141. data/spec/lib/archangel/liquid/drops/page_drop_spec.rb +1 -9
  142. data/spec/lib/archangel/liquid/drops/site_drop_spec.rb +2 -12
  143. data/spec/lib/archangel/liquid/tags/noembed_tag_spec.rb +76 -0
  144. data/spec/mailers/archangel/{application_job_spec.rb → application_mailer_spec.rb} +0 -0
  145. data/spec/models/archangel/metatag_spec.rb +22 -0
  146. data/spec/models/archangel/page_spec.rb +5 -2
  147. data/spec/models/archangel/site_spec.rb +2 -0
  148. data/spec/rails_helper.rb +1 -0
  149. data/spec/uploaders/archangel/application_uploader_spec.rb +1 -1
  150. data/spec/uploaders/archangel/asset_uploader_spec.rb +1 -1
  151. metadata +108 -93
  152. data/.reek +0 -44
  153. data/lib/archangel/command/extension.rb +0 -97
@@ -16,6 +16,7 @@ module Archangel
16
16
  # @param context [Object] the Liquid context
17
17
  # @return [String] the CSRF meta tags
18
18
  #
19
+ # :reek:UtilityFunction
19
20
  def render(context)
20
21
  context.registers[:view].csrf_meta_tags
21
22
  end
@@ -16,6 +16,7 @@ module Archangel
16
16
  # @param context [Object] the Liquid context
17
17
  # @return [String] the locale
18
18
  #
19
+ # :reek:UtilityFunction
19
20
  def render(context)
20
21
  context.registers[:view].locale
21
22
  end
@@ -18,6 +18,7 @@ module Archangel
18
18
  # @param context [Object] the Liquid context
19
19
  # @return [String] the meta tags
20
20
  #
21
+ # :reek:UtilityFunction
21
22
  def render(context)
22
23
  context.registers[:view].display_meta_tags
23
24
  end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ module Liquid
5
+ module Tags
6
+ ##
7
+ # Noembed custom tag for Liquid
8
+ #
9
+ # For more information about Noembed, see https://noembed.com/
10
+ #
11
+ # Example
12
+ # {% noembed "https://www.youtube.com/watch?v=-X2atEH7nCg" %}
13
+ # {% noembed "https://vimeo.com/70707344" %}
14
+ # {% noembed "https://vimeo.com/70707344" remote: true %}
15
+ # {% noembed "https://vimeo.com/70707344" maxwidth:600 %}
16
+ # {% noembed "https://vimeo.com/70707344" maxheight:400 %}
17
+ #
18
+ class NoembedTag < ApplicationTag
19
+ require "digest/md5"
20
+ require "net/http"
21
+
22
+ ##
23
+ # Noembed for Liquid
24
+ #
25
+ # @param tag_name [String] the Liquid tag name
26
+ # @param markup [String] the passed options
27
+ # @param options [Object] options
28
+ #
29
+ def initialize(tag_name, markup, options)
30
+ super
31
+
32
+ match = URL_ATTRIBUTES_SYNTAX.match(markup)
33
+
34
+ if match.blank?
35
+ raise ::Liquid::SyntaxError, Archangel.t("errors.syntax.noembed")
36
+ end
37
+
38
+ @url = ::Liquid::Variable.new(match[:url], options).name
39
+ @attributes = { remote: false }
40
+
41
+ match[:attributes].scan(KEY_VALUE_ATTRIBUTES_SYNTAX) do |key, value|
42
+ @attributes[key.to_sym] = ::Liquid::Expression.parse(value)
43
+ end
44
+ end
45
+
46
+ ##
47
+ # Render the Widget
48
+ #
49
+ # @param _context [Object] the Liquid context
50
+ # @return [String] the rendered Widget
51
+ #
52
+ def render(_context)
53
+ return if url.blank?
54
+
55
+ noembed_id = "noembed-#{Digest::MD5.hexdigest(url)}"
56
+
57
+ content = if %w[1 true yes y].include?(attributes[:remote].to_s)
58
+ build_js_request(noembed_id)
59
+ else
60
+ build_ruby_request
61
+ end
62
+
63
+ content_tag(:div, raw(content), id: noembed_id, class: "noembed")
64
+ end
65
+
66
+ protected
67
+
68
+ attr_reader :attributes, :url
69
+
70
+ def build_ruby_request
71
+ uri = URI(noembed_url)
72
+ uri.query = URI.encode_www_form(query_params)
73
+
74
+ res = Net::HTTP.get_response(uri)
75
+
76
+ unless res.is_a?(Net::HTTPSuccess)
77
+ return "<span class='status error'>Error connecting to noembed " \
78
+ "server.</span>"
79
+ end
80
+
81
+ resp = JSON.parse(res.body)
82
+
83
+ if resp.fetch("html", nil).blank?
84
+ message = resp["error"] || "Unknown error."
85
+ "<span class='status error'>#{message}</span>"
86
+ else
87
+ resp["html"]
88
+ end
89
+ end
90
+
91
+ def build_js_request(noembed_id)
92
+ noembed_request_url = [
93
+ noembed_url,
94
+ query_params.to_query
95
+ ].join("?")
96
+
97
+ <<-NOEMBED
98
+ <script type="text/javascript">
99
+ document.addEventListener("DOMContentLoaded", function() {
100
+ var noembedElement = document.querySelector('##{noembed_id}'),
101
+ noembedRequest = new XMLHttpRequest();
102
+ noembedElement.innerHTML = '<span class="status">Embedding&hellip;</span>';
103
+ noembedRequest.open('GET', '#{noembed_request_url}', true);
104
+ noembedRequest.setRequestHeader('Content-type', 'application/json');
105
+ noembedRequest.onload = function() {
106
+ var response = JSON.parse(noembedRequest.responseText)
107
+ if (response.html) {
108
+ noembedElement.innerHTML = response.html;
109
+ }
110
+ else {
111
+ noembedElement.innerHTML = '<span class="status error">' + (response.error || 'Unknown error.') + '</span>';
112
+ }
113
+ };
114
+ noembedRequest.onerror = function () {
115
+ noembedElement.innerHTML = '<span class="status error">Error connecting to noembed server.</span>';
116
+ };
117
+ noembedRequest.send(null);
118
+ });
119
+ </script>
120
+ NOEMBED
121
+ end
122
+
123
+ def noembed_url
124
+ "https://noembed.com/embed"
125
+ end
126
+
127
+ def query_params
128
+ {
129
+ url: url,
130
+ maxwidth: attributes.fetch(:maxwidth, nil),
131
+ maxheight: attributes.fetch(:maxheight, nil),
132
+ nowrap: attributes.fetch(:nowrap, "on")
133
+ }.compact.reject { |_, val| val.blank? }
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ ::Liquid::Template.register_tag("noembed", Archangel::Liquid::Tags::NoembedTag)
@@ -16,6 +16,7 @@ module Archangel
16
16
  # @param context [Object] the Liquid context
17
17
  # @return [String] the text direction
18
18
  #
19
+ # :reek:UtilityFunction
19
20
  def render(context)
20
21
  context.registers[:view].text_direction
21
22
  end
@@ -16,6 +16,7 @@ module Archangel
16
16
  # @param context [Object] the Liquid context
17
17
  # @return [String] the Javascript for the theme
18
18
  #
19
+ # :reek:UtilityFunction
19
20
  def render(context)
20
21
  view = context.registers[:view]
21
22
 
@@ -16,6 +16,7 @@ module Archangel
16
16
  # @param context [Object] the Liquid context
17
17
  # @return [String] the stylesheet for the theme
18
18
  #
19
+ # :reek:UtilityFunction
19
20
  def render(context)
20
21
  view = context.registers[:view]
21
22
 
@@ -5,8 +5,8 @@ FactoryBot.define do
5
5
  site
6
6
  sequence(:file_name) { |n| "image-#{n}.jpg" }
7
7
  file { fixture_file_upload(uploader_test_image) }
8
- content_type "image/jpg"
9
- file_size 123
8
+ content_type { "image/jpg" }
9
+ file_size { 123 }
10
10
 
11
11
  trait :deleted do
12
12
  deleted_at { Time.current }
@@ -12,7 +12,7 @@ FactoryBot.define do
12
12
 
13
13
  trait :with_fields do
14
14
  transient do
15
- fields_count 3
15
+ fields_count { 3 }
16
16
  end
17
17
 
18
18
  after(:create) do |collection, evaluator|
@@ -11,7 +11,7 @@ FactoryBot.define do
11
11
  end
12
12
 
13
13
  trait :unavailable do
14
- available_at nil
14
+ available_at { nil }
15
15
  end
16
16
 
17
17
  trait :future do
@@ -5,12 +5,12 @@ FactoryBot.define do
5
5
  collection
6
6
  sequence(:label) { |n| "Field #{n} Label" }
7
7
  sequence(:slug) { |n| "field-#{n}" }
8
- value "Field default value"
9
- classification "string"
10
- required false
8
+ value { "Field default value" }
9
+ classification { "string" }
10
+ required { false }
11
11
 
12
12
  trait :required do
13
- required true
13
+ required { true }
14
14
  end
15
15
 
16
16
  trait :deleted do
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :metatag, class: "Archangel::Metatag" do
5
+ association(:metatagable, factory: :page)
6
+ name { "description" }
7
+ content { "This is the description of this Page" }
8
+
9
+ trait :for_page do
10
+ association(:metatagable, factory: :page)
11
+ name { "description" }
12
+ content { "This is the description of the Page" }
13
+ end
14
+
15
+ trait :for_site do
16
+ association(:metatagable, factory: :site)
17
+ name { "description" }
18
+ content { "This is the description of the Site" }
19
+ end
20
+ end
21
+ end
@@ -3,13 +3,11 @@
3
3
  FactoryBot.define do
4
4
  factory :page, class: "Archangel::Page" do
5
5
  site
6
- template nil
6
+ template { nil }
7
7
  sequence(:title) { |n| "Page #{n} Title" }
8
8
  sequence(:slug) { |n| "page-#{n}" }
9
- content "<p>Content of the page</p>"
10
- meta_keywords "default,keywords,of,my,page"
11
- meta_description "Default description of my page"
12
- homepage false
9
+ content { "<p>Content of the page</p>" }
10
+ homepage { false }
13
11
  published_at { Time.current }
14
12
 
15
13
  trait :with_parent do
@@ -21,11 +19,11 @@ FactoryBot.define do
21
19
  end
22
20
 
23
21
  trait :homepage do
24
- homepage true
22
+ homepage { true }
25
23
  end
26
24
 
27
25
  trait :unpublished do
28
- published_at nil
26
+ published_at { nil }
29
27
  end
30
28
 
31
29
  trait :future do
@@ -5,9 +5,7 @@ FactoryBot.define do
5
5
  initialize_with { Archangel::Site.first_or_create }
6
6
 
7
7
  sequence(:name) { |n| "Site #{n} Name" }
8
- locale "en"
9
- meta_keywords "default,keywords,of,my,site"
10
- meta_description "Default description of my site"
8
+ locale { "en" }
11
9
 
12
10
  trait :logo do
13
11
  logo { fixture_file_upload(uploader_test_image) }
@@ -4,15 +4,15 @@ FactoryBot.define do
4
4
  factory :template, class: "Archangel::Template" do
5
5
  site
6
6
  sequence(:name) { |n| "Template #{n} Name" }
7
- content <<-CONTENT
8
- <p>BEFORE TEMPLATE<p>
9
- <p>{{ content_for_layout }}<p>
10
- <p>AFTER TEMPLATE<p>
11
- CONTENT
12
- partial false
7
+ content do
8
+ "<p>BEFORE TEMPLATE<p>
9
+ <p>{{ content_for_layout }}<p>
10
+ <p>AFTER TEMPLATE<p>"
11
+ end
12
+ partial { false }
13
13
 
14
14
  trait :partial do
15
- partial true
15
+ partial { true }
16
16
  end
17
17
 
18
18
  trait :deleted do
@@ -6,7 +6,7 @@ FactoryBot.define do
6
6
  sequence(:name) { |n| "User #{n}" }
7
7
  sequence(:username) { |n| "username#{n}" }
8
8
  sequence(:email) { |n| "user#{n}@example.com" }
9
- password "password"
9
+ password { "password" }
10
10
  sequence(:confirmation_token) { |n| "token-#{n}" }
11
11
  confirmed_at { Time.current }
12
12
  confirmation_sent_at { Time.current }
@@ -16,34 +16,34 @@ FactoryBot.define do
16
16
  end
17
17
 
18
18
  trait :admin do
19
- role "admin"
19
+ role { "admin" }
20
20
  end
21
21
 
22
22
  trait :editor do
23
- role "editor"
23
+ role { "editor" }
24
24
  end
25
25
 
26
26
  trait :unconfirmed do
27
- confirmed_at nil
27
+ confirmed_at { nil }
28
28
  end
29
29
 
30
30
  trait :reset do
31
- reset_password_token "abc123"
31
+ reset_password_token { "abc123" }
32
32
  reset_password_sent_at { Time.current }
33
33
  end
34
34
 
35
35
  trait :locked do
36
- failed_attempts 10
37
- unlock_token "123abc"
36
+ failed_attempts { 10 }
37
+ unlock_token { "123abc" }
38
38
  locked_at { Time.current }
39
39
  end
40
40
 
41
41
  trait :tracks do
42
- sign_in_count 2
42
+ sign_in_count { 2 }
43
43
  current_sign_in_at { Time.current }
44
44
  last_sign_in_at { 1.day.ago }
45
- current_sign_in_ip "127.0.0.1"
46
- last_sign_in_ip "127.0.0.1"
45
+ current_sign_in_ip { "127.0.0.1" }
46
+ last_sign_in_ip { "127.0.0.1" }
47
47
  end
48
48
 
49
49
  trait :deleted do
@@ -3,10 +3,10 @@
3
3
  FactoryBot.define do
4
4
  factory :widget, class: "Archangel::Widget" do
5
5
  site
6
- template nil
6
+ template { nil }
7
7
  sequence(:name) { |n| "Widget #{n}" }
8
8
  sequence(:slug) { |n| "widget-#{n}" }
9
- content "<p>Content of the widget</p>"
9
+ content { "<p>Content of the widget</p>" }
10
10
 
11
11
  trait :with_template do
12
12
  association :template, factory: :template, partial: true
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :have_meta do |name, expected|
4
+ match do |_actual|
5
+ has_css?("meta[name='#{name}'][content='#{expected}']", visible: false)
6
+ end
7
+
8
+ failure_message do |_actual|
9
+ actual = first("meta[name='#{name}']")
10
+
11
+ if actual
12
+ "expected that meta #{name} would have content='#{expected}' " \
13
+ "but was '#{actual[:content]}'"
14
+ else
15
+ "expected that meta #{name} would exist with content='#{expected}'"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec::Matchers.define :have_title do |expected|
4
+ match do |_actual|
5
+ has_css?("title", text: expected)
6
+ end
7
+
8
+ failure_message_for_should do |_actual|
9
+ actual = first("title")
10
+
11
+ if actual
12
+ "expected that title would have been '#{expected}' " \
13
+ "but was '#{actual.text}'"
14
+ else
15
+ "expected that title would exist with '#{expected}'"
16
+ end
17
+ end
18
+ end
@@ -25,7 +25,6 @@ namespace :dummy do
25
25
  "--auto-accept",
26
26
  "--migrate=false",
27
27
  "--seed=false",
28
- "--sample=false",
29
28
  "--quiet"
30
29
  ]
31
30
 
@@ -48,7 +47,6 @@ namespace :dummy do
48
47
  "--auto-run-migrations",
49
48
  "--auto-accept",
50
49
  "--migrate",
51
- "--skip-sample",
52
50
  "--skip-seed",
53
51
  "--skip-turbolinks",
54
52
  "--route-path=#{lib}",