pageflow-chart 2.1.0 → 2.4.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +12 -8
  4. data/README.md +2 -2
  5. data/app/assets/javascripts/pageflow/chart/consent.js +16 -0
  6. data/app/assets/javascripts/pageflow/chart/editor/config.js +7 -0
  7. data/app/assets/javascripts/pageflow/chart/editor/models/scraped_site.js +11 -50
  8. data/app/assets/javascripts/pageflow/chart/editor/views/configuration_editor.js +6 -4
  9. data/app/assets/javascripts/pageflow/chart/editor/views/embedded/iframe_embedded_view.js +32 -16
  10. data/app/assets/javascripts/pageflow/chart/editor/views/inputs/scraped_url_input_view.js +18 -39
  11. data/app/assets/javascripts/pageflow/chart/editor.js +4 -3
  12. data/app/assets/javascripts/pageflow/chart/page_type.js +61 -53
  13. data/app/assets/javascripts/pageflow/chart.js +2 -3
  14. data/app/assets/stylesheets/pageflow/chart/editor.scss +3 -20
  15. data/app/assets/stylesheets/pageflow/chart/themes/default.scss +3 -0
  16. data/app/assets/stylesheets/pageflow/chart.scss +9 -16
  17. data/app/helpers/pageflow/chart/scraped_sites_helper.rb +17 -8
  18. data/app/jobs/pageflow/chart/scrape_site_job.rb +14 -4
  19. data/app/models/pageflow/chart/scraped_site.rb +37 -4
  20. data/app/views/pageflow/chart/editor/scraped_sites/_scraped_site.json.jbuilder +1 -0
  21. data/app/views/pageflow/chart/page.html.erb +9 -2
  22. data/chart.gemspec +2 -2
  23. data/config/locales/de.yml +4 -0
  24. data/config/locales/en.yml +4 -0
  25. data/db/migrate/20190531141820_add_file_attributes_to_scraped_sites.rb +8 -0
  26. data/db/migrate/20190531145431_insert_file_usages_for_scraped_sites.rb +59 -0
  27. data/db/migrate/20200507141608_add_javascript_body_attachment_to_scraped_site.rb +5 -0
  28. data/lib/pageflow/chart/configuration.rb +6 -3
  29. data/lib/pageflow/chart/downloader.rb +4 -1
  30. data/lib/pageflow/chart/page_type.rb +17 -0
  31. data/lib/pageflow/chart/plugin.rb +10 -0
  32. data/lib/pageflow/chart/refresh_tag_following_downloader.rb +3 -3
  33. data/lib/pageflow/chart/scraper.rb +25 -13
  34. data/lib/pageflow/chart/version.rb +1 -1
  35. data/lib/pageflow/chart.rb +4 -0
  36. data/spec/factories/scraped_sites.rb +17 -3
  37. data/spec/fixtures/all.css +3 -0
  38. data/spec/fixtures/all.js +1 -0
  39. data/spec/fixtures/all_body.js +1 -0
  40. data/spec/fixtures/data.csv +1 -0
  41. data/spec/fixtures/index.html +7 -0
  42. data/spec/helpers/pageflow/chart/scraped_sites_helper_spec.rb +59 -0
  43. data/spec/integration/file_type_spec.rb +10 -0
  44. data/spec/jobs/pageflow/chart/scrape_site_job_spec.rb +14 -1
  45. data/spec/models/pageflow/chart/scraped_site_spec.rb +54 -0
  46. data/spec/pageflow/chart/downloader_spec.rb +13 -3
  47. data/spec/pageflow/chart/refresh_tag_following_downloader_spec.rb +23 -10
  48. data/spec/pageflow/chart/scraper_spec.rb +201 -63
  49. metadata +28 -20
  50. data/app/assets/javascripts/pageflow/chart/editor/collections/scraped_sites_collection.js +0 -23
  51. data/app/assets/javascripts/pageflow/chart/editor/initializers/setup_collections.js +0 -1
  52. data/app/assets/javascripts/pageflow/chart/editor/templates/scraped_site_status.jst.ejs +0 -2
  53. data/app/assets/javascripts/pageflow/chart/editor/templates/url_input.jst.ejs +0 -7
  54. data/app/assets/javascripts/pageflow/chart/editor/views/scraped_site_status_view.js +0 -18
  55. data/app/controllers/pageflow/chart/application_controller.rb +0 -6
  56. data/app/controllers/pageflow/chart/scraped_sites_controller.rb +0 -25
  57. data/config/routes.rb +0 -3
  58. data/spec/controllers/pageflow/chart/scraped_sites_controller_spec.rb +0 -35
  59. data/spec/requests/scraping_site_spec.rb +0 -23
