landable 1.7.1.rc1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rbenv-gemsets +1 -0
- data/.travis.yml +20 -2
- data/CHANGELOG.md +8 -1
- data/Gemfile +14 -13
- data/Rakefile +0 -1
- data/app/controllers/landable/api/assets_controller.rb +49 -31
- data/app/controllers/landable/api/pages_controller.rb +64 -42
- data/app/controllers/landable/api/templates_controller.rb +37 -13
- data/app/controllers/landable/api/themes_controller.rb +35 -14
- data/app/models/concerns/landable/librarian.rb +36 -0
- data/app/models/landable/asset.rb +1 -0
- data/app/models/landable/page.rb +9 -0
- data/app/models/landable/page_revision.rb +52 -9
- data/app/models/landable/search_engine.rb +1 -1
- data/app/models/landable/template.rb +10 -0
- data/app/models/landable/template_revision.rb +1 -0
- data/app/models/landable/theme.rb +1 -0
- data/app/responders/landable/api_responder.rb +1 -1
- data/app/serializers/landable/asset_serializer.rb +1 -0
- data/app/serializers/landable/page_revision_serializer.rb +1 -0
- data/app/serializers/landable/page_serializer.rb +4 -13
- data/app/serializers/landable/template_serializer.rb +3 -3
- data/app/serializers/landable/theme_serializer.rb +1 -1
- data/app/services/landable/screenshot_service.rb +32 -0
- data/app/views/templates/preview.liquid +13 -11
- data/config/routes.rb +6 -3
- data/db/migrate/20140501171345_add_deleted_at_to_pages.rb +5 -0
- data/db/migrate/20140501171352_add_deleted_at_to_themes.rb +5 -0
- data/db/migrate/20140501171359_add_deleted_at_to_assets.rb +5 -0
- data/db/migrate/20140501171406_add_deleted_at_to_templates.rb +5 -0
- data/db/migrate/20140515164543_add_screenshot_to_page_revisions.rb +5 -0
- data/db/test/landable.general.sql +9 -0
- data/db/test/landable.page_revisions.sql +5 -3
- data/db/test/landable.templates.sql +29 -2
- data/db/test/landable.themes.sql +5 -2
- data/doc/schema/asset.json +5 -0
- data/doc/schema/page.json +5 -0
- data/doc/schema/page_revision.json +6 -1
- data/doc/schema/template.json +5 -0
- data/doc/schema/template_revision.json +5 -0
- data/doc/schema/theme.json +5 -0
- data/landable.gemspec +31 -33
- data/lib/generators/templates/landable.rb +6 -0
- data/lib/landable/configuration.rb +39 -6
- data/lib/landable/version.rb +3 -3
- data/lib/tasks/landable/pgtap.rake +1 -2
- data/script/pgtap +10 -0
- data/script/redb +0 -2
- data/spec/concerns/landable/librarian.rb +45 -0
- data/spec/controllers/public/preview/pages_controller_spec.rb +1 -1
- data/spec/dummy/db/.keep +0 -0
- data/spec/models/landable/page_revision_spec.rb +60 -2
- data/spec/models/landable/page_spec.rb +3 -1
- data/spec/services/landable/authentication_service_spec.rb +1 -1
- data/spec/services/landable/screenshot_service_spec.rb +43 -0
- data/spec/services/landable/tidy_service_spec.rb +3 -2
- metadata +67 -82
- data/landable-1.7.0.gem +0 -0
- data/spec/dummy/db/structure.sql +0 -3837
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 816bb86d55b2ddcc550fba26aa46b38866f1cc4d
|
4
|
+
data.tar.gz: f995700b848201ee82badbcb96fdc9f2f7c3934d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddbe06e57c7d69674f0861fb99869d76bf562c5148f7c97ee352b1ea73c7c532809aac6e9f87e26fab42f78164633d749820604622287717721ec5b504def4cc
|
7
|
+
data.tar.gz: 88dbec3b8cd76fcdf58f026b9ff748840d6f3c1639e0127b46b456ba15179d88d9bb56780cb5ea41029cdd2c21f2facbd17ab1cba1421ca887d56a1fc28ca4b0
|
data/.gitignore
CHANGED
@@ -2,12 +2,15 @@
|
|
2
2
|
*.swp
|
3
3
|
Gemfile.lock
|
4
4
|
.bundle/
|
5
|
+
db/test/output.txt
|
5
6
|
log/*.log
|
6
7
|
pkg/
|
7
8
|
spec/dummy/db/*.sqlite3
|
8
9
|
spec/dummy/db/*.sqlite3-journal
|
9
10
|
spec/dummy/log/*.log
|
10
11
|
spec/dummy/tmp/
|
12
|
+
spec/dummy/db/structure.sql
|
11
13
|
spec/dummy/.sass-cache
|
12
14
|
coverage/
|
13
15
|
tmp/
|
16
|
+
landable-*.gem
|
data/.rbenv-gemsets
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
landable
|
data/.travis.yml
CHANGED
@@ -1,12 +1,30 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
3
|
+
env:
|
4
|
+
- RAILS_VERSION=4.0.0
|
5
|
+
- RAILS_VERSION=4.0.5
|
6
|
+
- RAILS_VERSION=4.1.0
|
7
|
+
- RAILS_VERSION=4.1.1
|
8
|
+
|
2
9
|
rvm:
|
3
10
|
- 1.9.3-p448
|
4
11
|
- 2.0.0-p247
|
5
12
|
- 2.1.2
|
13
|
+
|
6
14
|
before_script:
|
15
|
+
- sudo apt-get update
|
16
|
+
- sudo apt-get install postgresql-server-dev-9.1 postgresql-contrib-9.1 libtap-parser-sourcehandler-pgtap-perl
|
17
|
+
- git clone https://github.com/theory/pgtap.git /tmp/pgtap
|
18
|
+
- env PG_CONFIG=/etc/postgresql/9.1/main/postgresql.conf && export PERL5LIB=/home/travis/perl5/lib/perl5 && cd /tmp/pgtap && make && sudo make install
|
7
19
|
- psql -c "CREATE USER dummy WITH superuser" -U postgres
|
8
20
|
- psql -c "CREATE DATABASE dummy_test;" -U postgres
|
21
|
+
- psql -d dummy_test -c "CREATE EXTENSION pgtap" -U postgres
|
22
|
+
- sudo sed -e 's/perl \-w/perl -w -X/' -i /usr/bin/pg_prove
|
23
|
+
- cd -
|
9
24
|
script:
|
10
25
|
- script/redb
|
11
|
-
- bundle exec
|
12
|
-
|
26
|
+
- bundle exec rake landable
|
27
|
+
|
28
|
+
notifications:
|
29
|
+
# let enova know about the build
|
30
|
+
slack: enova:xzPNLg3AxkbkUcUlfn7sqHW5
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,14 @@
|
|
2
2
|
|
3
3
|
See README.md before updating this file.
|
4
4
|
|
5
|
-
## Unreleased [#](https://github.com/enova/landable/compare/v1.
|
5
|
+
## Unreleased [#](https://github.com/enova/landable/compare/v1.8.0...master)
|
6
|
+
|
7
|
+
## 1.8.0 [#](https://github.com/enova/landable/compare/v1.7.1.rc1...v1.8.0)
|
8
|
+
* Removing geminabox [#11]
|
9
|
+
* Some fixes to the DB tests [#9]
|
10
|
+
* Rails 4.x support [#8]
|
11
|
+
* Screenshots by revision [#7]
|
12
|
+
* Soft deletes [#6]
|
6
13
|
|
7
14
|
## 1.7.1.rc1 [#](https://github.com/enova/landable/compare/v1.7.0...v1.7.1.rc1)
|
8
15
|
* Allow for revisions for Templates [#3]
|
data/Gemfile
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
gem "cucumber-rails", require: false
|
5
|
-
end
|
6
|
-
|
7
|
-
# Declare your gem's dependencies in landable.gemspec.
|
8
|
-
# Bundler will treat runtime dependencies like base dependencies, and
|
9
|
-
# development dependencies will be added by default to the :development group.
|
3
|
+
# load dependencies from landable.gemspec
|
10
4
|
gemspec
|
11
5
|
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
|
6
|
+
# allow us to load up a specific version of rails, since the gemspec is
|
7
|
+
# concerned only with compatibility (see bin/test)
|
8
|
+
if ENV.key? 'RAILS_VERSION'
|
9
|
+
gem 'rails', ENV['RAILS_VERSION']
|
10
|
+
end
|
16
11
|
|
17
|
-
#
|
18
|
-
#
|
12
|
+
# development/test dependencies, and anything else that doesn't belong or fit
|
13
|
+
# in the gemspec
|
14
|
+
group :test do
|
15
|
+
gem 'minitest'
|
16
|
+
gem 'shoulda-matchers'
|
17
|
+
gem 'cucumber-rails', require: false
|
18
|
+
gem 'test_after_commit'
|
19
|
+
end
|
data/Rakefile
CHANGED
@@ -7,7 +7,6 @@ end
|
|
7
7
|
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
8
8
|
load 'rails/tasks/engine.rake'
|
9
9
|
|
10
|
-
require "bundler_geminabox/gem_tasks"
|
11
10
|
Bundler::GemHelper.install_tasks
|
12
11
|
|
13
12
|
Dir.glob(File.expand_path('../lib/tasks/landable/*.rake', __FILE__)).each { |f| load f }
|
@@ -1,55 +1,73 @@
|
|
1
|
-
require_dependency
|
2
|
-
require_dependency
|
1
|
+
require_dependency 'landable/api_controller'
|
2
|
+
require_dependency 'landable/asset_search_engine'
|
3
3
|
|
4
4
|
module Landable
|
5
5
|
module Api
|
6
6
|
class AssetsController < ApiController
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def show
|
13
|
-
respond_with Asset.find(params[:id])
|
14
|
-
end
|
15
|
-
|
7
|
+
# filters
|
8
|
+
before_filter :load_asset, except: [:create, :index]
|
9
|
+
|
10
|
+
# RESTful methods
|
16
11
|
def create
|
17
|
-
asset = Asset.new
|
12
|
+
asset = Asset.new(asset_params)
|
18
13
|
|
19
14
|
if original = asset.duplicate_of
|
20
15
|
head :moved_permanently, location: asset_url(original)
|
21
16
|
return
|
22
17
|
end
|
23
|
-
|
18
|
+
|
24
19
|
Asset.transaction do
|
25
20
|
asset.author = current_author
|
26
21
|
asset.save!
|
27
22
|
end
|
28
|
-
|
23
|
+
|
29
24
|
respond_with asset, status: :created, location: asset_url(asset)
|
30
25
|
end
|
31
|
-
|
32
|
-
def
|
33
|
-
asset
|
34
|
-
|
35
|
-
asset
|
36
|
-
|
37
|
-
|
26
|
+
|
27
|
+
def destroy
|
28
|
+
@asset.try(:deactivate)
|
29
|
+
|
30
|
+
respond_with @asset
|
31
|
+
end
|
32
|
+
|
33
|
+
def index
|
34
|
+
search = Landable::AssetSearchEngine.new(search_params.merge(ids: params[:ids]))
|
35
|
+
respond_with search.results, meta: search.meta
|
38
36
|
end
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
def reactivate
|
39
|
+
@asset.try(:reactivate)
|
40
|
+
|
41
|
+
respond_with @asset
|
42
|
+
end
|
43
|
+
|
44
|
+
def show
|
45
|
+
respond_with @asset
|
48
46
|
end
|
47
|
+
|
48
|
+
def update
|
49
|
+
@asset.update_attributes!(asset_params)
|
49
50
|
|
50
|
-
|
51
|
-
params.require(:asset).permit(:id, :name, :description, :data, :file)
|
51
|
+
respond_with @asset
|
52
52
|
end
|
53
|
+
|
54
|
+
# custom methods
|
55
|
+
private
|
56
|
+
def asset_params
|
57
|
+
params.require(:asset).permit(:id, :name, :description, :data, :file)
|
58
|
+
end
|
59
|
+
|
60
|
+
def load_asset
|
61
|
+
@asset = Asset.find(params[:id])
|
62
|
+
end
|
63
|
+
|
64
|
+
def search_params
|
65
|
+
@search_params ||=
|
66
|
+
begin
|
67
|
+
hash = params.permit(search: [:name])
|
68
|
+
hash[:search] || {}
|
69
|
+
end
|
70
|
+
end
|
53
71
|
end
|
54
72
|
end
|
55
73
|
end
|
@@ -1,37 +1,57 @@
|
|
1
|
-
require_dependency
|
1
|
+
require_dependency 'landable/api_controller'
|
2
2
|
|
3
3
|
module Landable
|
4
4
|
module Api
|
5
5
|
class PagesController < ApiController
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
# filters
|
7
|
+
before_filter :load_page, except: [:create, :index, :preview]
|
8
|
+
|
9
|
+
# RESTful methods
|
11
10
|
def create
|
12
11
|
page = Page.new page_params
|
13
12
|
page.updated_by_author = current_author
|
14
13
|
page.save!
|
14
|
+
|
15
15
|
respond_with page, status: :created, location: page_url(page)
|
16
16
|
end
|
17
|
+
|
18
|
+
def destroy
|
19
|
+
@page.updated_by_author = current_author
|
20
|
+
@page.try(:deactivate)
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
respond_with @page
|
23
|
+
end
|
24
|
+
|
25
|
+
def index
|
26
|
+
search = Landable::PageSearchEngine.new search_params.merge(ids: params[:ids]), limit: 100
|
27
|
+
|
28
|
+
respond_with search.results, meta: search.meta
|
20
29
|
end
|
21
30
|
|
31
|
+
def reactivate
|
32
|
+
@page.try(:reactivate)
|
33
|
+
|
34
|
+
respond_with @page
|
35
|
+
end
|
36
|
+
|
37
|
+
def show
|
38
|
+
respond_with @page
|
39
|
+
end
|
40
|
+
|
22
41
|
def update
|
23
|
-
page =
|
24
|
-
page.
|
25
|
-
|
26
|
-
respond_with page
|
42
|
+
@page.updated_by_author = current_author
|
43
|
+
@page.update_attributes!(page_params)
|
44
|
+
|
45
|
+
respond_with @page
|
27
46
|
end
|
28
|
-
|
47
|
+
|
48
|
+
# custom methods
|
29
49
|
def publish
|
30
|
-
page
|
31
|
-
|
32
|
-
respond_with page
|
50
|
+
@page.publish! author_id: current_author.id, notes: params[:notes], is_minor: !!params[:is_minor]
|
51
|
+
|
52
|
+
respond_with @page
|
33
53
|
end
|
34
|
-
|
54
|
+
|
35
55
|
def preview
|
36
56
|
page = Page.where(page_id: page_params[:id]).first_or_initialize
|
37
57
|
page.attributes = page_params
|
@@ -46,51 +66,53 @@ module Landable
|
|
46
66
|
content = RenderService.call(page, preview: true)
|
47
67
|
end
|
48
68
|
end
|
49
|
-
|
69
|
+
|
50
70
|
respond_to do |format|
|
51
71
|
format.json do
|
52
72
|
render json: {
|
53
73
|
page: {
|
54
74
|
preview: content,
|
55
|
-
errors: page.errors
|
75
|
+
errors: page.errors
|
56
76
|
}
|
57
77
|
}
|
58
78
|
end
|
59
79
|
end
|
60
80
|
end
|
61
|
-
|
81
|
+
|
62
82
|
def screenshots
|
63
83
|
Landable::ScreenshotService.call Page.find(params[:id])
|
64
84
|
|
65
|
-
#
|
85
|
+
# '{}' is valid json, which jquery will accept as a successful response. '' is not.
|
66
86
|
render json: {}, status: 202
|
67
87
|
end
|
68
|
-
|
88
|
+
|
69
89
|
private
|
90
|
+
def load_page
|
91
|
+
@page = Page.find(params[:id])
|
92
|
+
end
|
93
|
+
|
94
|
+
def search_params
|
95
|
+
@search_params ||=
|
96
|
+
begin
|
97
|
+
hash = params.permit(search: [:path])
|
98
|
+
hash[:search] || {}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def page_params
|
103
|
+
params.require(:page).permit(:id, :path, :theme_id, :category_id, :title, :head_content, :body, :status_code, :redirect_url, :lock_version, :abstract, :hero_asset_name, meta_tags: [:description, :keywords, :robots])
|
104
|
+
end
|
105
|
+
|
106
|
+
def with_format(format, &block)
|
107
|
+
old_formats = formats
|
70
108
|
|
71
|
-
def search_params
|
72
|
-
@search_params ||=
|
73
109
|
begin
|
74
|
-
|
75
|
-
|
110
|
+
self.formats = [format]
|
111
|
+
return block.call
|
112
|
+
ensure
|
113
|
+
self.formats = old_formats
|
76
114
|
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def page_params
|
80
|
-
params.require(:page).permit(:id, :path, :theme_id, :category_id, :title, :head_content, :body, :status_code, :redirect_url, :lock_version, :abstract, :hero_asset_name,
|
81
|
-
meta_tags: [:description, :keywords, :robots])
|
82
|
-
end
|
83
|
-
|
84
|
-
def with_format(format, &block)
|
85
|
-
old_formats = formats
|
86
|
-
|
87
|
-
begin
|
88
|
-
self.formats = [format]
|
89
|
-
return block.call
|
90
|
-
ensure
|
91
|
-
self.formats = old_formats
|
92
115
|
end
|
93
|
-
end
|
94
116
|
end
|
95
117
|
end
|
96
118
|
end
|
@@ -3,37 +3,61 @@ require_dependency "landable/api_controller"
|
|
3
3
|
module Landable
|
4
4
|
module Api
|
5
5
|
class TemplatesController < ApiController
|
6
|
-
|
7
|
-
|
8
|
-
end
|
6
|
+
# filters
|
7
|
+
before_filter :load_template, except: [:create, :index]
|
9
8
|
|
9
|
+
# RESTful methods
|
10
10
|
def create
|
11
11
|
template = Template.new(template_params)
|
12
12
|
template.save!
|
13
|
+
|
13
14
|
respond_with template, status: :created, location: template_url(template)
|
14
15
|
end
|
15
16
|
|
17
|
+
def destroy
|
18
|
+
@template.temp_author = current_author
|
19
|
+
@template.try(:deactivate)
|
20
|
+
|
21
|
+
respond_with @template
|
22
|
+
end
|
23
|
+
|
24
|
+
def index
|
25
|
+
respond_with Template.all
|
26
|
+
end
|
27
|
+
|
16
28
|
def show
|
17
|
-
respond_with
|
29
|
+
respond_with @template
|
18
30
|
end
|
19
31
|
|
20
32
|
def update
|
21
|
-
template
|
22
|
-
|
23
|
-
respond_with template
|
33
|
+
@template.update_attributes!(template_params)
|
34
|
+
|
35
|
+
respond_with @template
|
24
36
|
end
|
25
37
|
|
38
|
+
# custom methods
|
26
39
|
def publish
|
27
|
-
template
|
28
|
-
|
29
|
-
respond_with template
|
40
|
+
@template.publish! author_id: current_author.id, notes: params[:notes], is_minor: !!params[:is_minor]
|
41
|
+
|
42
|
+
respond_with @template
|
43
|
+
end
|
44
|
+
|
45
|
+
def reactivate
|
46
|
+
@template.try(:reactivate)
|
47
|
+
|
48
|
+
respond_with @template
|
30
49
|
end
|
31
50
|
|
32
51
|
private
|
52
|
+
def load_template
|
53
|
+
@template = Template.find(params[:id])
|
54
|
+
end
|
33
55
|
|
34
|
-
|
35
|
-
|
36
|
-
|
56
|
+
def template_params
|
57
|
+
params.require(:template).permit(:id, :name, :body, :description, :thumbnail_url, :slug, :is_layout, :is_publishable)
|
58
|
+
end
|
59
|
+
|
60
|
+
# end
|
37
61
|
end
|
38
62
|
end
|
39
63
|
end
|