locomotivecms 3.3.0.rc3 → 3.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d37da81dfb746c28ecdba02efef450619dcccd87
4
- data.tar.gz: e82164ac57b58b259e95202bd6f68b8a7eab3097
3
+ metadata.gz: 63ada27d247c263d104f61e50c76975e1c60be31
4
+ data.tar.gz: 9d63c89ace631caf49bc827b42accc9725835409
5
5
  SHA512:
6
- metadata.gz: d30c1f7da8df089bee6a3081bcc41d6dee1f74fa57752d1aebbede70b9c2c2036bae21a0487bd1f213efad48549269d1b5c023fd2dfdebcbe293abba3ca3ce76
7
- data.tar.gz: 91202542e10f83a06b221e33bcffb0b6030cb204e0eabb2e83cc6a174d77159f9fe0518b0ed0b15224e60f596e0181d769b589b3cfc0d3910ad34a39d79f5db3
6
+ metadata.gz: b4a07cee2278ffe00327ab17fa6f1cdc73fcba68c6883d494e55a1c231b034c0e7119f1052452197611a7b2ba014a3de4f92d33d6675030c75d2b0a492eb3977
7
+ data.tar.gz: 717311d1ea81fe45d97d991010fd1a2ca126b45ae3ed974e5134c9ffb12d8154e4e72128cb442adeea66f572d370dac6add9968606ae59f489a92c79ed21cbd7
data/Gemfile CHANGED
@@ -18,13 +18,13 @@ end
18
18
 
19
19
  group :development do
20
20
  # gem 'custom_fields', path: '../gems/custom_fields' # for Developers
21
- # gem 'custom_fields', github: 'locomotivecms/custom_fields', ref: '4a612e5'
21
+ # gem 'custom_fields', github: 'locomotivecms/custom_fields', ref: '27f1d62'
22
22
 
23
23
  # gem 'locomotivecms_common', path: '../gems/common', require: false
24
24
  # gem 'locomotivecms_common', github: 'locomotivecms/common', ref: '257047b', require: false
25
25
 
26
26
  # gem 'locomotivecms_steam', path: '../gems/steam', require: false
27
- # gem 'locomotivecms_steam', github: 'locomotivecms/steam', ref: '87c8535', require: false
27
+ # gem 'locomotivecms_steam', github: 'locomotivecms/steam', ref: '0cf606c', require: false
28
28
 
29
29
  # gem 'locomotive_liquid', path: '../gems/liquid' # for Developers
30
30
  # gem 'locomotivecms_solid', path: '../gems/solid' # for Developers
@@ -7,7 +7,7 @@ module Locomotive
7
7
  expose :name, :handle, :seo_title, :meta_keywords, :meta_description,
8
8
  :robots_txt, :cache_enabled, :private_access
9
9
 
10
- expose :locales, :domains, :url_redirections
10
+ expose :locales, :domains, :asset_host, :url_redirections
11
11
 
12
12
  expose :memberships, using: MembershipEntity
13
13
 
@@ -4,6 +4,8 @@ module Locomotive
4
4
 
5
5
  class ContentEntryForm < BaseForm
6
6
 
7
+ NON_CUSTOM_FIELD_ATTRIBUTES = %w{_auth_reset_token _auth_reset_sent_at}
8
+
7
9
  attr_accessor :content_type, :dynamic_attributes
8
10
 
9
11
  attrs :_slug, :_position, :_visible, :seo_title, :meta_keywords, :meta_description
@@ -41,8 +43,10 @@ module Locomotive
41
43
  if respond_to?(:"set_#{field.type}")
42
44
  public_send(:"set_#{field.type}", field, args.first)
43
45
  else
44
- dynamic_attributes[field.name.to_sym] = args.first
46
+ dynamic_attributes[getter_name(name).to_sym] = args.first
45
47
  end
48
+ elsif NON_CUSTOM_FIELD_ATTRIBUTES.include?(getter_name(name))
49
+ dynamic_attributes[getter_name(name).to_sym] = args.first
46
50
  else
47
51
  super
48
52
  end
@@ -54,14 +58,19 @@ module Locomotive
54
58
 
55
59
  private
56
60
 
61
+ def getter_name(name)
62
+ name.to_s.gsub(/=\z/, '')
63
+ end
64
+
57
65
  def find_field(name)
58
- _name = name.to_s.gsub(/=$/, '')
59
- dynamic_setters[_name]
66
+ dynamic_setters[getter_name(name)]
60
67
  end
61
68
 
62
69
  def dynamic_setters
63
70
  @dynamic_setters ||= self.content_type.entries_custom_fields.inject({}) do |hash, field|
64
71
  case field.type.to_sym
72
+ when :password
73
+ hash[field.name] = hash["#{field.name}_confirmation"] = field
65
74
  when :file
66
75
  hash[field.name] = hash["remote_#{field.name}_url"] = hash["remove_#{field.name}"] = field
67
76
  when :belongs_to
@@ -4,7 +4,7 @@ module Locomotive
4
4
 
5
5
  class SiteForm < BaseForm
6
6
 