@@ -8,7 +8,8 @@ module Pageflow
8
8
  def perform_with_result(scraped_site,
9
9
  _options = {},
10
10
  downloader: downloader_for(scraped_site))
11
- downloader.load_following_refresh_tags(scraped_site.url) do |file|
11
+ downloader.load_following_refresh_tags(scraped_site.url,
12
+ raise_on_http_error: true) do |file|
12
13
  scraper = Scraper.new(file.read, Chart.config.scraper_options)
13
14
  scraped_site.html_file = StringIOWithContentType.new(
14
15
  scraper.html,
@@ -16,11 +17,18 @@ module Pageflow
16
17
  content_type: 'text/html'
17
18
  )
18
19
 
19
- downloader.load_all(scraper.javascript_urls,
20
+ downloader.load_all(scraper.javascript_urls_in_head,
20
21
  extension: '.js',
21
22
  before_each: begin_try_catch,
22
- after_each: end_try_catch) do |javascript_file|
23
- scraped_site.javascript_file = javascript_file
23
+ after_each: end_try_catch) do |javascript_head_file|
24
+ scraped_site.javascript_file = javascript_head_file
25
+ end
26
+
27
+ downloader.load_all(scraper.javascript_urls_in_body,
28
+ extension: '.js',
29
+ before_each: begin_try_catch,
30
+ after_each: end_try_catch) do |javascript_body_file|
31
+ scraped_site.javascript_body_file = javascript_body_file
24
32
  end
25
33
 
