locomotivecms 3.3.0.rc3 → 3.3.0

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