7
- attrs :name, :handle, :robots_txt, :locales, :domains, :url_redirections, :timezone, :picture, :cache_enabled, :private_access, :password, :metafields_schema, :metafields, :metafields_ui
7
+ attrs :name, :handle, :robots_txt, :locales, :domains, :url_redirections, :timezone, :picture, :cache_enabled, :private_access, :password, :metafields_schema, :metafields, :metafields_ui, :asset_host
8
8
  attrs :seo_title, :meta_keywords, :meta_description, localized: true
9
9
 
10
10
  # Make sure locales and domains are in arrays.
@@ -4,7 +4,7 @@ module Locomotive
4
4
  module PaginationHelper
5
5
 
6
6
  def add_pagination_header(collection)
7
- header 'X-Total-Pages', collection.num_pages.to_s
7
+ header 'X-Total-Pages', collection.total_pages.to_s
8
8
  header 'X-Per-Page', collection.limit_value.to_s
9
9
  header 'X-Total-Entries', collection.total_count.to_s
10
10
  end
@@ -44,6 +44,7 @@ module Locomotive
44
44
  optional :metafields_schema
45
45
  optional :metafields
46
46
  optional :metafields_ui
47
+ optional :asset_host
47
48
  end
48
49
  end
49
50
  put do
@@ -71,6 +71,7 @@ module Locomotive
71
71
  optional :metafields_schema
72
72
  optional :metafields
73
73
  optional :metafields_ui
74
+ optional :asset_host
74
75
  end
75
76
  end
76
77
  post do
@@ -101,6 +102,7 @@ module Locomotive
101
102
  optional :password
102
103
  optional :metafields_schema
103
104
  optional :metafields
105
+ optional :asset_host
104
106
  end
105
107
  end
106
108
  put ':id' do
@@ -6,7 +6,7 @@ module Locomotive
6
6
  before_filter :load_translation, only: [:edit, :update]
7
7
 
8
8
  def index
9
- authorize ThemeAsset
9
+ authorize Translation
10
10
  @translations = service.all(params.slice(:page, :per_page, :q, :filter_by))
11
11
  respond_with @translations
12
12
  end
@@ -12,6 +12,7 @@ module Locomotive
12
12
  field :domains, type: Array, default: []
13
13
  field :redirect_to_first_domain, type: Boolean, default: false
14
14
  field :redirect_to_https, type: Boolean, default: false
15
+ field :asset_host
15
16
 
16
17
  ## indexes ##
17
18
  index domains: 1
@@ -24,6 +25,7 @@ module Locomotive
24
25
  multiline: true
25
26
  validate :domains_must_be_valid_and_unique
26
27
  validate :domains_must_not_be_reserved
28
+ validate :asset_host_must_be_valid
27
29
 
28
30
  ## callbacks ##
29
31
  before_validation :prepare_domain_sync
@@ -54,6 +56,10 @@ module Locomotive
54
56
  array = [] if array.blank?; super(array.map(&:downcase))
55
57
  end
56
58
 
59
+ def asset_host=(asset_host)
60
+ super(asset_host.try(:downcase))
61
+ end
62
+
57
63
  protected
58
64
 
59
65
  def prepare_domain_sync
@@ -76,6 +82,14 @@ module Locomotive
76
82
  end
77
83
  end
78
84
 
85
+ def asset_host_must_be_valid
86
+ return if self.asset_host.blank?
87
+
88
+ if not asset_host =~ Locomotive::Regexps::ASSET_HOST
89
+ self.errors.add(:asset_host, :invalid_domain, value: asset_host)
90
+ end
91
+ end
92
+
79
93
  def domains_must_not_be_reserved
80
94
  return if self.domains.empty? || Locomotive.config.reserved_domains.blank?
81
95
 
@@ -20,6 +20,9 @@ module Locomotive
20
20
  ## behaviours ##
21
21
  slugify_from :name
22
22
 
23
+ ## indexes ##
24
+ index site_id: 1, slug: 1
25
+
23
26
  ## methods ##
24
27
 
25
28
  def touch_site_attribute
@@ -46,11 +46,11 @@ module Locomotive
46
46
  end
47
47
 
48
48
  def permitted_attributes
49
- plain = [:name, :handle, :picture, :remove_picture, :seo_title, :meta_keywords, :meta_description, :timezone_name, :robots_txt, :cache_enabled, :redirect_to_first_domain, :redirect_to_https, :private_access, :password, :prefix_default_locale]
49
+ plain = [:name, :handle, :picture, :remove_picture, :seo_title, :meta_keywords, :meta_description, :timezone_name, :robots_txt, :asset_host, :cache_enabled, :redirect_to_first_domain, :redirect_to_https, :private_access, :password, :prefix_default_locale]
50
50
  hash = { domains: [], locales: [], url_redirections: [] }
51
51
 
52
52
  unless update_advanced?
53
- plain -= [:timezone_name, :robots_txt, :cache_enabled, :prefix_default_locale]
53
+ plain -= [:timezone_name, :robots_txt, :cache_enabled, :prefix_default_locale, :asset_host]
54
54
  hash.delete(:locales)
55
55
  hash.delete(:url_redirections)
56
56
  end
@@ -4,6 +4,8 @@
4
4
 
