landable 1.7.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 +7 -0
- data/.gitignore +13 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +15 -0
- data/MIT-LICENSE +20 -0
- data/README.md +56 -0
- data/Rakefile +22 -0
- data/app/controllers/concerns/landable/variables_concern.rb +38 -0
- data/app/controllers/landable/api/access_tokens_controller.rb +48 -0
- data/app/controllers/landable/api/assets_controller.rb +55 -0
- data/app/controllers/landable/api/categories_controller.rb +13 -0
- data/app/controllers/landable/api/directories_controller.rb +19 -0
- data/app/controllers/landable/api/page_revisions_controller.rb +38 -0
- data/app/controllers/landable/api/pages_controller.rb +96 -0
- data/app/controllers/landable/api/templates_controller.rb +33 -0
- data/app/controllers/landable/api/themes_controller.rb +57 -0
- data/app/controllers/landable/api_controller.rb +75 -0
- data/app/controllers/landable/application_controller.rb +4 -0
- data/app/controllers/landable/public/pages_controller.rb +25 -0
- data/app/controllers/landable/public/preview/page_revisions_controller.rb +16 -0
- data/app/controllers/landable/public/preview/pages_controller.rb +16 -0
- data/app/controllers/landable/public/sitemap_controller.rb +18 -0
- data/app/decorators/landable/null_page_decorator.rb +26 -0
- data/app/decorators/landable/page_decorator.rb +40 -0
- data/app/helpers/landable/application_helper.rb +13 -0
- data/app/helpers/landable/pages_helper.rb +20 -0
- data/app/models/concerns/landable/has_assets.rb +74 -0
- data/app/models/concerns/landable/table_name.rb +12 -0
- data/app/models/concerns/landable/traffic/table_name.rb +14 -0
- data/app/models/landable/access_token.rb +20 -0
- data/app/models/landable/asset.rb +63 -0
- data/app/models/landable/asset_search_engine.rb +20 -0
- data/app/models/landable/author.rb +12 -0
- data/app/models/landable/category.rb +27 -0
- data/app/models/landable/directory.rb +23 -0
- data/app/models/landable/page.rb +259 -0
- data/app/models/landable/page_revision.rb +74 -0
- data/app/models/landable/page_search_engine.rb +20 -0
- data/app/models/landable/search_engine.rb +39 -0
- data/app/models/landable/template.rb +24 -0
- data/app/models/landable/theme.rb +20 -0
- data/app/models/landable/traffic/access.rb +11 -0
- data/app/models/landable/traffic/ad_group.rb +11 -0
- data/app/models/landable/traffic/ad_type.rb +11 -0
- data/app/models/landable/traffic/attribution.rb +38 -0
- data/app/models/landable/traffic/bid_match_type.rb +11 -0
- data/app/models/landable/traffic/browser.rb +11 -0
- data/app/models/landable/traffic/campaign.rb +11 -0
- data/app/models/landable/traffic/city.rb +11 -0
- data/app/models/landable/traffic/content.rb +11 -0
- data/app/models/landable/traffic/cookie.rb +16 -0
- data/app/models/landable/traffic/country.rb +11 -0
- data/app/models/landable/traffic/creative.rb +11 -0
- data/app/models/landable/traffic/device.rb +11 -0
- data/app/models/landable/traffic/device_type.rb +11 -0
- data/app/models/landable/traffic/domain.rb +12 -0
- data/app/models/landable/traffic/event.rb +12 -0
- data/app/models/landable/traffic/event_type.rb +11 -0
- data/app/models/landable/traffic/experiment.rb +11 -0
- data/app/models/landable/traffic/http_method.rb +11 -0
- data/app/models/landable/traffic/ip_address.rb +11 -0
- data/app/models/landable/traffic/ip_lookup.rb +12 -0
- data/app/models/landable/traffic/keyword.rb +11 -0
- data/app/models/landable/traffic/location.rb +11 -0
- data/app/models/landable/traffic/match_type.rb +11 -0
- data/app/models/landable/traffic/medium.rb +11 -0
- data/app/models/landable/traffic/mime_type.rb +11 -0
- data/app/models/landable/traffic/network.rb +11 -0
- data/app/models/landable/traffic/owner.rb +10 -0
- data/app/models/landable/traffic/ownership.rb +10 -0
- data/app/models/landable/traffic/page_view.rb +24 -0
- data/app/models/landable/traffic/path.rb +13 -0
- data/app/models/landable/traffic/placement.rb +11 -0
- data/app/models/landable/traffic/platform.rb +11 -0
- data/app/models/landable/traffic/position.rb +11 -0
- data/app/models/landable/traffic/query_string.rb +12 -0
- data/app/models/landable/traffic/referer.rb +11 -0
- data/app/models/landable/traffic/region.rb +11 -0
- data/app/models/landable/traffic/search_term.rb +11 -0
- data/app/models/landable/traffic/source.rb +11 -0
- data/app/models/landable/traffic/target.rb +11 -0
- data/app/models/landable/traffic/user_agent.rb +28 -0
- data/app/models/landable/traffic/user_agent_type.rb +11 -0
- data/app/models/landable/traffic/visit.rb +15 -0
- data/app/models/landable/traffic/visitor.rb +13 -0
- data/app/responders/landable/api_responder.rb +76 -0
- data/app/responders/landable/page_render_responder.rb +15 -0
- data/app/serializers/landable/access_token_serializer.rb +6 -0
- data/app/serializers/landable/asset_serializer.rb +14 -0
- data/app/serializers/landable/author_serializer.rb +5 -0
- data/app/serializers/landable/category_serializer.rb +5 -0
- data/app/serializers/landable/directory_serializer.rb +8 -0
- data/app/serializers/landable/page_revision_serializer.rb +15 -0
- data/app/serializers/landable/page_serializer.rb +31 -0
- data/app/serializers/landable/template_serializer.rb +5 -0
- data/app/serializers/landable/theme_serializer.rb +7 -0
- data/app/services/landable/authentication_service.rb +44 -0
- data/app/services/landable/registration_service.rb +13 -0
- data/app/services/landable/render_service.rb +86 -0
- data/app/services/landable/tidy_service.rb +155 -0
- data/app/uploaders/landable/asset_uploader.rb +9 -0
- data/app/validators/path_validator.rb +12 -0
- data/app/validators/url_validator.rb +13 -0
- data/app/views/templates/preview.liquid +122 -0
- data/bin/rails +8 -0
- data/bin/redb +7 -0
- data/config.ru +7 -0
- data/config/cucumber.yml +5 -0
- data/config/routes.rb +62 -0
- data/db/migrate/20130510221424_create_landable_schema.rb +338 -0
- data/db/migrate/20130909182713_landable_pages__add_updated_by.rb +11 -0
- data/db/migrate/20130909182715_landable_page_revisions__break_out_snapshot.rb +72 -0
- data/db/migrate/20130909191153_landable_pages__add_lock_version.rb +5 -0
- data/db/migrate/20131002220041_file_based_themes.rb +12 -0
- data/db/migrate/20131008164204_create_head_tag_on_page.rb +19 -0
- data/db/migrate/20131008193544_drop_status_codes_model.rb +44 -0
- data/db/migrate/20131028145652_add_traffic_schema.rb +276 -0
- data/db/migrate/20131101213623_add_dnt_column_to_visits.rb +7 -0
- data/db/migrate/20131104224120_add_meta_on_events.rb +7 -0
- data/db/migrate/20131106185946_add_index_on_page_revisions_path.rb +6 -0
- data/db/migrate/20131106193021_page_revisisons__path_status_code_index.rb +9 -0
- data/db/migrate/20131108212501_traffic_owner_ids_are_serials.rb +20 -0
- data/db/migrate/20131121150902_add_attribution_id_to_unique_index.rb +10 -0
- data/db/migrate/20131216214027_drop_browser_screenshot_tables.rb +6 -0
- data/db/migrate/20140128170659_file_backed_templates.rb +8 -0
- data/db/migrate/20140205193757_fix_status_codes.rb +24 -0
- data/db/migrate/20140206211322_add_response_time_to_traffic_page_views.rb +7 -0
- data/db/migrate/20140220170324_add_slug_to_categories.rb +14 -0
- data/db/migrate/20140220174630_add_abstract_and_hero_asset_to_pages_and_page_revisions.rb +8 -0
- data/db/migrate/20140224205516_rename_traffic_schema.rb +40 -0
- data/db/pgtap/pgtap.sql +9034 -0
- data/db/test/landable.access_tokens.sql +13 -0
- data/db/test/landable.assets.sql +16 -0
- data/db/test/landable.authors.sql +22 -0
- data/db/test/landable.categories.sql +9 -0
- data/db/test/landable.page_revisions.sql +41 -0
- data/db/test/landable.pages.sql +19 -0
- data/db/test/landable.templates.sql +15 -0
- data/db/test/landable.themes.sql +25 -0
- data/doc/schema/access_token.json +22 -0
- data/doc/schema/asset.json +65 -0
- data/doc/schema/author.json +30 -0
- data/doc/schema/directory.json +24 -0
- data/doc/schema/page.json +95 -0
- data/doc/schema/page_revision.json +70 -0
- data/doc/schema/theme.json +37 -0
- data/doc/schema/uuid.json +6 -0
- data/features/api/access_tokens.feature +84 -0
- data/features/api/assets.feature +46 -0
- data/features/api/cors.feature +25 -0
- data/features/api/pages.feature +42 -0
- data/features/api/preview.feature +16 -0
- data/features/api/templates.feature +33 -0
- data/features/api/themes.feature +33 -0
- data/features/liquid/body.feature +35 -0
- data/features/liquid/drops/categories.feature +54 -0
- data/features/liquid/tags.feature +168 -0
- data/features/public/content_types.feature +17 -0
- data/features/public/publishing.feature +45 -0
- data/features/public/status_codes.feature +25 -0
- data/features/public/views.feature +17 -0
- data/features/step_definitions/asset_steps.rb +60 -0
- data/features/step_definitions/core_api_steps.rb +139 -0
- data/features/step_definitions/debug_steps.rb +3 -0
- data/features/step_definitions/factory_steps.rb +124 -0
- data/features/step_definitions/html_steps.rb +9 -0
- data/features/step_definitions/liquid_steps.rb +79 -0
- data/features/step_definitions/revision_steps.rb +5 -0
- data/features/step_definitions/theme_steps.rb +43 -0
- data/features/support/env.rb +66 -0
- data/features/support/usefulness.rb +13 -0
- data/landable.gemspec +54 -0
- data/lib/generators/landable/collection/collection_generator.rb +0 -0
- data/lib/generators/landable/collection/templates/stylesheets/landable/%file_name%.less +0 -0
- data/lib/generators/landable/collection/templates/stylesheets/landable/%file_name%/mixins.less +0 -0
- data/lib/generators/landable/collection/templates/stylesheets/landable/%file_name%/variables.less +0 -0
- data/lib/generators/landable/component/component_generator.rb +0 -0
- data/lib/generators/landable/component/templates/javascripts/landable/%file_name%.less +0 -0
- data/lib/generators/landable/component/templates/stylesheets/landable/%file_name%.less +0 -0
- data/lib/generators/landable/install_generator.rb +19 -0
- data/lib/generators/landable/landable_generator.rb +22 -0
- data/lib/generators/templates/landable.rb +34 -0
- data/lib/landable.rb +30 -0
- data/lib/landable/configuration.rb +115 -0
- data/lib/landable/core_ext/ipaddr.rb +18 -0
- data/lib/landable/engine.rb +69 -0
- data/lib/landable/error.rb +16 -0
- data/lib/landable/inflections.rb +4 -0
- data/lib/landable/layout.rb +60 -0
- data/lib/landable/liquid.rb +27 -0
- data/lib/landable/liquid/asset_tags.rb +76 -0
- data/lib/landable/liquid/drops.rb +46 -0
- data/lib/landable/liquid/filters.rb +11 -0
- data/lib/landable/liquid/tags.rb +91 -0
- data/lib/landable/migration.rb +40 -0
- data/lib/landable/mime_types.rb +15 -0
- data/lib/landable/partial.rb +46 -0
- data/lib/landable/seeds.rb +36 -0
- data/lib/landable/traffic.rb +34 -0
- data/lib/landable/traffic/crawl_tracker.rb +9 -0
- data/lib/landable/traffic/noop_tracker.rb +8 -0
- data/lib/landable/traffic/ping_tracker.rb +9 -0
- data/lib/landable/traffic/scan_tracker.rb +9 -0
- data/lib/landable/traffic/scrape_tracker.rb +9 -0
- data/lib/landable/traffic/tracker.rb +283 -0
- data/lib/landable/traffic/user_tracker.rb +65 -0
- data/lib/landable/version.rb +10 -0
- data/lib/tasks/landable/cucumber.rake +67 -0
- data/lib/tasks/landable/data.rake +166 -0
- data/lib/tasks/landable/pgtap.rake +26 -0
- data/lib/tasks/landable/rdoc.rake +11 -0
- data/lib/tasks/landable/seed.rake +16 -0
- data/lib/tasks/landable/spec.rake +15 -0
- data/script/cucumber +10 -0
- data/spec/concerns/landable/has_assets_spec.rb +75 -0
- data/spec/concerns/landable/table_name_spec.rb +15 -0
- data/spec/concerns/landable/traffic/table_name_spec.rb +16 -0
- data/spec/controllers/concerns/landable/variables_concern_spec.rb +66 -0
- data/spec/controllers/landable/api/assets_controller_spec.rb +24 -0
- data/spec/controllers/landable/api/categories_controller_spec.rb +45 -0
- data/spec/controllers/landable/api/directories_controller_spec.rb +56 -0
- data/spec/controllers/landable/api/page_revisions_controller_spec.rb +29 -0
- data/spec/controllers/landable/api/pages_controller_spec.rb +271 -0
- data/spec/controllers/landable/api_controller_spec.rb +189 -0
- data/spec/controllers/public/preview/page_revisions_controller_spec.rb +41 -0
- data/spec/controllers/public/preview/pages_controller_spec.rb +36 -0
- data/spec/controllers/public/sitemap_controller_spec.rb +25 -0
- data/spec/decorators/page_decorator_spec.rb +90 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/foo.jpg +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +10 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/priority_controller.rb +7 -0
- data/spec/dummy/app/helpers/application_helper.rb +5 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/priority.html.erb +18 -0
- data/spec/dummy/app/views/partials/_foobazz.html +1 -0
- data/spec/dummy/app/views/priority/show.html.erb +11 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +21 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +60 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/landable.rb +22 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/structure.sql +3736 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/asset.rb +29 -0
- data/spec/factories/authors.rb +12 -0
- data/spec/factories/category.rb +6 -0
- data/spec/factories/page_revision.rb +6 -0
- data/spec/factories/pages.rb +33 -0
- data/spec/factories/template.rb +13 -0
- data/spec/factories/theme.rb +14 -0
- data/spec/fixtures/assets/cthulhu.jpg +0 -0
- data/spec/fixtures/assets/panda.png +0 -0
- data/spec/fixtures/assets/sloth.png +0 -0
- data/spec/fixtures/assets/small.pdf +0 -0
- data/spec/helpers/pages_helper_spec.rb +35 -0
- data/spec/lib/landable/configuration_spec.rb +20 -0
- data/spec/lib/landable/layout_spec.rb +25 -0
- data/spec/lib/landable/liquid_spec.rb +24 -0
- data/spec/lib/landable/migration_spec.rb +51 -0
- data/spec/lib/landable/partial_spec.rb +84 -0
- data/spec/lib/landable/tracking_spec.rb +62 -0
- data/spec/lib/landable/traffic_spec.rb +45 -0
- data/spec/models/landable/access_token_spec.rb +13 -0
- data/spec/models/landable/asset_spec.rb +48 -0
- data/spec/models/landable/directory_spec.rb +36 -0
- data/spec/models/landable/page/errors_spec.rb +30 -0
- data/spec/models/landable/page_revision_spec.rb +75 -0
- data/spec/models/landable/page_spec.rb +377 -0
- data/spec/models/landable/template_spec.rb +47 -0
- data/spec/models/landable/theme_spec.rb +8 -0
- data/spec/responders/page_render_responder_spec.rb +43 -0
- data/spec/routing/public_page_route_spec.rb +36 -0
- data/spec/services/landable/authentication_service_spec.rb +61 -0
- data/spec/services/landable/render_service_spec.rb +103 -0
- data/spec/services/landable/tidy_service_spec.rb +157 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/behaviors.rb +107 -0
- data/spec/support/carrier_wave.rb +17 -0
- data/spec/support/categories.yml +2 -0
- data/spec/support/helpers.rb +22 -0
- metadata +795 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(4);
|
|
4
|
+
|
|
5
|
+
SELECT col_is_pk('dummy_landable', 'access_tokens', 'access_token_id', 'access tokens have PK');
|
|
6
|
+
SELECT col_is_fk('dummy_landable', 'access_tokens', 'author_id', 'author_id is FK');
|
|
7
|
+
|
|
8
|
+
SELECT col_not_null('dummy_landable', 'access_tokens', 'author_id', 'author_id not null');
|
|
9
|
+
SELECT col_not_null('dummy_landable', 'access_tokens', 'expires_at', 'expires_at not null');
|
|
10
|
+
|
|
11
|
+
SELECT * FROM finish();
|
|
12
|
+
|
|
13
|
+
ROLLBACK;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(7);
|
|
4
|
+
|
|
5
|
+
SELECT col_is_pk('dummy_landable', 'assets', 'asset_id', 'Asset_id is pk');
|
|
6
|
+
SELECT col_is_fk('dummy_landable', 'assets', 'author_id', 'author_id is fk');
|
|
7
|
+
|
|
8
|
+
SELECT col_not_null('dummy_landable', 'assets', 'author_id', 'author_id not null');
|
|
9
|
+
SELECT col_not_null('dummy_landable', 'assets', 'name', 'name not null');
|
|
10
|
+
SELECT col_not_null('dummy_landable', 'assets', 'data', 'data not null');
|
|
11
|
+
SELECT col_not_null('dummy_landable', 'assets', 'md5sum', 'md5sum not null');
|
|
12
|
+
SELECT col_not_null('dummy_landable', 'assets', 'mime_type', 'mime_type not null');
|
|
13
|
+
|
|
14
|
+
SELECT * FROM finish();
|
|
15
|
+
|
|
16
|
+
ROLLBACK;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
SELECT PLAN(10);
|
|
3
|
+
|
|
4
|
+
SELECT col_not_null('dummy_landable', 'authors', 'email', 'email is not null');
|
|
5
|
+
SELECT col_not_null('dummy_landable', 'authors', 'username', 'usernameis not null');
|
|
6
|
+
SELECT col_not_null('dummy_landable', 'authors', 'first_name', 'first_name is not null');
|
|
7
|
+
SELECT col_not_null('dummy_landable', 'authors', 'last_name', 'last_name is not null');
|
|
8
|
+
|
|
9
|
+
SELECT col_is_pk('dummy_landable', 'authors', 'author_id', 'author_id is PK');
|
|
10
|
+
|
|
11
|
+
--Verify unique index on email
|
|
12
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('jdoe@test.com', 'jdoe', 'john', 'doe')$$);
|
|
13
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('jdoe@test.com', 'jdoe', 'john', 'doe')$$, 'violates unique constraint');
|
|
14
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('JDOE@test.com', 'jdoe', 'john', 'doe')$$, 'violates unique constraint', 'email is case insensitive');
|
|
15
|
+
|
|
16
|
+
--Verify unique index on username
|
|
17
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('jdoe2@test.com', 'jdoe', 'john', 'doe')$$, 'violates unique constraint', 'unique username');
|
|
18
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('jdoe2@test.com', 'JDoe', 'john', 'doe')$$, 'unique username is case insensitive');
|
|
19
|
+
|
|
20
|
+
SELECT * FROM finish();
|
|
21
|
+
|
|
22
|
+
ROLLBACK;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(18);
|
|
4
|
+
|
|
5
|
+
--Verify existence of triggers and functions for page revisions
|
|
6
|
+
SELECT triggers_are('dummy_landable', 'page_revisions', ARRAY['dummy_landable_page_revisions__bfr_insert', 'dummy_landable_page_revisions__no_delete', 'dummy_landable_page_revisions__no_update'], 'dummy_landable.page_revisions should have triggers');
|
|
7
|
+
SELECT functions_are('dummy_landable', ARRAY['pages_revision_ordinal', 'tg_disallow'], 'dummy_Landable schema should have funcitons');
|
|
8
|
+
|
|
9
|
+
--Verify existence of foreign keys
|
|
10
|
+
SELECT col_is_fk('dummy_landable', 'page_revisions', 'page_id', 'page_revisions has page_id foreign key');
|
|
11
|
+
SELECT col_is_fk('dummy_landable', 'page_revisions', 'author_id', 'page_revisions has author_id foreign key');
|
|
12
|
+
SELECT col_is_fk('dummy_landable', 'page_revisions', 'theme_id', 'page_revisions has theme_id foreign key');
|
|
13
|
+
SELECT col_is_fk('dummy_landable', 'page_revisions', 'category_id', 'page_revisions has category_id foreign key');
|
|
14
|
+
|
|
15
|
+
--Verify primary key
|
|
16
|
+
SELECT col_is_pk('dummy_landable', 'page_revisions', 'page_revision_id', 'page_revisions has primary key');
|
|
17
|
+
|
|
18
|
+
--Insert test data
|
|
19
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.pages (is_publishable, path, status_code) VALUES ('true', '/foo/bar', 200)$$);
|
|
20
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.authors (email, username, first_name, last_name) VALUES ('jdoe@test.com', 'jdoe', 'john', 'doe')$$);
|
|
21
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.page_revisions(page_id, author_id) SELECT page_id, author_id FROM dummy_landable.pages, dummy_landable.authors$$);
|
|
22
|
+
|
|
23
|
+
--Verify ordinal is generated and populated automatically
|
|
24
|
+
SELECT results_eq($$SELECT max(ordinal) FROM dummy_landable.page_revisions$$, $$SELECT 1$$);
|
|
25
|
+
|
|
26
|
+
--Verify ordinal is incremented automatically
|
|
27
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.page_revisions(page_id, author_id) SELECT page_id, author_id FROM dummy_landable.pages, dummy_landable.authors$$);
|
|
28
|
+
SELECT results_eq($$SELECT max(ordinal) FROM dummy_landable.page_revisions$$, $$SELECT 2$$);
|
|
29
|
+
|
|
30
|
+
--Verify ordinals cannot be supplied in insert
|
|
31
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.page_revisions(ordinal, page_id, author_id) SELECT 1, page_id, author_id FROM dummy_landable.pages, dummy_landable.authors$$, 'ordinal');
|
|
32
|
+
|
|
33
|
+
--Verify cannot delete from page_revisions
|
|
34
|
+
SELECT throws_matching($$DELETE FROM dummy_landable.page_revisions$$, 'DELETEs are not allowed');
|
|
35
|
+
|
|
36
|
+
--Verify cannot update fields others than is_published, updated_atfor page_revisions
|
|
37
|
+
SELECT throws_matching($$UPDATE dummy_landable.page_revisions SET notes = 'blah'$$, 'UPDATEs are not allowed', 'Cannot update notes');
|
|
38
|
+
SELECT lives_ok($$UPDATE dummy_landable.page_revisions SET updated_at = now()$$, 'Can update updated_at');
|
|
39
|
+
SELECT lives_ok($$UPDATE dummy_landable.page_revisions SET is_published = 'true'$$, 'Can update is_published');
|
|
40
|
+
|
|
41
|
+
ROLLBACK;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(6);
|
|
4
|
+
|
|
5
|
+
--Verify PK and FK columns
|
|
6
|
+
SELECT col_is_fk('dummy_landable', 'pages', 'published_revision_id', 'pages have published_revision_id fk');
|
|
7
|
+
SELECT col_is_fk('dummy_landable', 'pages', 'theme_id', 'pages have theme_id fk');
|
|
8
|
+
SELECT col_is_fk('dummy_landable', 'pages', 'category_id', 'pages have category_id fk');
|
|
9
|
+
SELECT col_is_pk('dummy_landable', 'pages', 'page_id', 'page_id is PK');
|
|
10
|
+
|
|
11
|
+
--Verify unique index on path
|
|
12
|
+
SELECT index_is_unique('dummy_landable', 'pages', 'dummy_landable_pages__u_path', 'Path index is unique');
|
|
13
|
+
|
|
14
|
+
--Verify valid paths
|
|
15
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.pages (is_publishable, path, status_code) VALUES ('true', 'good/page4', 200)$$, 'violates check', 'valid path');
|
|
16
|
+
|
|
17
|
+
SELECT * FROM finish()
|
|
18
|
+
|
|
19
|
+
ROLLBACK;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(6);
|
|
4
|
+
|
|
5
|
+
SELECT col_is_pk('dummy_landable', 'templates', 'template_id', 'Template_id is pk');
|
|
6
|
+
SELECT col_not_null('dummy_landable', 'templates', 'name', 'name is NOT NULL');
|
|
7
|
+
SELECT col_not_null('dummy_landable', 'templates', 'body', 'body is NOT NULL');
|
|
8
|
+
SELECT col_not_null('dummy_landable', 'templates', 'description', 'description is NOT NULL');
|
|
9
|
+
|
|
10
|
+
SELECT has_index('dummy_landable', 'templates', 'dummy_landable_templates__u_name', 'Index on name');
|
|
11
|
+
SELECT index_is_unique('dummy_landable', 'templates', 'dummy_landable_templates__u_name', 'name index is unique');
|
|
12
|
+
|
|
13
|
+
SELECT * FROM finish();
|
|
14
|
+
|
|
15
|
+
ROLLBACK;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
BEGIN;
|
|
2
|
+
|
|
3
|
+
SELECT PLAN(12);
|
|
4
|
+
|
|
5
|
+
SELECT col_is_pk('dummy_landable', 'themes', 'theme_id', 'Theme_id is PK');
|
|
6
|
+
|
|
7
|
+
SELECT col_not_null('dummy_landable', 'themes', 'name', 'Name is not null');
|
|
8
|
+
SELECT col_not_null('dummy_landable', 'themes', 'body', 'body is not null');
|
|
9
|
+
SELECT col_not_null('dummy_landable', 'themes', 'description', 'Description is not null');
|
|
10
|
+
SELECT col_not_null('dummy_landable', 'themes', 'editable', 'Editable is not null');
|
|
11
|
+
|
|
12
|
+
SELECT col_has_default('dummy_landable', 'themes', 'editable', $$Editable has default.$$);
|
|
13
|
+
|
|
14
|
+
--Verify unique index on theme name
|
|
15
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.themes (name, body, description, editable) VALUES ('test', 'body', 'test body', true)$$);
|
|
16
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.themes (name, body, description) VALUES ('test', 'body', 'test body')$$, 'name');
|
|
17
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.themes (name, body, description) VALUES ('TEST', 'body', 'test body')$$, 'name');
|
|
18
|
+
|
|
19
|
+
SELECT index_is_unique('dummy_landable', 'themes', 'dummy_landable_themes__u_file', $$Unique index on file column.$$);
|
|
20
|
+
SELECT lives_ok($$INSERT INTO dummy_landable.themes (file, name, body, description, editable) VALUES ('filename', 'test1', 'body', 'test body', true)$$);
|
|
21
|
+
SELECT throws_matching($$INSERT INTO dummy_landable.themes (file, name, body, description) VALUES ('FILENAME', 'test1', 'body', 'test body')$$, '__u_file');
|
|
22
|
+
|
|
23
|
+
SELECT * FROM finish();
|
|
24
|
+
|
|
25
|
+
ROLLBACK;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Access Token",
|
|
3
|
+
"description": "An API access token",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["id", "expires_at", "author"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"$ref": "uuid.json"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"expires_at": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"format": "date-time"
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
"author": {
|
|
19
|
+
"$ref": "author.json"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Asset",
|
|
3
|
+
"description": "An uploaded asset file",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["id", "name", "public_url", "md5sum", "file_size", "mime_type", "author_id", "theme_ids", "page_ids", "created_at", "updated_at"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"$ref": "uuid.json"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"name": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"minLength": 1
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
"description": {
|
|
19
|
+
"type": ["string", "null"]
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"public_url": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"format": "uri"
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
"md5sum": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"length": 32
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
"file_size": {
|
|
33
|
+
"type": "integer",
|
|
34
|
+
"min": 1
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
"mime_type": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
"author_id": {
|
|
42
|
+
"type": "string"
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
"theme_ids": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"items": { "$ref": "uuid.json" }
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
"page_ids": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": { "$ref": "uuid.json" }
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
"created_at": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"format": "date-time"
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
"updated_at": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"format": "date-time"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Author",
|
|
3
|
+
"description": "An author of landable content",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["id", "username", "email", "first_name", "last_name"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"$ref": "uuid.json#"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"username": {
|
|
14
|
+
"type": "string"
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
"email": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"format": "email"
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"first_name": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
"last_name": {
|
|
27
|
+
"type": "string"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Directory",
|
|
3
|
+
"description": "A directory listing of all pages beneath a given path",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["id"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": { "type": "string", "format": "^/" },
|
|
10
|
+
"path": { "$ref": "#/properties/id" },
|
|
11
|
+
|
|
12
|
+
"subdirectory_ids": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"items": { "$ref": "#/properties/id" },
|
|
15
|
+
"uniqueItems": true
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
"page_ids": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"items": { "$ref": "uuid.json" },
|
|
21
|
+
"uniqueItems": true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Page",
|
|
3
|
+
"description": "A page served by landable",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["path", "status_code", "body"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"$ref": "uuid.json"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"theme_id": {
|
|
14
|
+
"type": [{ "$ref": "uuid.json" }, "null"]
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
"category_id": {
|
|
18
|
+
"type": [{ "$ref": "uuid.json" }, "null"]
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
"path": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
"status_code": {
|
|
26
|
+
"type": "integer"
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
"title": {
|
|
30
|
+
"type": ["string", "null"]
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
"body": {
|
|
34
|
+
"type": ["string"]
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
"head_content": {
|
|
38
|
+
"type": ["string", "null"]
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
"redirect_url": {
|
|
42
|
+
"type": ["string", "null"],
|
|
43
|
+
"format": "uri"
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
"preview_path": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"format": "uri"
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
"is_publishable": {
|
|
52
|
+
"type": "boolean"
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
"published_revision_id": {
|
|
56
|
+
"type": ["null", {"$ref": "uuid.json"}]
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
"lock_version": {
|
|
60
|
+
"type": "integer",
|
|
61
|
+
"min": 1
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
"updated_by_author_id": {
|
|
65
|
+
"type": ["null", {"$ref": "uuid.json"}]
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
"meta_tags": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
|
|
72
|
+
"properties": {
|
|
73
|
+
"keywords": {
|
|
74
|
+
"type": ["string", "null"]
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
"description": {
|
|
78
|
+
"type": ["string", "null"]
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
"robots": {
|
|
82
|
+
"type": ["string", "null"]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
"abstract": {
|
|
88
|
+
"type": ["text", "null"]
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
"hero_asset_name": {
|
|
92
|
+
"type": ["string", "null"]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Page Revision",
|
|
3
|
+
"description": "A particular snapshot of a page which has, at some point, been published.",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["id", "page_id", "author_id", "notes", "is_published", "is_minor", "preview_path", "ordinal", "created_at", "updated_at"],
|
|
7
|
+
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"$ref": "uuid.json"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"page_id": {
|
|
14
|
+
"$ref": "uuid.json"
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
"author_id": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
"theme_id": {
|
|
22
|
+
"type": "uuid.json"
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
"category_id": {
|
|
26
|
+
"type": "uuid.json"
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
"status_code": {
|
|
30
|
+
"type": "integer"
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
"preview_url": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"format": "uri"
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
"preview_path": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"format": "uri"
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
"notes": {
|
|
44
|
+
"type": ["string", "null"]
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
"is_published": {
|
|
48
|
+
"type": "boolean"
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
"is_minor": {
|
|
52
|
+
"type": "boolean"
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
"ordinal": {
|
|
56
|
+
"type": "integer",
|
|
57
|
+
"minimum": 1
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
"created_at": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"format": "date-time"
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
"updated_at": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"format": "date-time"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|