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,11 @@
|
|
|
1
|
+
class LandablePagesAddUpdatedBy < Landable::Migration
|
|
2
|
+
def change
|
|
3
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.pages", :updated_by_author_id, :uuid
|
|
4
|
+
|
|
5
|
+
execute <<-SQL
|
|
6
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.pages
|
|
7
|
+
ADD CONSTRAINT updated_author_fk FOREIGN KEY(updated_by_author_id)
|
|
8
|
+
REFERENCES #{Landable.configuration.database_schema_prefix}landable.authors(author_id)
|
|
9
|
+
SQL
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require_dependency 'landable/page_revision'
|
|
2
|
+
class LandablePageRevisionsBreakOutSnapshot < Landable::Migration
|
|
3
|
+
|
|
4
|
+
class Landable::PageRevision < ActiveRecord::Base
|
|
5
|
+
store :snapshot_attributes, accessors: [:body]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def up
|
|
9
|
+
|
|
10
|
+
# Setup new columns
|
|
11
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :theme_id, :uuid
|
|
12
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :status_code_id, :uuid
|
|
13
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :category_id, :uuid
|
|
14
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :redirect_url, :text
|
|
15
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :body, :text
|
|
16
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :title, :text
|
|
17
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :path, :text
|
|
18
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :meta_tags, :hstore
|
|
19
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :head_tags, :hstore
|
|
20
|
+
|
|
21
|
+
execute <<-SQL
|
|
22
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
23
|
+
ADD CONSTRAINT theme_id_fk FOREIGN KEY(theme_id)
|
|
24
|
+
REFERENCES #{Landable.configuration.database_schema_prefix}landable.themes(theme_id);
|
|
25
|
+
|
|
26
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
27
|
+
ADD CONSTRAINT status_code_id_fk FOREIGN KEY(status_code_id)
|
|
28
|
+
REFERENCES #{Landable.configuration.database_schema_prefix}landable.status_codes(status_code_id);
|
|
29
|
+
|
|
30
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
31
|
+
ADD CONSTRAINT category_id_fk FOREIGN KEY(category_id)
|
|
32
|
+
REFERENCES #{Landable.configuration.database_schema_prefix}landable.categories(category_id);
|
|
33
|
+
SQL
|
|
34
|
+
|
|
35
|
+
# Go through each record and copy snapshot into new, broken-out columns
|
|
36
|
+
Landable::PageRevision.all.each do |rev|
|
|
37
|
+
head_tags = {}
|
|
38
|
+
rev.title = rev.snapshot_attributes['title']
|
|
39
|
+
rev.body = rev.snapshot_attributes['body']
|
|
40
|
+
rev.status_code_id = rev.snapshot_attributes['status_code_id']
|
|
41
|
+
rev.category_id = rev.snapshot_attributes['category_id']
|
|
42
|
+
rev.theme_id = rev.snapshot_attributes['theme_id']
|
|
43
|
+
rev.redirect_url = rev.snapshot_attributes['redirect_url']
|
|
44
|
+
rev.path = rev.snapshot_attributes['path']
|
|
45
|
+
rev.meta_tags = rev.snapshot_attributes['meta_tags']
|
|
46
|
+
rev.snapshot_attributes['head_tags'].each do |tag|
|
|
47
|
+
head_tags[tag['head_tag_id']] = tag['content']
|
|
48
|
+
end
|
|
49
|
+
rev.head_tags = head_tags
|
|
50
|
+
rev.save!
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Remove snapshot column
|
|
54
|
+
remove_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :snapshot_attributes
|
|
55
|
+
|
|
56
|
+
execute <<-SQL
|
|
57
|
+
DROP TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update ON #{Landable.configuration.database_schema_prefix}landable.page_revisions;
|
|
58
|
+
|
|
59
|
+
CREATE TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update
|
|
60
|
+
BEFORE UPDATE OF notes, is_minor, page_id, author_id, created_at, ordinal
|
|
61
|
+
, theme_id, status_code_id, category_id, redirect_url, body
|
|
62
|
+
, title, path, meta_tags, head_tags
|
|
63
|
+
ON #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
64
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{Landable.configuration.database_schema_prefix}landable.tg_disallow();
|
|
65
|
+
SQL
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def down
|
|
70
|
+
raise ActiveRecord::IrreversibleMigration
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class FileBasedThemes < Landable::Migration
|
|
2
|
+
def up
|
|
3
|
+
change_table "#{Landable.configuration.database_schema_prefix}landable.themes" do |t|
|
|
4
|
+
t.text :file
|
|
5
|
+
t.text :extension
|
|
6
|
+
t.boolean :editable, null: false, default: true
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
execute "CREATE UNIQUE INDEX #{Landable.configuration.database_schema_prefix}landable_themes__u_file
|
|
10
|
+
ON #{Landable.configuration.database_schema_prefix}landable.themes(lower(file))"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class CreateHeadTagOnPage < Landable::Migration
|
|
2
|
+
def up
|
|
3
|
+
execute "DROP TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update
|
|
4
|
+
ON #{Landable.configuration.database_schema_prefix}landable.page_revisions"
|
|
5
|
+
|
|
6
|
+
drop_table "#{Landable.configuration.database_schema_prefix}landable.head_tags"
|
|
7
|
+
remove_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :head_tags
|
|
8
|
+
|
|
9
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.pages", :head_content, :text
|
|
10
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :head_content, :text
|
|
11
|
+
|
|
12
|
+
execute "CREATE TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update
|
|
13
|
+
BEFORE UPDATE OF notes, is_minor, page_id, author_id, created_at, ordinal
|
|
14
|
+
, theme_id, status_code_id, category_id, redirect_url, body
|
|
15
|
+
, title, path, meta_tags, head_content
|
|
16
|
+
ON #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
17
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{Landable.configuration.database_schema_prefix}landable.tg_disallow();"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require_dependency 'landable/page'
|
|
2
|
+
class DropStatusCodesModel < Landable::Migration
|
|
3
|
+
|
|
4
|
+
class Landable::StatusCode < ActiveRecord::Base
|
|
5
|
+
self.table_name = "#{Landable.configuration.database_schema_prefix}landable.status_codes"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def change
|
|
9
|
+
# Add the column
|
|
10
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.pages", :status_code, :integer, null: false, default: 200, limit: 2
|
|
11
|
+
add_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :status_code, :integer, limit: 2
|
|
12
|
+
|
|
13
|
+
# Backfill existing pages
|
|
14
|
+
Landable::Page.all.each do |page|
|
|
15
|
+
page.status_code = Landable::StatusCode.where(status_code_id: page.status_code_id).first.code
|
|
16
|
+
page.save!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Backfill existing pages
|
|
20
|
+
Landable::PageRevision.all.each do |rev|
|
|
21
|
+
rev.status_code = Landable::StatusCode.where(status_code_id: rev.status_code_id).first.code
|
|
22
|
+
rev.save!
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Remove constraints, update trigger
|
|
26
|
+
execute <<-SQL
|
|
27
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.pages DROP CONSTRAINT status_code_fk;
|
|
28
|
+
ALTER TABLE #{Landable.configuration.database_schema_prefix}landable.page_revisions DROP CONSTRAINT status_code_id_fk;
|
|
29
|
+
DROP TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update
|
|
30
|
+
ON #{Landable.configuration.database_schema_prefix}landable.page_revisions;
|
|
31
|
+
CREATE TRIGGER #{Landable.configuration.database_schema_prefix}landable_page_revisions__no_update
|
|
32
|
+
BEFORE UPDATE OF notes, is_minor, page_id, author_id, created_at, ordinal
|
|
33
|
+
, theme_id, status_code, category_id, redirect_url, body
|
|
34
|
+
ON #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
35
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{Landable.configuration.database_schema_prefix}landable.tg_disallow();
|
|
36
|
+
SQL
|
|
37
|
+
|
|
38
|
+
# Remove tables, columns
|
|
39
|
+
remove_column "#{Landable.configuration.database_schema_prefix}landable.pages", :status_code_id
|
|
40
|
+
remove_column "#{Landable.configuration.database_schema_prefix}landable.page_revisions", :status_code_id
|
|
41
|
+
drop_table "#{Landable.configuration.database_schema_prefix}landable.status_codes"
|
|
42
|
+
drop_table "#{Landable.configuration.database_schema_prefix}landable.status_code_categories"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
class AddTrafficSchema < Landable::Migration
|
|
2
|
+
# "owners"."owner" records your application's user/account/person identifier.
|
|
3
|
+
# Change the following line if your identifiers' data type is not INTEGER.
|
|
4
|
+
|
|
5
|
+
OWNER_TYPE = 'INTEGER'
|
|
6
|
+
|
|
7
|
+
QUERY_PARAMS = %w[
|
|
8
|
+
ad_type
|
|
9
|
+
ad_group
|
|
10
|
+
bid_match_type
|
|
11
|
+
campaign
|
|
12
|
+
content
|
|
13
|
+
creative
|
|
14
|
+
device_type
|
|
15
|
+
experiment
|
|
16
|
+
keyword
|
|
17
|
+
match_type
|
|
18
|
+
medium
|
|
19
|
+
network
|
|
20
|
+
placement
|
|
21
|
+
position
|
|
22
|
+
search_term
|
|
23
|
+
source
|
|
24
|
+
target
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
def up
|
|
28
|
+
# Resources
|
|
29
|
+
#
|
|
30
|
+
# Measuring and Tracking Success: http://moz.com/beginners-guide-to-seo/measuring-and-tracking-success
|
|
31
|
+
|
|
32
|
+
# Query String
|
|
33
|
+
#
|
|
34
|
+
# keywords: http://cyrusshepard.com/7-fantastic-seo-tips-for-googles-not-provided-keywords/
|
|
35
|
+
|
|
36
|
+
execute "CREATE SCHEMA #{Landable.configuration.database_schema_prefix}landable_traffic;"
|
|
37
|
+
|
|
38
|
+
with_options schema: "#{Landable.configuration.database_schema_prefix}landable_traffic" do |t|
|
|
39
|
+
# Query Params
|
|
40
|
+
t.create_lookup_tables(*QUERY_PARAMS.map(&:pluralize))
|
|
41
|
+
|
|
42
|
+
# User Agent
|
|
43
|
+
t.create_lookup_tables :user_agent_types, :browsers, :devices, :platforms
|
|
44
|
+
|
|
45
|
+
# HTTP
|
|
46
|
+
t.create_lookup_tables :domains, :paths, :query_strings
|
|
47
|
+
t.create_lookup_tables :http_methods, :mime_types
|
|
48
|
+
|
|
49
|
+
t.create_lookup_table :event_types
|
|
50
|
+
|
|
51
|
+
# IP / Geolocation
|
|
52
|
+
t.create_lookup_table :ip_addresses, lookup_type: :inet
|
|
53
|
+
t.create_lookup_tables :countries, :regions, :cities
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
execute <<-SQL
|
|
57
|
+
SET search_path TO #{Landable.configuration.database_schema_prefix}landable_traffic,public;
|
|
58
|
+
|
|
59
|
+
ALTER TABLE mime_types ALTER COLUMN mime_type_id SET DATA TYPE SMALLINT;
|
|
60
|
+
ALTER TABLE http_methods ALTER COLUMN http_method_id SET DATA TYPE SMALLINT;
|
|
61
|
+
|
|
62
|
+
ALTER TABLE user_agent_types ALTER COLUMN user_agent_type_id SET DATA TYPE SMALLINT;
|
|
63
|
+
ALTER TABLE platforms ALTER COLUMN platform_id SET DATA TYPE SMALLINT;
|
|
64
|
+
ALTER TABLE browsers ALTER COLUMN browser_id SET DATA TYPE SMALLINT;
|
|
65
|
+
|
|
66
|
+
INSERT INTO user_agent_types (user_agent_type) VALUES ('user'), ('ping'), ('crawl'), ('scrape'), ('scan');
|
|
67
|
+
|
|
68
|
+
CREATE TABLE user_agents (
|
|
69
|
+
user_agent_id SERIAL PRIMARY KEY
|
|
70
|
+
|
|
71
|
+
, user_agent_type_id SMALLINT REFERENCES user_agent_types
|
|
72
|
+
|
|
73
|
+
, device_id INTEGER REFERENCES devices
|
|
74
|
+
, platform_id SMALLINT REFERENCES platforms
|
|
75
|
+
, browser_id SMALLINT REFERENCES browsers
|
|
76
|
+
, browser_version TEXT
|
|
77
|
+
|
|
78
|
+
, user_agent TEXT NOT NULL UNIQUE
|
|
79
|
+
|
|
80
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE INDEX ON user_agents (device_id);
|
|
84
|
+
CREATE INDEX ON user_agents (platform_id);
|
|
85
|
+
CREATE INDEX ON user_agents (browser_id);
|
|
86
|
+
|
|
87
|
+
ALTER TABLE ad_types ALTER COLUMN ad_type_id SET DATA TYPE SMALLINT;
|
|
88
|
+
ALTER TABLE bid_match_types ALTER COLUMN bid_match_type_id SET DATA TYPE SMALLINT;
|
|
89
|
+
ALTER TABLE device_types ALTER COLUMN device_type_id SET DATA TYPE SMALLINT;
|
|
90
|
+
ALTER TABLE match_types ALTER COLUMN match_type_id SET DATA TYPE SMALLINT;
|
|
91
|
+
ALTER TABLE positions ALTER COLUMN position_id SET DATA TYPE SMALLINT;
|
|
92
|
+
|
|
93
|
+
-- TODO: aceid AdWords Campaign Experiment ID
|
|
94
|
+
CREATE TABLE attributions (
|
|
95
|
+
attribution_id SERIAL PRIMARY KEY
|
|
96
|
+
|
|
97
|
+
, #{QUERY_PARAMS.map { |name| "%s INTEGER REFERENCES %s" % [name.foreign_key, name.pluralize] }.join(',') }
|
|
98
|
+
|
|
99
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
100
|
+
|
|
101
|
+
, UNIQUE (#{QUERY_PARAMS.map(&:foreign_key).join(',')})
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
ALTER TABLE attributions
|
|
105
|
+
ALTER COLUMN ad_type_id SET DATA TYPE SMALLINT
|
|
106
|
+
, ALTER COLUMN bid_match_type_id SET DATA TYPE SMALLINT
|
|
107
|
+
, ALTER COLUMN device_type_id SET DATA TYPE SMALLINT
|
|
108
|
+
, ALTER COLUMN match_type_id SET DATA TYPE SMALLINT
|
|
109
|
+
, ALTER COLUMN position_id SET DATA TYPE SMALLINT
|
|
110
|
+
;
|
|
111
|
+
|
|
112
|
+
#{QUERY_PARAMS.map { |p| "CREATE INDEX ON attributions (#{p.foreign_key});" }.join("\n")}
|
|
113
|
+
|
|
114
|
+
CREATE TABLE referers (
|
|
115
|
+
referer_id SERIAL PRIMARY KEY
|
|
116
|
+
|
|
117
|
+
, domain_id INTEGER NOT NULL REFERENCES domains
|
|
118
|
+
, path_id INTEGER NOT NULL REFERENCES paths
|
|
119
|
+
, query_string_id INTEGER NOT NULL REFERENCES query_strings
|
|
120
|
+
|
|
121
|
+
, attribution_id INTEGER NOT NULL REFERENCES attributions
|
|
122
|
+
|
|
123
|
+
, UNIQUE (domain_id, path_id, query_string_id)
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
CREATE INDEX ON referers (domain_id);
|
|
127
|
+
CREATE INDEX ON referers (path_id);
|
|
128
|
+
CREATE INDEX ON referers (query_string_id);
|
|
129
|
+
|
|
130
|
+
CREATE TABLE locations (
|
|
131
|
+
location_id SERIAL PRIMARY KEY
|
|
132
|
+
|
|
133
|
+
, country_id INTEGER REFERENCES countries
|
|
134
|
+
, region_id INTEGER REFERENCES regions
|
|
135
|
+
, city_id INTEGER REFERENCES cities
|
|
136
|
+
|
|
137
|
+
, UNIQUE (country_id, region_id, city_id)
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
CREATE INDEX ON locations (country_id);
|
|
141
|
+
CREATE INDEX ON locations (region_id);
|
|
142
|
+
CREATE INDEX ON locations (city_id);
|
|
143
|
+
|
|
144
|
+
CREATE TABLE ip_lookups (
|
|
145
|
+
ip_lookup_id SERIAL PRIMARY KEY
|
|
146
|
+
|
|
147
|
+
, ip_address_id INTEGER NOT NULL REFERENCES ip_addresses
|
|
148
|
+
, domain_id INTEGER REFERENCES domains
|
|
149
|
+
, location_id INTEGER REFERENCES locations
|
|
150
|
+
|
|
151
|
+
, latitude REAL
|
|
152
|
+
, longitude REAL
|
|
153
|
+
|
|
154
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
CREATE INDEX ON ip_lookups (ip_address_id);
|
|
158
|
+
CREATE INDEX ON ip_lookups (domain_id);
|
|
159
|
+
CREATE INDEX ON ip_lookups (location_id);
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
-- User Traffic
|
|
163
|
+
|
|
164
|
+
CREATE TABLE cookies (
|
|
165
|
+
cookie_id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
CREATE TABLE owners (
|
|
169
|
+
owner_id INTEGER PRIMARY KEY
|
|
170
|
+
, owner #{OWNER_TYPE} NOT NULL UNIQUE
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
CREATE TABLE ownerships (
|
|
174
|
+
owner_id INTEGER NOT NULL REFERENCES owners
|
|
175
|
+
, cookie_id UUID NOT NULL REFERENCES cookies
|
|
176
|
+
|
|
177
|
+
, PRIMARY KEY (owner_id, cookie_id)
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
CREATE TABLE visitors (
|
|
181
|
+
visitor_id SERIAL PRIMARY KEY
|
|
182
|
+
|
|
183
|
+
, ip_address_id INTEGER NOT NULL REFERENCES ip_addresses
|
|
184
|
+
, user_agent_id INTEGER NOT NULL REFERENCES user_agents
|
|
185
|
+
|
|
186
|
+
, UNIQUE (ip_address_id, user_agent_id)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX ON visitors (user_agent_id);
|
|
190
|
+
|
|
191
|
+
CREATE TABLE visits (
|
|
192
|
+
visit_id SERIAL PRIMARY KEY
|
|
193
|
+
|
|
194
|
+
, cookie_id UUID NOT NULL REFERENCES cookies
|
|
195
|
+
|
|
196
|
+
, visitor_id INTEGER NOT NULL REFERENCES visitors
|
|
197
|
+
, attribution_id INTEGER NOT NULL REFERENCES attributions
|
|
198
|
+
|
|
199
|
+
, referer_id INTEGER REFERENCES referers
|
|
200
|
+
, owner_id INTEGER REFERENCES owners
|
|
201
|
+
|
|
202
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
CREATE INDEX ON visits (cookie_id);
|
|
206
|
+
CREATE INDEX ON visits (visitor_id);
|
|
207
|
+
CREATE INDEX ON visits (attribution_id);
|
|
208
|
+
CREATE INDEX ON visits (referer_id);
|
|
209
|
+
CREATE INDEX ON visits (owner_id);
|
|
210
|
+
|
|
211
|
+
CREATE TABLE page_views (
|
|
212
|
+
page_view_id SERIAL PRIMARY KEY
|
|
213
|
+
|
|
214
|
+
, visit_id INTEGER NOT NULL REFERENCES visits
|
|
215
|
+
, path_id INTEGER NOT NULL REFERENCES paths
|
|
216
|
+
, query_string_id INTEGER NOT NULL REFERENCES query_strings
|
|
217
|
+
|
|
218
|
+
, mime_type_id SMALLINT NOT NULL REFERENCES mime_types
|
|
219
|
+
, http_method_id SMALLINT NOT NULL REFERENCES http_methods
|
|
220
|
+
|
|
221
|
+
, page_revision_id UUID REFERENCES #{Landable.configuration.database_schema_prefix}landable.page_revisions
|
|
222
|
+
, request_id UUID
|
|
223
|
+
|
|
224
|
+
, click_id TEXT
|
|
225
|
+
|
|
226
|
+
, content_length INTEGER
|
|
227
|
+
, http_status INTEGER
|
|
228
|
+
|
|
229
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
CREATE INDEX ON page_views (visit_id);
|
|
233
|
+
CREATE INDEX ON page_views (path_id);
|
|
234
|
+
CREATE INDEX ON page_views (query_string_id);
|
|
235
|
+
CREATE INDEX ON page_views (page_revision_id);
|
|
236
|
+
CREATE INDEX ON page_views (request_id);
|
|
237
|
+
CREATE INDEX ON page_views (click_id);
|
|
238
|
+
|
|
239
|
+
CREATE TABLE events (
|
|
240
|
+
event_id SERIAL PRIMARY KEY
|
|
241
|
+
|
|
242
|
+
, event_type_id INTEGER NOT NULL REFERENCES event_types
|
|
243
|
+
, visit_id INTEGER NOT NULL REFERENCES visits
|
|
244
|
+
|
|
245
|
+
, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
CREATE INDEX ON events (event_type_id);
|
|
249
|
+
CREATE INDEX ON events (visit_id);
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
-- TODO: visit frequency
|
|
253
|
+
CREATE TABLE accesses (
|
|
254
|
+
access_id SERIAL PRIMARY KEY
|
|
255
|
+
|
|
256
|
+
, path_id INTEGER NOT NULL REFERENCES paths
|
|
257
|
+
, visitor_id INTEGER NOT NULL REFERENCES visitors
|
|
258
|
+
|
|
259
|
+
, last_accessed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
260
|
+
|
|
261
|
+
, UNIQUE (path_id, visitor_id)
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
CREATE INDEX ON accesses (visitor_id);
|
|
265
|
+
|
|
266
|
+
INSERT INTO bid_match_types (bid_match_type) VALUES ('bidded broad'), ('bidded content'), ('bidded exact'), ('bidded phrase');
|
|
267
|
+
INSERT INTO device_types (device_type) VALUES ('computer'), ('mobile'), ('tablet');
|
|
268
|
+
INSERT INTO match_types (match_type) VALUES ('broad'), ('phrase'), ('exact');
|
|
269
|
+
INSERT INTO networks (network) VALUES ('google_search'), ('search_partner'), ('display_network');
|
|
270
|
+
|
|
271
|
+
-- Views
|
|
272
|
+
-- * visits from non-user user_agents
|
|
273
|
+
-- * visits from real user_agents on ips with non-user visits
|
|
274
|
+
SQL
|
|
275
|
+
end
|
|
276
|
+
end
|