5
5
  = f.input :domains, as: :array, hint: t(:domains, scope: 'simple_form.hints.locomotive.site', domain: Locomotive.config.host || request.host).html_safe, placeholder: true, collection: f.object.domains, template: :domain, template_url: new_domain_current_site_path(current_site)
6
6
 
7
+ = f.input :asset_host, hint: t(:asset_host, scope: 'simple_form.hints.locomotive.site').html_safe
8
+
7
9
  = f.input :redirect_to_first_domain, as: :toggle
8
10
  = f.input :redirect_to_https, as: :toggle
9
11
 
@@ -96,6 +96,7 @@ en:
96
96
  meta_description: "Meta description used within the head tag of the page. Required for SEO."
97
97
  robots_txt: "Content of the <span class='code'>/robots.txt</span> file. Check the following <a href='http://www.w3.org/TR/html4/appendix/notes.html#h-B.4.1.1'>url</a> for more information."
98
98
  domains: "Add your domains just below. Documentation <a href=\"https://locomotive-v3.readme.io/docs/domains\">here</a> for more information."
99
+ asset_host: "Site-specific asset host that overrides engine asset host (ex. \"localhost\", \"asset.dev\", \"https://asset-host.com/\")."
99
100
  memberships: "You can invite other accounts to edit/manage the site."
100
101
  cache_enabled: "When enabled, your pages will be cached as long as the content doesn't change. Disabling cache per page is allowed."
101
102
  redirect_to_first_domain: "When enabled, requests made to any domains listed above will be redirected to the first domain."
@@ -67,7 +67,7 @@ end
67
67
  RUBY
68
68
  end
69
69
 
70
- gem 'platform-api', '~> 0.3.0'
70
+ gem 'platform-api', '~> 2'
71
71
  end
72
72
  end
73
73
 
@@ -9,7 +9,7 @@ development:
9
9
  # Provides the hosts the default client can connect to. Must be an array
10
10
  # of host:port pairs. (required)
11
11
  hosts:
12
- - localhost:27017
12
+ - 127.0.0.1:27017
13
13
  options:
14
14
  # Change the default write concern. (default = { w: 1 })
15
15
  # write:
@@ -129,7 +129,7 @@ test:
129
129
  default:
130
130
  database: <%= Rails.application.class.parent.to_s.underscore.downcase %>_test
131
131
  hosts:
132
- - localhost:27017
132
+ - 127.0.0.1:27017
133
133
  options:
134
134
  max_pool_size: 1
135
135
 
@@ -138,6 +138,6 @@ production:
138
138
  default:
139
139
  database: <%= Rails.application.class.parent.to_s.underscore.downcase %>_production
140
140
  hosts:
141
- - localhost:27017
141
+ - 127.0.0.1:27017
142
142
  options:
143
143
  max_pool_size: 1
@@ -40,7 +40,7 @@ module Locomotive
40
40
  add_authenticated_header
41
41
 
42
42
  if get?
43
- add_pagination_header if resource.respond_to?(:num_pages)
43
+ add_pagination_header if resource.respond_to?(:total_pages)
44
44
  display(resource)
45
45
  elsif has_errors?
46
46
  with_flash_message(:alert) do
@@ -100,7 +100,7 @@ module Locomotive
100
100
  end
101
101
 
102
102
  def add_pagination_header
103
- controller.headers['X-Total-Pages'] = resource.num_pages.to_s
103
+ controller.headers['X-Total-Pages'] = resource.total_pages.to_s
104
104
  controller.headers['X-Per-Page'] = resource.limit_value.to_s
105
105
  controller.headers['X-Total-Entries'] = resource.total_count.to_s
106
106
  end
@@ -8,7 +8,8 @@ require 'devise'
8
8
  require 'devise/orm/mongoid'
9
9
  require 'devise-encryptable'
10
10
  require 'simple_token_authentication'
11
- require 'kaminari'
11
+ require 'kaminari/mongoid'
12
+ require 'kaminari/actionview'
12
13
  require 'bootstrap-kaminari-views'
13
14
  require 'bootstrap-sass'
14
15
  require 'font-awesome-sass'
@@ -9,5 +9,8 @@ module Locomotive
9
9
 
10
10
  URL_AND_MAILTO = /\A((https?:\/\/\S+)|(ftp:\/\S+)|(mailto:\S+)|\/\S*)\Z/
11
11
 
12
+ # e.g. hostname, hostname.com, http(s)://hostname, http(s)://hostname.com/
13
+ ASSET_HOST = /\A((https?:\/\/)?)(([a-z\d])([a-z\d-]){0,61}([a-z\d]))(\.([a-z\d])([a-z\d-]){0,61}([a-z\d]))*\/?$/i
14
+
12
15
  end
13
16
  end
@@ -4,6 +4,8 @@ module Locomotive
4
4
 
5
5
  class WysihtmlCss
6
6
 
7
+ GOOGLE_AMP_PATH = '_amp'
8
+
7
9
  def initialize(app, opts = {})
8
10
  @app = app
9
11
  end
@@ -11,7 +13,7 @@ module Locomotive
11
13
  def call(env)
12
14
  status, headers, response = @app.call(env)
