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 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