26
34
  downloader.load_all(scraper.stylesheet_urls,
@@ -35,6 +43,8 @@ module Pageflow
35
43
  end
36
44
 
37
45
  :ok
46
+ rescue Downloader::HTTPError
47
+ :error
38
48
  end
39
49
 
40
50
  private
@@ -1,12 +1,16 @@
1
1
  module Pageflow
2
2
  module Chart
3
3
  class ScrapedSite < ActiveRecord::Base
4
+ include Pageflow::ReusableFile
5
+
4
6
  has_attached_file :javascript_file, Chart.config.paperclip_options(extension: 'js')
7
+ has_attached_file :javascript_body_file, Chart.config.paperclip_options(basename: 'all_body', extension: 'js')
5
8
  has_attached_file :stylesheet_file, Chart.config.paperclip_options(extension: 'css')
6
9
  has_attached_file :html_file, Chart.config.paperclip_options(extension: 'html')
7
10
  has_attached_file :csv_file, Chart.config.paperclip_options(basename: 'data', extension: 'csv')
8
11
 
9
12
  do_not_validate_attachment_file_type(:javascript_file)
13
+ do_not_validate_attachment_file_type(:javascript_body_file)
10
14
  do_not_validate_attachment_file_type(:stylesheet_file)
11
15
  do_not_validate_attachment_file_type(:html_file)
12
16
  do_not_validate_attachment_file_type(:csv_file)
@@ -23,6 +27,10 @@ module Pageflow
23
27
  transition 'unprocessed' => 'processing'
24
28
  end
25
29
 
30
+ event :skip_reprocessing_imported_site do
31
+ transition 'unprocessed' => 'processed'
32
+ end
33
+
26
34
  event :reprocess do
27
35
  transition 'processed' => 'processing'
28
36
  transition 'processing_failed' => 'processing'
@@ -44,10 +52,6 @@ module Pageflow
44
52
  URI.join(url, 'data.csv').to_s
45
53
  end
46
54
 
47
- def as_json(*)
48
- super.merge(html_file_url: html_file_url)
49
- end
50
-
51
55
  def html_file_url
52
56
  return unless html_file.try(:path)
53
57
  if Chart.config.scraped_sites_root_url.present?
@@ -56,6 +60,35 @@ module Pageflow
56
60
  html_file.url
57
61
  end
58
62
  end
63
+
64
+ # ReusableFile-overrides:
65
+ def url
66
+ read_attribute(:url)
67
+ end
68
+
69
+ def retryable?
70
+ processing_failed?
71
+ end
72
+
73
+ def ready?
74
+ processed?
75
+ end
76
+
77
+ def publish!
78
+ if html_file.present?
79
+ skip_reprocessing_imported_site!
80
+ else
81
+ process!
82
+ end
83
+ end
84
+
85
+ def retry!
86
+ reprocess!
87
+ end
88
+
89
+ def attachments_for_export
90
+ [javascript_file, javascript_body_file, stylesheet_file, html_file, csv_file]
91
+ end
59
92
  end
60
93
  end
61
94
  end
@@ -0,0 +1 @@
1
+ json.call(scraped_site, :url, :html_file_url, :use_custom_theme)
@@ -7,9 +7,16 @@
7
7
 
8
8
  <div class="content">
9
9
  <div class="iframeWrapper">
10
- <%= scraped_site_iframe(configuration['scraped_site_id']) %>
11
- <div class="iframe_overlay"></div>
10
+ <%= scraped_site_iframe(configuration) %>
11
+ <%= third_party_embed_opt_in(
12
+ entry: entry,
13
+ vendor_name: 'datawrapper',
14
+ message: t('pageflow.public.chart.opt_in_prompt')
15
+ ) %>
12
16
  <div class="bigscreen_toggler" tabindex="4" title="<%= t('pageflow.public.chart.toggle') %>"><%= t('pageflow.public.chart.toggle') %></div>
17
+ <div class="opt_out_wrapper">
18
+ <%= third_party_embed_opt_out_info(entry) %>
19
+ </div>
13
20
  </div>
14
21
  <div class="scroller">
15
22
  <div>
data/chart.gemspec CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.required_ruby_version = '~> 2.1'
20
20
 
21
- spec.add_runtime_dependency 'pageflow', '~> 14.x'
21
+ spec.add_runtime_dependency 'pageflow', '~> 15.7.x'
22
22
  spec.add_runtime_dependency 'nokogiri', '~> 1.0'
23
23
  spec.add_runtime_dependency 'pageflow-public-i18n', '~> 1.0'
24
24
 
25
- spec.add_development_dependency 'pageflow-support', '~> 14.x'
25
+ spec.add_development_dependency 'pageflow-support', '~> 15.x'
26
26
  spec.add_development_dependency 'bundler', ['>= 1.0', '< 3']
27
27
  spec.add_development_dependency 'rake', '~> 12.0'
28
28
  spec.add_development_dependency 'rspec-rails', '~> 3.0'
@@ -31,6 +31,8 @@ de:
31
31
 
32
32
  Typische Anwendungsbeispiele: Statistiken, Diagramme, Zahlen&Fakten
33
33
  page_attributes:
34
+ chart_url:
35
+ label: Diagramm URL
34
36
  full_width:
35
37
  inline_help: Verbreitert das Diagramm, so dass es die maximal verfügbare Breite nutzt.
36
38
  label: Gesamte Breite nutzen
@@ -39,3 +41,5 @@ de:
39
41
  page_type_category_name: Daten und Diagramme
40
42
  page_type_description: Einbindung von Diagrammen, die mit Datawrapper erstellt wurden
41
43
  page_type_name: Diagramm
44
+ chart_embed_opt_in:
45
+ feature_name: Opt-In für Datawrapper Embeds
@@ -17,6 +17,8 @@ en:
17
17
  menu_item: Chart
18
18
  text: "# Chart\n\nIntegration of a Datawrapper-Diagram\n\nHere you can add animated infographics to your Pageflow. The diagram is embedded into a background-picture/video and text. To enlarge the graphic you simply have to click on it. \n\nBut first of all you have to create your graphic externally and generate a link. You can find examples and requirements for this under www.datawrapper.de.\n\nNote that Datawrapper offers a special layout option for charts that shall be embedded into a Pageflow: In the \"Visualize\" step of the chart creation wizard, click the \"Design\" tab and select the \"Pageflow\" layout. That way a color scheme is used which complements Pageflow's look.\n\nExamples of application: statistics, diagrams, numbers & facts"
19
19
  page_attributes:
20
+ chart_url:
21
+ label: Chart URL
20
22
  full_width:
21
23
  inline_help: Extends the chart to use the maximum width available.
22
24
  label: Use full width
@@ -25,3 +27,5 @@ en:
25
27
  page_type_category_name: Data and Charts
26
28
  page_type_description: Embedded Datawrapper chart
27
29
  page_type_name: Chart
30
+ chart_embed_opt_in:
31
+ feature_name: Opt-in for Datawrapper embeds
@@ -0,0 +1,8 @@
1
+ class AddFileAttributesToScrapedSites < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_reference :pageflow_chart_scraped_sites, :entry, index: true
4
+ add_column :pageflow_chart_scraped_sites, :rights, :string
5
+ add_column :pageflow_chart_scraped_sites, :parent_file_id, :integer
6
+ add_column :pageflow_chart_scraped_sites, :parent_file_model_type, :string
7
+ end
8
+ end
@@ -0,0 +1,59 @@
1
+ class InsertFileUsagesForScrapedSites < ActiveRecord::Migration[5.2]
2
+ # Pageflow models might have gotten out of sync with schema at this
3
+ # point. Use local models instead.
4
+ class MigratedPage < ActiveRecord::Base
5
+ self.table_name = 'pageflow_pages'
6
+
7
+ belongs_to :chapter, class_name: 'MigratedChapter'
8
+
9
+ serialize :configuration, JSON
10
+
11
+ def configuration
12
+ super || {}
13
+ end
14
+ end
15
+
16
+ class MigratedChapter < ActiveRecord::Base
17
+ self.table_name = 'pageflow_chapters'
18
+ belongs_to :storyline, class_name: 'MigratedStoryline'
19
+ end
20
+
21
+ class MigratedStoryline < ActiveRecord::Base
22
+ self.table_name = 'pageflow_storylines'
23
+ end
24
+
25
+ class MigratedFileUsage < ActiveRecord::Base
26
+ self.table_name = 'pageflow_file_usages'
27
+ end
28
+
29
+ def up
30
+ MigratedPage.where(template: 'chart').find_each do |page|
31
+ scraped_site_id = page.configuration['scraped_site_id']
32
+ next unless scraped_site_id
33
+
34
+ scraped_site = Pageflow::Chart::ScrapedSite.find_by_id(scraped_site_id)
35
+
36
+ unless scraped_site
37
+ puts "Scraped site #{scraped_site_id} not found"
38
+ next
39
+ end
40
+
41
+ revision_id = page&.chapter&.storyline&.revision_id
42
+
43
+ unless revision_id
44
+ puts "No revision_id for page #{page.id}"
45
+ next
46
+ end
47
+
48
+ MigratedFileUsage.create(file_id: scraped_site.id,
49
+ file_type: 'Pageflow::Chart::ScrapedSite',
50
+ revision_id: revision_id)
51
+ end
52
+ end
53
+
54
+ def down
55
+ MigratedFileUsage
56
+ .where(file_type: 'Pageflow::Chart::ScrapedSite')
57
+ .delete_all
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ class AddJavascriptBodyAttachmentToScrapedSite < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_attachment :pageflow_chart_scraped_sites, :javascript_body_file
4
+ end
5
+ end
@@ -22,6 +22,7 @@ module Pageflow
22
22
  #
23
23
  # @param [Hash] opts
24
24
  # @option opts [Array<Regexp>] :head_script_blacklist Script tags in page head are ignored if they match any of this list of regexes.
25
+ # @option opts [Array<Regexp>] :body_script_blacklist Script tags in page body are ignored if they match any of this list of regexes.
25
26
  # @option opts [Array<Regexp>] :inline_script_blacklist Inline script tags are ignored if they match any of this list of regexes.
26
27
  # @option opts [Array<String>] :selector_blacklist HTML-elements matched by selectors in this list will not be scraped.
27
28
  # @return [Hash]
@@ -55,6 +56,7 @@ module Pageflow
55
56
  def initialize
56
57
  @scraper_options = {
57
58
  head_script_blacklist: [/piwik/],
59
+ body_script_blacklist: [/piwik/],
58
60
  inline_script_blacklist: [/piwik/],
59
61
  selector_blacklist: ['body .noscript']
60
62
  }
@@ -62,9 +64,10 @@ module Pageflow
62
64
  @paperclip_base_path = ':pageflow_s3_root'
63
65
  @scraped_sites_root_url = nil
64
66
  @supported_hosts = [
65
- 'http://cf.datawrapper.de',
66
- 'http://datawrapper.dwcdn.de',
67
- 'http://datawrapper.dwcdn.net'
67
+ 'cf.datawrapper.de',
68
+ 'charts.datawrapper.de',
69
+ 'datawrapper.dwcdn.de',
70
+ 'datawrapper.dwcdn.net'
68
71
  ]
69
72
  @use_custom_theme = false
70
73
  @datawrapper_themes_with_transparent_background_support = ['pageflow']
@@ -6,15 +6,18 @@ module Pageflow
6
6
  class Downloader
7
7
  attr_reader :options
8
8
 
9
+ class HTTPError < StandardError; end
10
+
9
11
  def initialize(options = {})
10
12
  @options = options
11
13
  end
12
14
 
13
- def load(url)
15
+ def load(url, raise_on_http_error: false)
14
16
  file = open(make_absolute(url))
15
17
  yield(file)
16
18
  rescue OpenURI::HTTPError => exception
17
19
  Rails.logger.error "Exception loading url #{url}: #{exception.message}"
20
+ raise(HTTPError) if raise_on_http_error
18
21
  ensure
19
22
  file.close if file
20
23
  end
@@ -10,6 +10,23 @@ module Pageflow
10
10
  def json_seed_template
11
11
  'pageflow/chart/page_type.json.jbuilder'
12
12
  end
13
+
14
+ def file_types
15
+ [Chart.scraped_site_file_type]
16
+ end
17
+ end
18
+
19
+ def self.scraped_site_file_type
20
+ FileType.new(model: ScrapedSite,
21
+ editor_partial: 'pageflow/chart/editor/scraped_sites/scraped_site',
22
+ custom_attributes: {
23
+ url: {
24
+ permitted_create_param: true
25
+ },
26
+ use_custom_theme: {
27
+ permitted_create_param: false
28
+ }
29
+ })
13
30
  end
14
31
  end
15
32
  end
@@ -0,0 +1,10 @@
1
+ module Pageflow
2
+ module Chart
3
+ class Plugin < Pageflow::Plugin
4
+ def configure(config)
5
+ config.page_types.register(Chart.page_type)
6
+ config.features.register('chart_embed_opt_in')
7
+ end
8
+ end
9
+ end
10
+ end
@@ -9,15 +9,15 @@ module Pageflow
9
9
  class TooManyRedirects < StandardError; end
10
10
  class NoUrlInRefreshMetaTag < StandardError; end
11
11
 
12
- def load_following_refresh_tags(url, redirect_count = 0, &block)
13
- load(url) do |file|
12
+ def load_following_refresh_tags(url, options = {}, redirect_count = 0, &block)
13
+ load(url, options) do |file|
14
14
  if (redirect_url = find_refresh_meta_tag_url(file.read))
15
15
  if redirect_count >= MAX_REDIRECT_COUNT
16
16
  raise TooManyRedirects, 'Too many redirects via refresh meta tags.'
17
17
  end
18
18
 
19
19
  redirect_url = ensure_absolute(redirect_url, url)
20
- return load_following_refresh_tags(redirect_url, redirect_count + 1, &block)
20
+ return load_following_refresh_tags(redirect_url, options, redirect_count + 1, &block)
21
21
  end
22
22
 
23
23
  file.rewind
@@ -3,7 +3,11 @@ require 'nokogiri'
3
3
  module Pageflow
4
4
  module Chart
5
5
  class Scraper
6
- attr_reader :document, :options, :javascript_urls, :stylesheet_urls
6
+ attr_reader :document,
7
+ :options,
8
+ :javascript_urls_in_head,
9
+ :javascript_urls_in_body,
10
+ :stylesheet_urls
7
11
 
8
12
  def initialize(html, options = {})
9
13
  @document = Nokogiri::HTML(html)
@@ -23,14 +27,21 @@ module Pageflow
23
27
  private
24
28
 
25
29
  def parse
26
- parse_javascript_urls
30
+ parse_javascript_urls(:head)
31
+ parse_javascript_urls(:body)
27
32
  parse_stylesheet_urls
28
33
  end
29
34
 
30
- def parse_javascript_urls
31
- @javascript_urls = filtered_script_tags_in_head.map do |tag|
35
+ def parse_javascript_urls(container)
36
+ script_tags = filtered_script_tags_in(container).map do |tag|
32
37
  tag[:src]
33
38
  end
39
+
40
+ if container.eql?(:head)
41
+ @javascript_urls_in_head = script_tags
42
+ else
43
+ @javascript_urls_in_body = script_tags
44
+ end
34
45
  end
35
46
 
36
47
  def parse_stylesheet_urls
@@ -42,7 +53,8 @@ module Pageflow
42
53
  def rewrite
43
54
  filter_inline_scripts
44
55
  filter_by_selectors
45
- combine_script_tags_in_head
56
+ combine_script_tags_in(:head)
57
+ combine_script_tags_in(:body)
46
58
  combine_css_link_tags
47
59
  end
48
60
 
@@ -66,12 +78,12 @@ module Pageflow
66
78
  end
67
79
  end
68
80
 
69
- def combine_script_tags_in_head
70
- script_tags_to_remove = script_src_tags_in_head
81
+ def combine_script_tags_in(container)
82
+ script_tags_to_remove = script_src_tags_in(container)
71
83
  return if script_tags_to_remove.empty?
72
84
 
73
85
  all_script_src_tag = Nokogiri::XML::Node.new('script', document)
74
- all_script_src_tag[:src] = 'all.js'
86
+ all_script_src_tag[:src] = container.eql?(:head) ? 'all.js' : 'all_body.js'
75
87
  all_script_src_tag[:type] = 'text/javascript'
76
88
 
77
89
  script_tags_to_remove
@@ -91,16 +103,16 @@ module Pageflow
91
103
  document.at_css('head') << all_css_link_tag
92
104
  end
93
105
 
94
- def filtered_script_tags_in_head
95
- script_src_tags_in_head.reject do |tag|
96
- options.fetch(:head_script_blacklist, []).any? do |regexp|
106
+ def filtered_script_tags_in(container)
107
+ script_src_tags_in(container).reject do |tag|
108
+ options.fetch("#{container}_script_blacklist".to_sym, []).any? do |regexp|
97
109
  tag[:src] =~ regexp
98
110
  end
99
111
  end
100
112
  end
101
113
 
102
- def script_src_tags_in_head
103
- document.css('head script[src]')
114
+ def script_src_tags_in(container)
115
+ document.css("#{container} script[src]")
104
116
  end
105
117
 
106
118
  def css_link_tags
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
2
  module Chart
3
- VERSION = '2.1.0'.freeze
3
+ VERSION = '2.4.0'.freeze
4
4
  end
5
5
  end
@@ -10,6 +10,10 @@ module Pageflow
10
10
  block.call(config)
11
11
  end
12
12
 
13
+ def self.plugin
14
+ Chart::Plugin.new
15
+ end
16
+
13
17
  def self.page_type
14
18
  Chart::PageType.new
15
19
  end
@@ -1,5 +1,19 @@
1
- FactoryBot.define do
2
- factory :scraped_site, class: 'Pageflow::Chart::ScrapedSite' do
3
- url 'MyString'
1
+ module Pageflow
2
+ module Chart
3
+ FactoryBot.define do
4
+ factory :scraped_site, class: 'Pageflow::Chart::ScrapedSite' do
5
+ url { 'MyString' }
6
+
7
+ trait :processed do
8
+ state { 'processed' }
9
+
10
+ javascript_file { File.open(Engine.root.join('spec', 'fixtures', 'all.js')) }
11
+ javascript_body_file { File.open(Engine.root.join('spec', 'fixtures', 'all_body.js')) }
12
+ stylesheet_file { File.open(Engine.root.join('spec', 'fixtures', 'all.css')) }
13
+ html_file { File.open(Engine.root.join('spec', 'fixtures', 'index.html')) }
14
+ csv_file { File.open(Engine.root.join('spec', 'fixtures', 'data.csv')) }
15
+ end
16
+ end
17
+ end
4
18
  end
5
19
  end
@@ -0,0 +1,3 @@
1
+ .some {
2
+ color: #000
3
+ }
@@ -0,0 +1 @@
1
+ var chart = {};
@@ -0,0 +1 @@
1
+ var chart_body = {};
@@ -0,0 +1 @@
1
+ some,values
@@ -0,0 +1,7 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Title</title>
5
+ </head>
6
+ <body></body>
7
+ </html>
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pageflow/used_file_test_helper'
4
+
5
+ module Pageflow
6
+ module Chart
7
+ describe ScrapedSitesHelper do
8
+ include UsedFileTestHelper
9
+
10
+ before { Pageflow::Chart.config.use_custom_theme = false }
11
+
12
+ it 'renders iframe with data-src attribute for scraped site' do
13
+ scraped_site = create_used_file(:scraped_site, :processed)
14
+
15
+ html = scraped_site_iframe('scraped_site_id' => scraped_site.perma_id)
16
+
17
+ iframe = Capybara.string(html).find('iframe')
18
+ expect(iframe['data-src']).to match(%r{original/index\.html})
19
+ end
20
+
21
+ it 'renders no data-custom-theme attribute by default' do
22
+ scraped_site = create_used_file(:scraped_site, :processed)
23
+
24
+ html = scraped_site_iframe('scraped_site_id' => scraped_site.perma_id)
25
+
26
+ iframe = Capybara.string(html).find('iframe')
27
+ expect(iframe['data-use-custom-theme']).to be_blank
28
+ expect(iframe['data-customize-layout']).to eq('true')
29
+ end
30
+
31
+ it 'renders data-custom-theme if site has custom theme' do
32
+ Pageflow::Chart.config.use_custom_theme = true
33
+ scraped_site = create_used_file(:scraped_site, :processed)
34
+
35
+ html = scraped_site_iframe('scraped_site_id' => scraped_site.perma_id)
36
+
37
+ iframe = Capybara.string(html).find('iframe')
38
+ expect(iframe['data-use-custom-theme']).to eq('true')
39
+ expect(iframe['data-customize-layout']).to eq('true')
40
+ end
41
+
42
+ it 'renders iframe with data-src attribute for chart_url' do
43
+ html = scraped_site_iframe('chart_url' => 'https://example.com/chart')
44
+
45
+ iframe = Capybara.string(html).find('iframe')
46
+ expect(iframe['data-src']).to eq('//example.com/chart')
47
+ end
48
+
49
+ it 'renders no data-custom-theme attribute for chart_url' do
50
+ html = scraped_site_iframe('chart_url' => 'https://example.com/chart')
51
+
52
+ iframe = Capybara.string(html).find('iframe')
53
+
54
+ expect(iframe['data-customize-layout']).to be_blank
55
+ expect(iframe['data-use-custom-theme']).to be_blank
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require 'pageflow/lint'
3
+
4
+ module Pageflow
5
+ module Chart
6
+ Pageflow::Lint.file_type(:scraped_site,
7
+ create_file_type: -> { Chart.scraped_site_file_type },
8
+ create_file: -> { create(:scraped_site, :processed) })
9
+ end
10
+ end
@@ -12,10 +12,23 @@ module Pageflow
12
12
 
13
13
  allow(Scraper).to receive(:new).and_return(scraper)
14
14
 
15
- expect(downloader).to receive(:load_following_refresh_tags).with('http://example.com')
15
+ expect(downloader).to receive(:load_following_refresh_tags)
16
+ .with('http://example.com',
17
+ raise_on_http_error: true)
16
18
 
17
19
  job.perform_with_result(scraped_site, {}, downloader: downloader)
18
20
  end
21
+
22
+ it 'returns :error on HTTP error' do
23
+ job = ScrapeSiteJob.new
24
+ scraped_site = create(:scraped_site, url: 'http://example.com/a')
25
+
26
+ stub_request(:get, 'http://example.com/a').to_return(status: 404, body: '')
27
+
28
+ result = job.perform_with_result(scraped_site)
29
+
30
+ expect(result).to eq(:error)
31
+ end
19
32
  end
20
33
  end
21
34
  end