landable 1.10.0.rc2 → 1.11.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 +4 -4
- data/.hound.yml +4 -0
- data/.ruby.yml +10 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +9 -2
- data/landable.gemspec +3 -2
- data/lib/generators/templates/landable.rb +17 -3
- data/lib/landable/configuration.rb +8 -0
- data/lib/landable/layout.rb +8 -1
- data/lib/landable/traffic.rb +11 -2
- data/lib/landable/traffic/tracker.rb +4 -0
- data/lib/landable/version.rb +2 -3
- data/lib/schema_moves.rb +208 -0
- data/lib/tasks/landable/data.rake +15 -139
- data/spec/dummy/app/views/layouts/_partial.html.haml +1 -0
- data/spec/dummy/app/views/layouts/application.haml +4 -0
- data/spec/lib/landable/layout_spec.rb +11 -1
- data/spec/lib/landable/tracking_spec.rb +24 -0
- metadata +34 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33e0d69e6891c96f2d1a009ef58a5a82ddc5f3a6
|
4
|
+
data.tar.gz: d5007db85e84798a12c6abf7e6d1c43548264556
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e1199458a3de14521df62769d390e8fbc4fccac423a58903be15af167b99ca9855c2ab7765183d95e7c2b09ae7e0d98fac0aa879c8d7a09dc125eb8438d6594
|
7
|
+
data.tar.gz: f569cbfb3c711e2f2c2453eff742d1b8c4ca7498c9d5bf2ed0fc1b453fdcd5455fc193f9c0eeeb22f5a45bfa8577bcccb8978b4a10239c4e7fa3e3824137d8ff
|
data/.hound.yml
ADDED
data/.ruby.yml
ADDED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,10 +2,17 @@
|
|
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.11.0...master)
|
6
|
+
|
7
|
+
## 1.11.0 [#](https://github.com/enova/landable/compare/v1.10.0.rc1...v1.11.0)
|
8
|
+
* Make the tracker.user_agent accessible [#33]
|
9
|
+
* Add missing functions/triggers to schema_move task. Make it a little better in other ways [#24]
|
10
|
+
* Lock Liquid Dependency to Version as above versions will break tests [#30]
|
11
|
+
* Turn DNT into a config option [#31]
|
12
|
+
* Make Themes Import From App More Accepting [#35]
|
6
13
|
|
7
14
|
## 1.10.0.rc2 [#](https://github.com/enova/landable/compare/v1.10.0.rc1...v1.10.0.rc2)
|
8
|
-
* Set up configurable paths that are not visit tracked
|
15
|
+
* Set up configurable paths that are not visit tracked [#27]
|
9
16
|
|
10
17
|
## 1.10.0.rc1 [#](https://github.com/enova/landable/compare/v1.9.2...v1.10.0.rc1)
|
11
18
|
* Handle blank UserAgent [#25]
|
data/landable.gemspec
CHANGED
@@ -29,13 +29,14 @@ Gem::Specification.new do |gem|
|
|
29
29
|
|
30
30
|
gem.add_dependency 'rails', '~> 4.0'
|
31
31
|
gem.add_dependency 'rack-cors', '>= 0.2.7'
|
32
|
-
gem.add_dependency 'active_model_serializers', '
|
32
|
+
gem.add_dependency 'active_model_serializers', '0.8.3'
|
33
33
|
gem.add_dependency 'carrierwave'
|
34
|
-
gem.add_dependency 'liquid'
|
34
|
+
gem.add_dependency 'liquid', '~> 2.6.1'
|
35
35
|
gem.add_dependency 'fog'
|
36
36
|
gem.add_dependency 'rest-client'
|
37
37
|
gem.add_dependency 'builder'
|
38
38
|
gem.add_dependency 'lookup_by', '> 0.4.0'
|
39
|
+
gem.add_dependency 'highline'
|
39
40
|
|
40
41
|
gem.add_development_dependency 'pg'
|
41
42
|
gem.add_development_dependency 'rspec-rails', '~> 2.14.2'
|
@@ -26,6 +26,23 @@ Landable.configure do |config|
|
|
26
26
|
# Set to :html to track only HTML requests.
|
27
27
|
# config.traffic_enabled = true
|
28
28
|
|
29
|
+
# Set up paths that are never tracked by Landable visit tracking
|
30
|
+
# config.untracked_paths = %w(/status)
|
31
|
+
|
32
|
+
# DNT header (http://en.wikipedia.org/wiki/Do_Not_Track)
|
33
|
+
#
|
34
|
+
# DNT is a proposed HTTP header field that accepts three values:
|
35
|
+
# "1": (opt-out) user does not want to be tracked
|
36
|
+
# "0": (opt-in) user consents to being tracked
|
37
|
+
# null: (no header, empty, or other) user has not expressed a preference
|
38
|
+
#
|
39
|
+
# Note: It is unsettled if the DNT header should apply to first-party tracking.
|
40
|
+
#
|
41
|
+
# Default: Skip tracking if request.headers["DNT"] == "1"
|
42
|
+
#
|
43
|
+
# Uncomment to change the default
|
44
|
+
# config.dnt_enabled = true
|
45
|
+
|
29
46
|
# If you're using Landable with Publicist, add its url here. (required for screenshots)
|
30
47
|
# config.publicist_url = 'http://publicist.dev/'
|
31
48
|
|
@@ -34,9 +51,6 @@ Landable.configure do |config|
|
|
34
51
|
|
35
52
|
# If you want to save a different UserAgent if the request.user_agent is blank, set it here
|
36
53
|
# config.blank_user_agent_string = 'blank'
|
37
|
-
|
38
|
-
# Set up paths that are never tracked by Landable visit tracking
|
39
|
-
# config.untracked_paths %w(/status)
|
40
54
|
end
|
41
55
|
|
42
56
|
# Configure asset uploads. Assets will be uploaded to public/uploads by default.
|
@@ -10,6 +10,7 @@ module Landable
|
|
10
10
|
attr_writer :reserved_paths, :partials_to_templates, :database_schema_prefix
|
11
11
|
attr_writer :publicist_url, :audit_flags
|
12
12
|
attr_writer :blank_user_agent_string, :untracked_paths
|
13
|
+
attr_writer :dnt_enabled
|
13
14
|
|
14
15
|
def authenticators
|
15
16
|
@authenticators || raise("No Landable authenticator configured.")
|
@@ -149,6 +150,13 @@ module Landable
|
|
149
150
|
@untracked_paths ||= []
|
150
151
|
end
|
151
152
|
|
153
|
+
def dnt_enabled
|
154
|
+
return true if @dnt_enabled.nil?
|
155
|
+
|
156
|
+
@dnt_enabled
|
157
|
+
end
|
158
|
+
|
159
|
+
|
152
160
|
class Screenshots
|
153
161
|
attr_accessor :autorun
|
154
162
|
attr_accessor :browserstack_username, :browserstack_password
|
data/lib/landable/layout.rb
CHANGED
@@ -49,7 +49,14 @@ module Landable
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def files
|
52
|
-
|
52
|
+
files = []
|
53
|
+
|
54
|
+
paths.map do |path|
|
55
|
+
files << Dir[path + "/**/[^_]*.html.*"]
|
56
|
+
files << Dir[path + "/**/application*"]
|
57
|
+
end
|
58
|
+
|
59
|
+
files.flatten.uniq
|
53
60
|
end
|
54
61
|
|
55
62
|
def paths
|
data/lib/landable/traffic.rb
CHANGED
@@ -9,7 +9,8 @@ require 'landable/traffic/noop_tracker'
|
|
9
9
|
module Landable
|
10
10
|
module Traffic
|
11
11
|
def track_with_landable!
|
12
|
-
yield and return if
|
12
|
+
yield and return if untracked?
|
13
|
+
|
13
14
|
begin
|
14
15
|
@tracker = Tracker.for self
|
15
16
|
@tracker.track
|
@@ -32,7 +33,15 @@ module Landable
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
+
def untracked?
|
37
|
+
untracked_user? || untracked_path?
|
38
|
+
end
|
39
|
+
|
40
|
+
def untracked_user?
|
41
|
+
Landable.configuration.dnt_enabled && request.headers["DNT"] == "1"
|
42
|
+
end
|
43
|
+
|
44
|
+
def untracked_path?
|
36
45
|
Landable.configuration.untracked_paths.include? request.fullpath
|
37
46
|
end
|
38
47
|
end
|
data/lib/landable/version.rb
CHANGED
data/lib/schema_moves.rb
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
module SchemaMoves
|
2
|
+
module Helpers
|
3
|
+
def create_schema(schema)
|
4
|
+
connection = ActiveRecord::Base.connection
|
5
|
+
|
6
|
+
sql = %{
|
7
|
+
CREATE SCHEMA #{schema};
|
8
|
+
}
|
9
|
+
puts "Creating #{schema} schema"
|
10
|
+
connection.execute sql
|
11
|
+
end
|
12
|
+
|
13
|
+
def drop_schema(schema)
|
14
|
+
connection = ActiveRecord::Base.connection
|
15
|
+
|
16
|
+
sql = %{
|
17
|
+
DROP SCHEMA #{schema};
|
18
|
+
}
|
19
|
+
puts "Dropping #{schema} schema"
|
20
|
+
connection.execute sql
|
21
|
+
end
|
22
|
+
|
23
|
+
def move_objects(from_schema, to_schema, relkind, object_type)
|
24
|
+
connection = ActiveRecord::Base.connection
|
25
|
+
|
26
|
+
# move objects from public to new schema
|
27
|
+
objects = connection.select_all("
|
28
|
+
SELECT o.relname
|
29
|
+
FROM pg_class o
|
30
|
+
JOIN pg_namespace n
|
31
|
+
ON n.oid=o.relnamespace
|
32
|
+
AND n.nspname = '#{from_schema}'
|
33
|
+
AND o.relkind = '#{relkind}'
|
34
|
+
ORDER BY o.relname
|
35
|
+
")
|
36
|
+
|
37
|
+
objects.each do |object|
|
38
|
+
sql = %{
|
39
|
+
ALTER #{object_type} #{from_schema}.#{object['relname']}
|
40
|
+
SET SCHEMA #{to_schema}
|
41
|
+
}
|
42
|
+
puts "Moving #{from_schema}.#{object['relname']} TO #{to_schema}"
|
43
|
+
connection.execute sql
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_new_triggers(new_schema)
|
48
|
+
connection = ActiveRecord::Base.connection
|
49
|
+
sql = %{
|
50
|
+
CREATE FUNCTION #{new_schema}.tg_disallow()
|
51
|
+
RETURNS TRIGGER
|
52
|
+
AS
|
53
|
+
$TRIGGER$
|
54
|
+
BEGIN
|
55
|
+
|
56
|
+
IF TG_LEVEL <> 'STATEMENT' THEN
|
57
|
+
RAISE EXCEPTION $$You should use a statement-level trigger (trigger %, table %)$$, TG_NAME, TG_RELID::regclass;
|
58
|
+
END IF;
|
59
|
+
|
60
|
+
RAISE EXCEPTION $$%s are not allowed on table %$$, TG_OP, TG_RELNAME;
|
61
|
+
|
62
|
+
RETURN NULL;
|
63
|
+
|
64
|
+
END
|
65
|
+
$TRIGGER$
|
66
|
+
LANGUAGE plpgsql;
|
67
|
+
|
68
|
+
CREATE FUNCTION #{new_schema}.template_revision_ordinal()
|
69
|
+
RETURNS TRIGGER
|
70
|
+
AS
|
71
|
+
$TRIGGER$
|
72
|
+
BEGIN
|
73
|
+
|
74
|
+
IF NEW.ordinal IS NOT NULL THEN
|
75
|
+
RAISE EXCEPTION $$Must not supply ordinal value manually.$$;
|
76
|
+
END IF;
|
77
|
+
|
78
|
+
NEW.ordinal = (SELECT COALESCE(MAX(ordinal)+1,1)
|
79
|
+
FROM #{new_schema}.template_revisions
|
80
|
+
WHERE template_id = NEW.template_id);
|
81
|
+
|
82
|
+
RETURN NEW;
|
83
|
+
|
84
|
+
END
|
85
|
+
$TRIGGER$
|
86
|
+
LANGUAGE plpgsql;
|
87
|
+
|
88
|
+
CREATE TRIGGER #{new_schema}_template_revisions__bfr_insert
|
89
|
+
BEFORE INSERT ON #{new_schema}.template_revisions
|
90
|
+
FOR EACH ROW EXECUTE PROCEDURE #{new_schema}.template_revision_ordinal();
|
91
|
+
|
92
|
+
CREATE TRIGGER #{new_schema}_template_revisions__no_delete
|
93
|
+
BEFORE DELETE ON #{new_schema}.template_revisions
|
94
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
95
|
+
|
96
|
+
CREATE TRIGGER #{new_schema}_template_revisions__no_update
|
97
|
+
BEFORE UPDATE OF notes, is_minor, template_id, author_id, created_at, ordinal ON #{new_schema}.template_revisions
|
98
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
99
|
+
|
100
|
+
CREATE FUNCTION #{new_schema}.pages_revision_ordinal()
|
101
|
+
RETURNS TRIGGER
|
102
|
+
AS
|
103
|
+
$TRIGGER$
|
104
|
+
BEGIN
|
105
|
+
|
106
|
+
IF NEW.ordinal IS NOT NULL THEN
|
107
|
+
RAISE EXCEPTION $$Must not supply ordinal value manually.$$;
|
108
|
+
END IF;
|
109
|
+
|
110
|
+
NEW.ordinal = (SELECT COALESCE(MAX(ordinal)+1,1)
|
111
|
+
FROM #{new_schema}.page_revisions
|
112
|
+
WHERE page_id = NEW.page_id);
|
113
|
+
|
114
|
+
RETURN NEW;
|
115
|
+
|
116
|
+
END
|
117
|
+
$TRIGGER$
|
118
|
+
LANGUAGE plpgsql;
|
119
|
+
|
120
|
+
CREATE TRIGGER #{new_schema}_page_revisions__bfr_insert
|
121
|
+
BEFORE INSERT ON #{new_schema}.page_revisions
|
122
|
+
FOR EACH ROW EXECUTE PROCEDURE #{new_schema}.pages_revision_ordinal();
|
123
|
+
|
124
|
+
CREATE TRIGGER #{new_schema}_page_revisions__no_delete
|
125
|
+
BEFORE DELETE ON #{new_schema}.page_revisions
|
126
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
127
|
+
|
128
|
+
CREATE TRIGGER #{new_schema}_page_revisions__no_update
|
129
|
+
BEFORE UPDATE OF notes, is_minor, page_id, author_id, created_at, ordinal ON #{new_schema}.page_revisions
|
130
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
131
|
+
}
|
132
|
+
puts "Creating new triggers..."
|
133
|
+
connection.execute sql
|
134
|
+
end
|
135
|
+
|
136
|
+
def drop_old_triggers(old_schema, new_schema)
|
137
|
+
connection = ActiveRecord::Base.connection
|
138
|
+
sql = %{
|
139
|
+
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__bfr_insert ON #{new_schema}.page_revisions;
|
140
|
+
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__no_delete ON #{new_schema}.page_revisions;
|
141
|
+
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__no_update ON #{new_schema}.page_revisions;
|
142
|
+
|
143
|
+
DROP TRIGGER IF EXISTS #{old_schema}_template_revisions__bfr_insert ON #{new_schema}.template_revisions;
|
144
|
+
DROP TRIGGER IF EXISTS #{old_schema}_template_revisions__no_delete ON #{new_schema}.template_revisions;
|
145
|
+
DROP TRIGGER IF EXISTS #{old_schema}_template_revisions__no_update ON #{new_schema}.template_revisions;
|
146
|
+
|
147
|
+
DROP FUNCTION IF EXISTS #{old_schema}.pages_revision_ordinal();
|
148
|
+
DROP FUNCTION IF EXISTS #{old_schema}.template_revision_ordinal();
|
149
|
+
DROP FUNCTION IF EXISTS #{old_schema}.tg_disallow();
|
150
|
+
}
|
151
|
+
puts "Dropping old triggers..."
|
152
|
+
connection.execute sql
|
153
|
+
end
|
154
|
+
|
155
|
+
def ask(*args, &block)
|
156
|
+
HighLine.new.ask(*args, &block)
|
157
|
+
end
|
158
|
+
|
159
|
+
def get_schema_names(new = true)
|
160
|
+
# Always get old schemas
|
161
|
+
@old_landable = ask("Enter the OLD main landable schema: ") { |q| q.default = 'landable' }
|
162
|
+
@old_traffic = ask("Enter the OLD traffic schema: ") { |q| q.default = 'landable_traffic' }
|
163
|
+
|
164
|
+
# Only ask for new names if new == true
|
165
|
+
if new
|
166
|
+
@new_landable = ask("Enter the NEW main landable schema: ") { |q| q.default = "#{appname}_landable" }
|
167
|
+
@new_traffic = ask("Enter the NEW traffic schema: ") { |q| q.default = "#{appname}_landable_traffic" }
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def create_schemas
|
172
|
+
create_schema @new_landable
|
173
|
+
create_schema @new_traffic
|
174
|
+
end
|
175
|
+
|
176
|
+
def migrate_objects
|
177
|
+
# move_tables
|
178
|
+
move_objects(@old_landable, @new_landable, 'r', 'TABLE')
|
179
|
+
move_objects(@old_traffic, @new_traffic, 'r', 'TABLE')
|
180
|
+
# move_sequences
|
181
|
+
move_objects(@old_landable, @new_landable, 's', 'SEQUENCE')
|
182
|
+
move_objects(@old_traffic, @new_traffic, 's', 'SEQUENCE')
|
183
|
+
# move_views
|
184
|
+
move_objects(@old_landable, @new_landable, 'v', 'TABLE')
|
185
|
+
move_objects(@old_traffic, @new_traffic, 'v', 'TABLE')
|
186
|
+
# move_triggers
|
187
|
+
create_new_triggers(@new_landable)
|
188
|
+
drop_old_triggers(@old_landable, @new_landable)
|
189
|
+
end
|
190
|
+
|
191
|
+
def drop_old_schemas
|
192
|
+
drop_schema @old_landable
|
193
|
+
drop_schema @old_traffic
|
194
|
+
end
|
195
|
+
|
196
|
+
def want_to_drop_old_schemas?
|
197
|
+
drop = nil
|
198
|
+
until ['yes', 'no'].include?(drop.to_s.downcase)
|
199
|
+
drop = ask("Would you like to drop the old schemas? (Yes or No)") { |q| q.default = 'no' }
|
200
|
+
end
|
201
|
+
drop.to_s.downcase == 'yes'
|
202
|
+
end
|
203
|
+
|
204
|
+
def appname
|
205
|
+
Rails.application.class.parent_name.underscore
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'highline'
|
2
|
+
|
3
|
+
require_dependency 'schema_moves'
|
4
|
+
include SchemaMoves::Helpers
|
5
|
+
|
1
6
|
namespace :landable do
|
2
7
|
namespace :data do
|
3
8
|
desc "Clean & restore database from specified source"
|
@@ -20,147 +25,18 @@ namespace :landable do
|
|
20
25
|
end
|
21
26
|
|
22
27
|
desc "Migrates all to new schema"
|
23
|
-
task
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Rake.application.invoke_task("landable:data:create_schemas")
|
30
|
-
Rake.application.invoke_task("landable:data:move_tables")
|
31
|
-
Rake.application.invoke_task("landable:data:move_sequences")
|
32
|
-
Rake.application.invoke_task("landable:data:move_triggers")
|
33
|
-
end
|
34
|
-
|
35
|
-
desc "Creates the new schemas"
|
36
|
-
task create_schemas: :environment do
|
37
|
-
create_schema("#{@new_landable}")
|
38
|
-
create_schema("#{@new_traffic}")
|
39
|
-
end
|
40
|
-
|
41
|
-
desc "Move tables to new db schema"
|
42
|
-
task move_tables: :environment do
|
43
|
-
move_objects("#{@old_landable}", "#{@new_landable}", 'r', 'TABLE')
|
44
|
-
move_objects("#{@old_traffic}", "#{@new_traffic}", 'r', 'TABLE')
|
45
|
-
end
|
46
|
-
|
47
|
-
desc "Move sequences to new db schema"
|
48
|
-
task move_sequences: :environment do
|
49
|
-
move_objects("#{@old_landable}", "#{@new_landable}", 'S', 'SEQUENCE')
|
50
|
-
move_objects("#{@old_traffic}", "#{@new_traffic}", 'S', 'SEQUENCE')
|
28
|
+
task move_schemas: :environment do
|
29
|
+
get_schema_names
|
30
|
+
create_schemas
|
31
|
+
migrate_objects
|
32
|
+
drop_old_schemas if want_to_drop_old_schemas?
|
51
33
|
end
|
52
34
|
|
53
|
-
desc "
|
54
|
-
task
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def create_schema(schema)
|
62
|
-
connection = ActiveRecord::Base.connection
|
63
|
-
|
64
|
-
sql = %{
|
65
|
-
CREATE SCHEMA #{schema};
|
66
|
-
}
|
67
|
-
puts "Creating #{schema} schema"
|
68
|
-
connection.execute sql
|
69
|
-
end
|
70
|
-
|
71
|
-
def move_objects(from_schema, to_schema, relkind, object_type)
|
72
|
-
connection = ActiveRecord::Base.connection
|
73
|
-
|
74
|
-
# move objects from public to new schema
|
75
|
-
objects = connection.select_all("
|
76
|
-
SELECT o.relname
|
77
|
-
FROM pg_class o
|
78
|
-
JOIN pg_namespace n
|
79
|
-
ON n.oid=o.relnamespace
|
80
|
-
AND n.nspname = '#{from_schema}'
|
81
|
-
AND o.relkind = '#{relkind}'
|
82
|
-
ORDER BY o.relname
|
83
|
-
")
|
84
|
-
|
85
|
-
objects.each do |object|
|
86
|
-
sql = %{
|
87
|
-
ALTER #{object_type} #{from_schema}.#{object['relname']}
|
88
|
-
SET SCHEMA #{to_schema}
|
89
|
-
}
|
90
|
-
puts "Moving #{from_schema}.#{object['relname']} TO #{to_schema}"
|
91
|
-
connection.execute sql
|
35
|
+
desc "Drop the old schemas"
|
36
|
+
task drop_schemas: :environment do
|
37
|
+
get_schema_names false
|
38
|
+
drop_old_schemas if want_to_drop_old_schemas?
|
92
39
|
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def create_new_triggers(new_schema)
|
96
|
-
puts "#{new_schema}"
|
97
|
-
connection = ActiveRecord::Base.connection
|
98
|
-
sql = %{
|
99
|
-
CREATE FUNCTION #{new_schema}.pages_revision_ordinal()
|
100
|
-
RETURNS TRIGGER
|
101
|
-
AS
|
102
|
-
$TRIGGER$
|
103
|
-
BEGIN
|
104
|
-
|
105
|
-
IF NEW.ordinal IS NOT NULL THEN
|
106
|
-
RAISE EXCEPTION $$Must not supply ordinal value manually.$$;
|
107
|
-
END IF;
|
108
|
-
|
109
|
-
NEW.ordinal = (SELECT COALESCE(MAX(ordinal)+1,1)
|
110
|
-
FROM #{new_schema}.page_revisions
|
111
|
-
WHERE page_id = NEW.page_id);
|
112
|
-
|
113
|
-
RETURN NEW;
|
114
|
-
|
115
|
-
END
|
116
|
-
$TRIGGER$
|
117
|
-
LANGUAGE plpgsql;
|
118
|
-
|
119
|
-
CREATE TRIGGER #{new_schema}_page_revisions__bfr_insert
|
120
|
-
BEFORE INSERT ON #{new_schema}.page_revisions
|
121
|
-
FOR EACH ROW EXECUTE PROCEDURE #{new_schema}.pages_revision_ordinal();
|
122
|
-
|
123
|
-
CREATE FUNCTION #{new_schema}.tg_disallow()
|
124
|
-
RETURNS TRIGGER
|
125
|
-
AS
|
126
|
-
$TRIGGER$
|
127
|
-
BEGIN
|
128
|
-
|
129
|
-
IF TG_LEVEL <> 'STATEMENT' THEN
|
130
|
-
RAISE EXCEPTION $$You should use a statement-level trigger (trigger %, table %)$$, TG_NAME, TG_RELID::regclass;
|
131
|
-
END IF;
|
132
|
-
|
133
|
-
RAISE EXCEPTION $$%s are not allowed on table %$$, TG_OP, TG_RELNAME;
|
134
|
-
|
135
|
-
RETURN NULL;
|
136
|
-
|
137
|
-
END
|
138
|
-
$TRIGGER$
|
139
|
-
LANGUAGE plpgsql;
|
140
|
-
|
141
|
-
CREATE TRIGGER #{new_schema}_page_revisions__no_delete
|
142
|
-
BEFORE DELETE ON #{new_schema}.page_revisions
|
143
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
144
|
-
|
145
|
-
CREATE TRIGGER #{new_schema}_page_revisions__no_update
|
146
|
-
BEFORE UPDATE OF notes, is_minor, page_id, author_id, created_at, ordinal ON #{new_schema}.page_revisions
|
147
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE #{new_schema}.tg_disallow();
|
148
|
-
}
|
149
|
-
puts "Creating new triggers..."
|
150
|
-
connection.execute sql
|
151
|
-
end
|
152
|
-
|
153
|
-
def drop_old_triggers(old_schema, new_schema)
|
154
|
-
connection = ActiveRecord::Base.connection
|
155
|
-
sql = %{
|
156
|
-
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__bfr_insert ON #{new_schema}.page_revisions;
|
157
|
-
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__no_delete ON #{new_schema}.page_revisions;
|
158
|
-
DROP TRIGGER IF EXISTS #{old_schema}_page_revisions__no_update ON #{new_schema}.page_revisions;
|
159
40
|
|
160
|
-
DROP FUNCTION IF EXISTS #{old_schema}.pages_revision_ordinal();
|
161
|
-
DROP FUNCTION IF EXISTS #{old_schema}.tg_disallow();
|
162
|
-
}
|
163
|
-
puts "Dropping old triggers..."
|
164
|
-
connection.execute sql
|
165
41
|
end
|
166
|
-
end
|
42
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
I am a partial, hear me roar!
|
@@ -6,7 +6,7 @@ module Landable
|
|
6
6
|
describe Layout do
|
7
7
|
it "creates themes" do
|
8
8
|
Theme.destroy_all
|
9
|
-
expect { described_class.all.each(&:to_theme) }.to change { Theme.count }.by(
|
9
|
+
expect { described_class.all.each(&:to_theme) }.to change { Theme.count }.by(3)
|
10
10
|
end
|
11
11
|
|
12
12
|
it "defaults attributes" do
|
@@ -21,5 +21,15 @@ module Landable
|
|
21
21
|
|
22
22
|
theme.body.should == File.read(Rails.root.join('app/views/layouts/application.html.erb'))
|
23
23
|
end
|
24
|
+
|
25
|
+
context 'File Finding' do
|
26
|
+
it 'will find the correct application files' do
|
27
|
+
Layout.files.any? { |f| f.end_with?('application.haml') }.should be_true
|
28
|
+
Layout.files.any? { |f| f.end_with?('application.html.erb') }.should be_true
|
29
|
+
Layout.files.any? { |f| f.end_with?('priority.html.erb') }.should be_true
|
30
|
+
Layout.files.any? { |f| f.end_with?('_partial.html.haml') }.should be_false
|
31
|
+
Layout.files.any? { |f| f.end_with?('partial.html.haml') }.should be_false
|
32
|
+
end
|
33
|
+
end
|
24
34
|
end
|
25
35
|
end
|
@@ -89,6 +89,30 @@ module Landable
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
context 'user_agent' do
|
93
|
+
describe '#get_user_agent' do
|
94
|
+
context 'user agent provided' do
|
95
|
+
let(:user_agent) { Landable::Traffic::UserAgent.new(user_agent: 'dummy_user_agent') }
|
96
|
+
|
97
|
+
it 'should return the user agent' do
|
98
|
+
tracker = Landable::Traffic::UserTracker.new controller
|
99
|
+
tracker.stub(:user_agent) { user_agent }
|
100
|
+
|
101
|
+
tracker.send(:get_user_agent).should == user_agent
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'user agent not provided' do
|
106
|
+
it 'should return the user agent' do
|
107
|
+
tracker = Landable::Traffic::UserTracker.new controller
|
108
|
+
tracker.stub(:user_agent) { nil }
|
109
|
+
|
110
|
+
tracker.send(:get_user_agent).should be_nil
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
92
116
|
context 'no referer' do
|
93
117
|
let(:visit) { double('visit', { referer: nil }) }
|
94
118
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: landable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Team Trogdor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11
|
11
|
+
date: 2014-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: active_model_serializers
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.8.3
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.8.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: carrierwave
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: liquid
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 2.6.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 2.6.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: fog
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - '>'
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 0.4.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: highline
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: pg
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -298,8 +312,10 @@ extensions: []
|
|
298
312
|
extra_rdoc_files: []
|
299
313
|
files:
|
300
314
|
- .gitignore
|
315
|
+
- .hound.yml
|
301
316
|
- .rbenv-gemsets
|
302
317
|
- .rspec
|
318
|
+
- .ruby.yml
|
303
319
|
- .travis.yml
|
304
320
|
- CHANGELOG.md
|
305
321
|
- Gemfile
|
@@ -526,6 +542,7 @@ files:
|
|
526
542
|
- lib/landable/traffic/tracker.rb
|
527
543
|
- lib/landable/traffic/user_tracker.rb
|
528
544
|
- lib/landable/version.rb
|
545
|
+
- lib/schema_moves.rb
|
529
546
|
- lib/tasks/landable/cucumber.rake
|
530
547
|
- lib/tasks/landable/data.rake
|
531
548
|
- lib/tasks/landable/pgtap.rake
|
@@ -568,6 +585,8 @@ files:
|
|
568
585
|
- spec/dummy/app/mailers/.keep
|
569
586
|
- spec/dummy/app/models/.keep
|
570
587
|
- spec/dummy/app/models/concerns/.keep
|
588
|
+
- spec/dummy/app/views/layouts/_partial.html.haml
|
589
|
+
- spec/dummy/app/views/layouts/application.haml
|
571
590
|
- spec/dummy/app/views/layouts/application.html.erb
|
572
591
|
- spec/dummy/app/views/layouts/priority.html.erb
|
573
592
|
- spec/dummy/app/views/partials/_foobazz.html
|
@@ -659,12 +678,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
659
678
|
version: '0'
|
660
679
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
661
680
|
requirements:
|
662
|
-
- - '
|
681
|
+
- - '>='
|
663
682
|
- !ruby/object:Gem::Version
|
664
|
-
version:
|
683
|
+
version: '0'
|
665
684
|
requirements: []
|
666
685
|
rubyforge_project:
|
667
|
-
rubygems_version: 2.
|
686
|
+
rubygems_version: 2.0.14
|
668
687
|
signing_key:
|
669
688
|
specification_version: 4
|
670
689
|
summary: Mountable CMS engine for Rails
|
@@ -724,6 +743,8 @@ test_files:
|
|
724
743
|
- spec/dummy/app/mailers/.keep
|
725
744
|
- spec/dummy/app/models/.keep
|
726
745
|
- spec/dummy/app/models/concerns/.keep
|
746
|
+
- spec/dummy/app/views/layouts/_partial.html.haml
|
747
|
+
- spec/dummy/app/views/layouts/application.haml
|
727
748
|
- spec/dummy/app/views/layouts/application.html.erb
|
728
749
|
- spec/dummy/app/views/layouts/priority.html.erb
|
729
750
|
- spec/dummy/app/views/partials/_foobazz.html
|