13
15
 
14
- if content?(env['steam.page'], response)
16
+ if content?(env['steam.page'], env['steam.path'], response)
15
17
  url = ::ActionController::Base.helpers.stylesheet_path('locomotive/wysihtml5_editor')
16
18
  html = %(<link rel="stylesheet" type="text/css" href="#{url}">)
17
19
  response.first.gsub!('</head>', %(#{html}</head>))
@@ -22,8 +24,11 @@ module Locomotive
22
24
 
23
25
  protected
24
26
 
25
- def content?(page, response)
26
- page && !page.redirect && page.response_type == 'text/html' && response.first
27
+ def content?(page, path, response)
28
+ !path.starts_with?(GOOGLE_AMP_PATH + '/') &&
29
+ !page.redirect &&
30
+ page.response_type == 'text/html' &&
31
+ response.first
27
32
  end
28
33
 
29
34
  end
@@ -2,5 +2,5 @@
2
2
  # MAJOR.MINOR.PATCH format.
3
3
  # 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0
4
4
  module Locomotive #:nodoc
5
- VERSION = '3.3.0.rc3'
5
+ VERSION = '3.3.0'
6
6
  end
@@ -10,7 +10,7 @@ development:
10
10
  # Provides the hosts the default client can connect to. Must be an array
11
11
  # of host:port pairs. (required)
12
12
  hosts:
13
- - localhost:27017
13
+ - 127.0.0.1:27017
14
14
  options:
15
15
  # Change the default write concern. (default = { w: 1 })
16
16
  # write:
@@ -129,7 +129,7 @@ test:
129
129
  default:
130
130
  database: locomotive_engine_test
131
131
  hosts:
132
- - localhost:27017
132
+ - 127.0.0.1:27017
133
133
  options:
134
134
  truncate_logs: false
135
135
  max_pool_size: 1
@@ -3,96 +3,176 @@ require 'spec_helper'
3
3
  describe Locomotive::Concerns::Site::AccessPoints do
4
4
 
5
5
  let(:domains) { [] }
6
- let(:site) { build(:site, domains: domains) }
6
+ let(:asset_host) { nil }
7
+ let(:site) { build(:site, domains: domains, asset_host: asset_host) }
7
8
 
8
- describe '#domains=' do
9
+ describe 'domains' do
9
10
 
10
- it 'downcases the domains' do
11
- site.domains = ['FIRST.com', 'second.com', 'THIRD.com']
11
+ describe '#domains=' do
12
12
 
13
- expect(site.domains).to eq(['first.com', 'second.com', 'third.com'])
13
+ it 'downcases the domains' do
14
+ site.domains = ['FIRST.com', 'second.com', 'THIRD.com']
15
+
16
+ expect(site.domains).to eq(['first.com', 'second.com', 'third.com'])
17
+ end
14
18
  end
15
- end
16
19
 
17
- describe '#valid?' do
20
+ describe '#valid?' do
18
21
 
19
- subject { site.valid? }
22
+ subject { site.valid? }
20
23
 
21
- it { is_expected.to eq true }
24
+ it { is_expected.to eq true }
22
25
 
23
- describe 'forbidden domains defined' do
26
+ describe 'forbidden domains defined' do
24
27
 
25
- before { allow(Locomotive.config).to receive(:reserved_domains).and_return(['www.locomotiveapp.com', /.+\.acme\.org/]) }
28
+ before { allow(Locomotive.config).to receive(:reserved_domains).and_return(['www.locomotiveapp.com', /.+\.acme\.org/]) }
26
29
 
27
- let(:domains) { ['example.fr', 'acme.org'] }
30
+ let(:domains) { ['example.fr', 'acme.org'] }
28
31
 
29
- it { is_expected.to eq true }
32
+ it { is_expected.to eq true }
33
+
34
+ context 'setting a forbidden domain name' do
30
35
 
31
- context 'setting a forbidden domain name' do
36
+ let(:domains) { ['example.fr', 'www.locomotiveapp.com', 'staging.acme.org'] }
32
37
 
33
- let(:domains) { ['example.fr', 'www.locomotiveapp.com', 'staging.acme.org'] }
38
+ it 'adds errors for each invalid domain' do
39
+ is_expected.to eq false
40
+ expect(site.errors['domains']).to eq(["www.locomotiveapp.com is already taken", "staging.acme.org is already taken"])
41
+ end
34
42
 
35
- it 'adds errors for each invalid domain' do
36
- is_expected.to eq false
37
- expect(site.errors['domains']).to eq(["www.locomotiveapp.com is already taken", "staging.acme.org is already taken"])
38
43
  end
39
44
 
40
45
  end
41
46
 
42
47
  end
43
48
 
44
- end
49
+ describe 'domain sync' do
45
50
 
46
- describe 'domain sync' do
51
+ let!(:listener) { DomainEventListener.new }
52
+ after { listener.shutdown }
47
53
 
48
- let!(:listener) { DomainEventListener.new }
49
- after { listener.shutdown }
54
+ subject { listener }
50
55
 
51
- subject { listener }
56
+ describe 'on saving' do
52
57
 
53
- describe 'on saving' do
58
+ before { site.save }
54
59
 
55
- before { site.save }
60
+ it 'does not emit an event' do
61
+ expect(subject.size).to eq 0
62
+ end
56
63
 
57
- it 'does not emit an event' do
58
- expect(subject.size).to eq 0
59
- end
64
+ context 'new site' do
60
65
 
61
- context 'new site' do
66
+ let(:domains) { ['www.example.com', 'example.com'] }
62
67
 
63
- let(:domains) { ['www.example.com', 'example.com'] }
68
+ it 'only tracks new domains' do
69
+ expect(subject.added).to eq(['www.example.com', 'example.com'])
70
+ expect(subject.removed).to eq([])
71
+ end
72
+
73
+ end
74
+
75
+ context 'existing site' do
76
+
77
+ let(:domains) { ['www.boring.org', 'www.awesome.io'] }
78
+
79
+ before { listener.clear; site.domains = ['www.acme.com', 'www.awesome.io']; site.save; site.reload }
80
+
81
+ it 'tracks new domains and removed ones' do
82
+ expect(subject.added).to eq(['www.acme.com'])
83
+ expect(subject.removed).to eq(['www.boring.org'])
84
+ end
64
85
 
65
- it 'only tracks new domains' do
66
- expect(subject.added).to eq(['www.example.com', 'example.com'])
67
- expect(subject.removed).to eq([])
68
86
  end
69
87
 
70
88
  end
71
89
 
72
- context 'existing site' do
90
+ describe 'on destroying' do
73
91
 
74
- let(:domains) { ['www.boring.org', 'www.awesome.io'] }
92
+ let(:domains) { ['www.example.com', 'example.com'] }
75
93
 
76
- before { listener.clear; site.domains = ['www.acme.com', 'www.awesome.io']; site.save; site.reload }
94
+ before { site.save; listener.clear; site.destroy }
77
95
 
78
- it 'tracks new domains and removed ones' do
79
- expect(subject.added).to eq(['www.acme.com'])
80
- expect(subject.removed).to eq(['www.boring.org'])
96
+ it 'tracks removed domains' do
97
+ expect(subject.added).to eq([])
98
+ expect(subject.removed).to eq(['www.example.com', 'example.com'])
81
99
  end
82
100
 
83
101
  end
84
102
 
85
103
  end
104
+ end
105
+
106
+ describe 'asset_host' do
107
+
108
+ describe '#asset_host=' do
109
+ it 'downcases the asset host' do
110
+ site.asset_host = 'ASSET.DEV'
111
+
112
+ expect(site.asset_host).to eq('asset.dev')
113
+ end
114
+ end
115
+
116
+ describe '#valid?' do
117
+
118
+ subject { site.valid? }
119
+
120
+ it { is_expected.to eq true }
86
121
 
87
- describe 'on destroying' do
122
+ describe 'valid hostname defined' do
88
123
 
89
- let(:domains) { ['www.example.com', 'example.com'] }
124
+ let(:asset_host) { 'asset.dev' }
90
125
 
91
- before { site.save; listener.clear; site.destroy }
126
+ it { is_expected.to eq true }
127
+
128
+ end
129
+
130
+ describe 'valid urls defined' do
131
+
132
+ let(:asset_host) { 'https://asset.dev' }
133
+
134
+ it { is_expected.to eq true }
135
+
136
+ let(:asset_host) { 'https://asset.dev/' }
137
+
138
+ it { is_expected.to eq true }
139
+
140
+ end
141
+
142
+ describe 'invalid hostname or url defined' do
143
+
144
+ let(:asset_host) { 'asset.d' }
145
+
146
+ it { is_expected.to eq false }
147
+
148
+ let(:asset_host) { 'https://asset.d-' }
149
+
150
+ it { is_expected.to eq false }
151
+
152
+ context 'setting an invalid hostname' do
153
+
154
+ let(:asset_host) { 'asset.d' }
155
+
156
+ it 'adds error to asset_host field' do
157
+ is_expected.to eq false
158
+
159
+ expect(site.errors['asset_host']).to eq(['asset.d is invalid'])
160
+ end
161
+
162
+ end
163
+
164
+ context 'setting an invalid url' do
165
+
166
+ let(:asset_host) { 'http://asset.d-' }
167
+
168
+ it 'adds error to asset_host field' do
169
+ is_expected.to eq false
170
+
171
+ expect(site.errors['asset_host']).to eq(['http://asset.d- is invalid'])
172
+ end
173
+
174
+ end
92
175
 
93
- it 'tracks removed domains' do
94
- expect(subject.added).to eq([])
95
- expect(subject.removed).to eq(['www.example.com', 'example.com'])
96
176
  end
97
177
 
98
178
  end
@@ -126,4 +206,4 @@ describe Locomotive::Concerns::Site::AccessPoints do
126
206
  end
127
207
  end
128
208
 
129
- end
209
+ end
@@ -37,6 +37,42 @@ describe Locomotive::Site do
37
37
 
38
38
  end
39
39
 
40
+ describe 'asset_host' do
41
+
42
+ let(:asset_host) { nil }
43
+ subject { FactoryGirl.build(:site, asset_host: asset_host) }
44
+
45
+ it { is_expected.to be_valid }
46
+
47
+ context 'good format without protocol' do
48
+
49
+ let(:asset_host) { 'asset.dev' }
50
+
51
+ it { is_expected.to be_valid}
52
+
53
+ end
54
+
55
+ context 'good format with protocol' do
56
+
57
+ let(:asset_host) { 'https://asset.dev' }
58
+
59
+ it { is_expected.to be_valid}
60
+
61
+ end
62
+
63
+ context 'bad format' do
64
+
65
+ let(:asset_host) { 'http://asset.d' }
66
+
67
+ it { is_expected.to_not be_valid }
68
+
69
+ it 'tells if asset_host is invalid' do
70
+ subject.valid?
71
+ expect(subject.errors[:asset_host]).to eq(['http://asset.d is invalid'])
72
+ end
73
+ end
74
+ end
75
+
40
76
  describe 'handle' do
41
77
 
42
78
  it 'validates presence of handle' do
@@ -40,7 +40,7 @@ describe Locomotive::Steam::Middlewares::Cache do
40
40
 
41
41
  subject { middleware.send(:cache_key, steam_env) }
42
42
 
43
- it { expect(subject).to eq 'e86d1e803b59f9eeeca84cce457808e3' }
43
+ it { expect(subject).to eq '391a69da7791de5c9d1d48087e0677c4' }
44
44
 
45
45
  end
46
46
 
@@ -3,10 +3,11 @@ require 'spec_helper'
3
3
  describe Locomotive::Steam::Middlewares::WysihtmlCss do
4
4
 
5
5
  let(:url) { 'http://example.com/' }
6
+ let(:path) { 'index' }
6
7
  let(:html) { 'Hello world' }
7
8
  let(:page) { nil }
8
9
  let(:app) { ->(env) { [200, env, [html]] } }
9
- let(:env) { env_for(url).tap { |e| e['steam.page'] = page } }
10
+ let(:env) { env_for(url).tap { |e| e['steam.page'] = page; e['steam.path'] = path } }
10
11
  let(:middleware) { described_class.new(app) }
11
12
 
12
13
  subject { middleware.call(env).last.first }
@@ -35,6 +36,14 @@ describe Locomotive::Steam::Middlewares::WysihtmlCss do
35
36
 
36
37
  it { is_expected.to match(%r(<html><head><link rel="stylesheet" type="text/css" href="/assets/locomotive/wysihtml5_editor-[^.]+.css"></head><body></body></html>)) }
37
38
 
39
+ context 'Google AMP page' do
40
+
41
+ let(:path) { '_amp/simple' }
42
+
43
+ it { is_expected.to eq('<html><head></head><body></body></html>') }
44
+
45
+ end
46
+
38
47
  end
39
48
 
40
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: locomotivecms
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0.rc3
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Didier Lafforgue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-02 00:00:00.000000000 Z
11
+ date: 2018-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 5.2.0
103
+ version: 5.2.1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 5.2.0
110
+ version: 5.2.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: mongoid-tree
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 1.3.0.rc2
159
+ version: 1.3.0
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 1.3.0.rc2
166
+ version: 1.3.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: slim
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -193,19 +193,33 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: 3.4.0
195
195
  - !ruby/object:Gem::Dependency
196
- name: kaminari
196
+ name: kaminari-actionview
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: 0.17.0
201
+ version: 1.1.1
202
202
  type: :runtime
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: 0.17.0
208
+ version: 1.1.1
209
+ - !ruby/object:Gem::Dependency
210
+ name: kaminari-mongoid
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 1.0.1
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 1.0.1
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: bootstrap-kaminari-views
211
225
  requirement: !ruby/object:Gem::Requirement
@@ -1380,9 +1394,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
1380
1394
  version: '0'
1381
1395
  required_rubygems_version: !ruby/object:Gem::Requirement
1382
1396
  requirements:
1383
- - - ">"
1397
+ - - ">="
1384
1398
  - !ruby/object:Gem::Version
1385
- version: 1.3.1
1399
+ version: '0'
1386
1400
  requirements: []
1387
1401
  rubyforge_project:
1388
1402
  rubygems_version: 2.5.2
@@ -1390,108 +1404,108 @@ signing_key:
1390
1404
  specification_version: 4
1391
1405
  summary: A platform to create, publish and edit sites
1392
1406
  test_files:
1393
- - spec/fixtures/assets/5k.png
1394
- - spec/fixtures/assets/5k@2x.png
1395
- - spec/fixtures/assets/5k_2.png
1396
- - spec/fixtures/assets/application.js
1397
- - spec/fixtures/assets/magic_mime_type.js
1398
- - spec/fixtures/assets/main.css
1399
- - spec/fixtures/assets/ruby_logo.svg
1400
- - spec/fixtures/assets/specs.pdf
1401
- - spec/fixtures/assets/wrong.txt
1407
+ - spec/fixtures/images/rails_2.png
1402
1408
  - spec/fixtures/images/logo1.jpg
1403
1409
  - spec/fixtures/images/logo2.jpg
1404
1410
  - spec/fixtures/images/rails.png
1405
- - spec/fixtures/images/rails_2.png
1406
- - spec/lib/action_view_spec.rb
1407
- - spec/lib/core_ext_spec.rb
1408
- - spec/lib/locomotive/configuration_spec.rb
1409
- - spec/lib/locomotive/steam/services/api_content_entry_service_spec.rb
1411
+ - spec/fixtures/assets/specs.pdf
1412
+ - spec/fixtures/assets/5k@2x.png
1413
+ - spec/fixtures/assets/ruby_logo.svg
1414
+ - spec/fixtures/assets/5k.png
1415
+ - spec/fixtures/assets/wrong.txt
1416
+ - spec/fixtures/assets/magic_mime_type.js
1417
+ - spec/fixtures/assets/5k_2.png
1418
+ - spec/fixtures/assets/main.css
1419
+ - spec/fixtures/assets/application.js
1410
1420
  - spec/lib/locomotive/steam/services/api_entry_submission_service_spec.rb
1411
1421
  - spec/lib/locomotive/steam/services/async_email_service_spec.rb
1422
+ - spec/lib/locomotive/steam/services/api_content_entry_service_spec.rb
1412
1423
  - spec/lib/locomotive/steam/services/liquid_parser_with_cache_service_spec.rb
1424
+ - spec/lib/locomotive/configuration_spec.rb
1425
+ - spec/lib/core_ext_spec.rb
1426
+ - spec/lib/action_view_spec.rb
1413
1427
  - spec/mailers/locomotive/notifications_spec.rb
1428
+ - spec/models/locomotive/content_type_spec.rb
1429
+ - spec/models/locomotive/theme_asset_spec.rb
1430
+ - spec/models/locomotive/membership_spec.rb
1414
1431
  - spec/models/locomotive/account_spec.rb
1415
- - spec/models/locomotive/concerns/content_entry/counter_spec.rb
1416
- - spec/models/locomotive/concerns/content_entry/csv_spec.rb
1417
- - spec/models/locomotive/concerns/content_entry/file_size_spec.rb
1418
- - spec/models/locomotive/concerns/content_type/entry_template_spec.rb
1419
- - spec/models/locomotive/concerns/page/editable_elements_spec.rb
1420
- - spec/models/locomotive/concerns/page/layout_spec.rb
1421
- - spec/models/locomotive/concerns/page/redirect_spec.rb
1422
- - spec/models/locomotive/concerns/page/render_spec.rb
1423
- - spec/models/locomotive/concerns/site/access_points_spec.rb
1424
- - spec/models/locomotive/concerns/site/cache_spec.rb
1425
- - spec/models/locomotive/concerns/site/locales_spec.rb
1426
- - spec/models/locomotive/concerns/site/metafields_spec.rb
1427
- - spec/models/locomotive/concerns/site/url_redirections_spec.rb
1428
1432
  - spec/models/locomotive/content_asset_spec.rb
1429
- - spec/models/locomotive/content_entry_spec.rb
1430
- - spec/models/locomotive/content_type_spec.rb
1431
1433
  - spec/models/locomotive/editable_element_spec.rb
1432
- - spec/models/locomotive/membership_spec.rb
1433
- - spec/models/locomotive/page_spec.rb
1434
+ - spec/models/locomotive/translation_spec.rb
1434
1435
  - spec/models/locomotive/site_spec.rb
1436
+ - spec/models/locomotive/content_entry_spec.rb
1437
+ - spec/models/locomotive/page_spec.rb
1435
1438
  - spec/models/locomotive/snippet_spec.rb
1436
- - spec/models/locomotive/theme_asset_spec.rb
1437
- - spec/models/locomotive/translation_spec.rb
1438
- - spec/requests/locomotive/image_thumbnail_spec.rb
1439
- - spec/requests/locomotive/site_spec.rb
1439
+ - spec/models/locomotive/concerns/page/render_spec.rb
1440
+ - spec/models/locomotive/concerns/page/layout_spec.rb
1441
+ - spec/models/locomotive/concerns/page/redirect_spec.rb
1442
+ - spec/models/locomotive/concerns/page/editable_elements_spec.rb
1443
+ - spec/models/locomotive/concerns/content_type/entry_template_spec.rb
1444
+ - spec/models/locomotive/concerns/site/url_redirections_spec.rb
1445
+ - spec/models/locomotive/concerns/site/locales_spec.rb
1446
+ - spec/models/locomotive/concerns/site/metafields_spec.rb
1447
+ - spec/models/locomotive/concerns/site/access_points_spec.rb
1448
+ - spec/models/locomotive/concerns/site/cache_spec.rb
1449
+ - spec/models/locomotive/concerns/content_entry/csv_spec.rb
1450
+ - spec/models/locomotive/concerns/content_entry/counter_spec.rb
1451
+ - spec/models/locomotive/concerns/content_entry/file_size_spec.rb
1440
1452
  - spec/requests/locomotive/steam/cache_spec.rb
1441
1453
  - spec/requests/locomotive/steam/wysihtml_css_spec.rb
1454
+ - spec/requests/locomotive/site_spec.rb
1455
+ - spec/requests/locomotive/image_thumbnail_spec.rb
1442
1456
  - spec/support/capybara.rb
1443
1457
  - spec/support/carrierwave.rb
1444
- - spec/support/database_cleaner.rb
1445
- - spec/support/entity.rb
1446
- - spec/support/factories.rb
1458
+ - spec/support/matchers.rb
1447
1459
  - spec/support/features/session_helpers.rb
1448
1460
  - spec/support/features/site_helpers.rb
1449
- - spec/support/locomotive.rb
1450
- - spec/support/matchers.rb
1461
+ - spec/support/entity.rb
1451
1462
  - spec/support/middlewares.rb
1452
- - spec/support/mongoid.rb
1463
+ - spec/support/shared_contexts/api_header_setup.rb
1464
+ - spec/support/shared_contexts/api_site_setup.rb
1453
1465
  - spec/support/pundit_matcher.rb
1454
1466
  - spec/support/response.rb
1467
+ - spec/support/mongoid.rb
1468
+ - spec/support/locomotive.rb
1469
+ - spec/support/factories.rb
1470
+ - spec/support/database_cleaner.rb
1455
1471
  - spec/support/sequences.rb
1456
- - spec/support/shared_contexts/api_header_setup.rb
1457
- - spec/support/shared_contexts/api_site_setup.rb
1458
1472
  - spec/support/shared_examples/site_scope_examples.rb
1459
1473
  - spec/dummy/Rakefile
1460
1474
  - spec/dummy/config.ru
1461
- - spec/dummy/app/assets/javascripts/application.js
1462
- - spec/dummy/app/assets/javascripts/locomotive_misc.js.coffee
1463
- - spec/dummy/app/assets/stylesheets/application.css
1464
1475
  - spec/dummy/app/cells/locomotive/main_menu_cell.rb
1476
+ - spec/dummy/app/models/foo.rb
1465
1477
  - spec/dummy/app/controllers/application_controller.rb
1466
1478
  - spec/dummy/app/controllers/foo_controller.rb
1467
- - spec/dummy/app/helpers/application_helper.rb
1468
- - spec/dummy/app/models/foo.rb
1469
- - spec/dummy/app/views/foo/index.html.slim
1470
- - spec/dummy/app/views/layouts/application.html.erb
1471
1479
  - spec/dummy/app/views/locomotive/shared/_main_app_head.html.slim
1472
- - spec/dummy/config/application.rb
1473
- - spec/dummy/config/boot.rb
1474
- - spec/dummy/config/environment.rb
1475
- - spec/dummy/config/environments/development.rb
1480
+ - spec/dummy/app/views/layouts/application.html.erb
1481
+ - spec/dummy/app/views/foo/index.html.slim
1482
+ - spec/dummy/app/assets/javascripts/application.js
1483
+ - spec/dummy/app/assets/javascripts/locomotive_misc.js.coffee
1484
+ - spec/dummy/app/assets/stylesheets/application.css
1485
+ - spec/dummy/app/helpers/application_helper.rb
1486
+ - spec/dummy/config/secrets.yml
1487
+ - spec/dummy/config/routes.rb
1488
+ - spec/dummy/config/mongoid.yml
1489
+ - spec/dummy/config/locales/en.yml
1490
+ - spec/dummy/config/locales/fr.yml
1476
1491
  - spec/dummy/config/environments/production.rb
1477
- - spec/dummy/config/environments/profile.rb
1492
+ - spec/dummy/config/environments/development.rb
1478
1493
  - spec/dummy/config/environments/test.rb
1479
- - spec/dummy/config/initializers/assets.rb
1494
+ - spec/dummy/config/environments/profile.rb
1495
+ - spec/dummy/config/environment.rb
1496
+ - spec/dummy/config/application.rb
1497
+ - spec/dummy/config/boot.rb
1480
1498
  - spec/dummy/config/initializers/carrierwave.rb
1499
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
1500
+ - spec/dummy/config/initializers/session_store.rb
1501
+ - spec/dummy/config/initializers/wrap_parameters.rb
1502
+ - spec/dummy/config/initializers/assets.rb
1481
1503
  - spec/dummy/config/initializers/cookies_serializer.rb
1482
1504
  - spec/dummy/config/initializers/devise.rb
1483
- - spec/dummy/config/initializers/dragonfly.rb
1484
- - spec/dummy/config/initializers/filter_parameter_logging.rb
1485
1505
  - spec/dummy/config/initializers/locomotive.rb
1486
1506
  - spec/dummy/config/initializers/secret_token.rb
1487
- - spec/dummy/config/initializers/session_store.rb
1488
- - spec/dummy/config/initializers/wrap_parameters.rb
1489
- - spec/dummy/config/locales/en.yml
1490
- - spec/dummy/config/locales/fr.yml
1491
- - spec/dummy/config/mongoid.yml
1492
- - spec/dummy/config/routes.rb
1493
- - spec/dummy/config/secrets.yml
1507
+ - spec/dummy/config/initializers/dragonfly.rb
1494
1508
  - spec/dummy/script/rails
1495
- - spec/dummy/public/404.html
1496
1509
  - spec/dummy/public/422.html
1497
1510
  - spec/dummy/public/500.html
1511
+ - spec/dummy/public/404.html