landable 1.10.0.rc2 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18ff721aa14c6fb5bde399c92457e4f074e6a226
4
- data.tar.gz: 0603e1abfdf22f19fa4ae7a5011014e29b1a4993
3
+ metadata.gz: 33e0d69e6891c96f2d1a009ef58a5a82ddc5f3a6
4
+ data.tar.gz: d5007db85e84798a12c6abf7e6d1c43548264556
5
5
  SHA512:
6
- metadata.gz: d70d1b346cc558a6692949556b11b44befe6ab2a8d2c62c447a86cd1b21ac457f64c8c703a51673350ddc6f2f778897cb7160f97ea5c680131194429b2d1772b
7
- data.tar.gz: d5afd864aa0cda1356c82fe5c0faf65105110ab418dae7e3db75a4ecdc7eb906d8b806b22fe66e8c64d4ded6bdbca256dc9d2f6a14248f8e69b70001a141a445
6
+ metadata.gz: 8e1199458a3de14521df62769d390e8fbc4fccac423a58903be15af167b99ca9855c2ab7765183d95e7c2b09ae7e0d98fac0aa879c8d7a09dc125eb8438d6594
7
+ data.tar.gz: f569cbfb3c711e2f2c2453eff742d1b8c4ca7498c9d5bf2ed0fc1b453fdcd5455fc193f9c0eeeb22f5a45bfa8577bcccb8978b4a10239c4e7fa3e3824137d8ff
data/.hound.yml ADDED
@@ -0,0 +1,4 @@
1
+ # Hound Configuration File -> https://houndci.com/configuration
2
+ ruby:
3
+ enabled: true
4
+ config_file: .ruby.yml
data/.ruby.yml ADDED
@@ -0,0 +1,10 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "spec/**/*"
4
+ - "db/**/*"
5
+
6
+ Style/StringLiterals:
7
+ EnforcedStyle: single_quotes
8
+ SupportedStyles:
9
+ - single_quotes
10
+ - double_quotes
data/.travis.yml CHANGED
@@ -28,3 +28,4 @@ script:
28
28
  notifications:
29
29
  # let enova know about the build
30
30
  slack: enova:xzPNLg3AxkbkUcUlfn7sqHW5
31
+ email: trogdor@enova.com
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.10.0.rc1...master)
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', '~> 0.8'
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
@@ -49,7 +49,14 @@ module Landable
49
49
  end
50
50
 
51
51
  def files
52
- paths.map { |path| Dir[path + "/**/[^_]*.html.*"] }.flatten
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
@@ -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 (request.headers["DNT"] || untracked_path)
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 untracked_path
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
@@ -121,6 +121,10 @@ module Landable
121
121
  @visit_id and PageView.where(visit_id: @visit_id).order(:page_view_id).first.try(:path)
122
122
  end
123
123
 
124
+ def get_user_agent
125
+ user_agent
126
+ end
127
+
124
128
  protected
125
129
  def cookies
126
130
  request.cookie_jar
@@ -1,10 +1,9 @@
1
1
  module Landable
2
2
  module VERSION
3
3
  MAJOR = 1
4
- MINOR = 10
4
+ MINOR = 11
5
5
  PATCH = 0
6
- PRE = 'rc2'
7
6
 
8
- STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
9
8
  end
10
9
  end
@@ -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 :move_schemas, :old_landable, :new_landable, :old_traffic, :new_traffic do |t, args|
24
- @old_landable = "#{args[:old_landable]}"
25
- @new_landable = "#{args[:new_landable]}"
26
- @old_traffic = "#{args[:old_traffic]}"
27
- @new_traffic = "#{args[:new_traffic]}"
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 "Move triggers to new db schema"
54
- task move_triggers: :environment do
55
- create_new_triggers("#{@new_landable}")
56
- drop_old_triggers("#{@old_landable}", "#{@new_landable}")
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!
@@ -0,0 +1,4 @@
1
+ !!!
2
+ %html{lang: 'en'}
3
+ %body
4
+ I am an awesome Theme :)
@@ -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(2)
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.10.0.rc2
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-04 00:00:00.000000000 Z
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: '0.8'
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: '0.8'
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: '0'
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: '0'
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: 1.3.1
683
+ version: '0'
665
684
  requirements: []
666
685
  rubyforge_project:
667
- rubygems_version: 2.2.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