pageflow-chart 0.1.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 (100) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +21 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Gemfile +10 -0
  5. data/README.md +91 -0
  6. data/Rakefile +20 -0
  7. data/app/assets/images/pageflow/chart/fs_close_sprite.png +0 -0
  8. data/app/assets/images/pageflow/chart_pictogram.png +0 -0
  9. data/app/assets/images/pageflow/chart_pictogram_small.png +0 -0
  10. data/app/assets/images/pageflow/chart_sprite.png +0 -0
  11. data/app/assets/images/pageflow/ov-chart.png +0 -0
  12. data/app/assets/javascripts/pageflow/chart.js +5 -0
  13. data/app/assets/javascripts/pageflow/chart/asset_urls.js.erb +3 -0
  14. data/app/assets/javascripts/pageflow/chart/editor.js +9 -0
  15. data/app/assets/javascripts/pageflow/chart/editor/collections/scraped_sites_collection.js +23 -0
  16. data/app/assets/javascripts/pageflow/chart/editor/initializers/setup_collections.js +1 -0
  17. data/app/assets/javascripts/pageflow/chart/editor/models/scraped_site.js +55 -0
  18. data/app/assets/javascripts/pageflow/chart/editor/templates/scraped_site_status.jst.ejs +2 -0
  19. data/app/assets/javascripts/pageflow/chart/editor/templates/url_input.jst.ejs +7 -0
  20. data/app/assets/javascripts/pageflow/chart/editor/views/configuration_editor.js +26 -0
  21. data/app/assets/javascripts/pageflow/chart/editor/views/embedded/iframe_embedded_view.js +47 -0
  22. data/app/assets/javascripts/pageflow/chart/editor/views/inputs/scraped_url_input_view.js +49 -0
  23. data/app/assets/javascripts/pageflow/chart/editor/views/scraped_site_status_view.js +18 -0
  24. data/app/assets/javascripts/pageflow/chart/page_type.js +152 -0
  25. data/app/assets/stylesheets/pageflow/chart.css.scss +130 -0
  26. data/app/assets/stylesheets/pageflow/chart/custom.css.scss +209 -0
  27. data/app/assets/stylesheets/pageflow/chart/editor.css.scss +17 -0
  28. data/app/assets/stylesheets/pageflow/chart/themes/default.css.scss +10 -0
  29. data/app/controllers/pageflow/chart/application_controller.rb +6 -0
  30. data/app/controllers/pageflow/chart/scraped_sites_controller.rb +25 -0
  31. data/app/helpers/pageflow/chart/scraped_sites_helper.rb +13 -0
  32. data/app/jobs/pageflow/chart/scrape_site_job.rb +59 -0
  33. data/app/models/pageflow/chart/scraped_site.rb +51 -0
  34. data/app/views/pageflow/chart/page.html +41 -0
  35. data/app/views/pageflow/chart/page_type.json.jbuilder +2 -0
  36. data/bin/rails +8 -0
  37. data/chart.gemspec +30 -0
  38. data/config/locales/de.yml +40 -0
  39. data/config/locales/en.yml +22 -0
  40. data/config/routes.rb +3 -0
  41. data/db/migrate/20140417112724_create_pageflow_chart_scraped_sites.rb +14 -0
  42. data/lib/pageflow/chart.rb +21 -0
  43. data/lib/pageflow/chart/configuration.rb +63 -0
  44. data/lib/pageflow/chart/downloader.rb +53 -0
  45. data/lib/pageflow/chart/engine.rb +17 -0
  46. data/lib/pageflow/chart/page_type.rb +15 -0
  47. data/lib/pageflow/chart/scraper.rb +107 -0
  48. data/spec/controllers/pageflow/chart/scraped_sites_controller_spec.rb +35 -0
  49. data/spec/dummy/README.rdoc +28 -0
  50. data/spec/dummy/Rakefile +6 -0
  51. data/spec/dummy/app/assets/images/.keep +0 -0
  52. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  53. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  54. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  55. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  56. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  57. data/spec/dummy/app/mailers/.keep +0 -0
  58. data/spec/dummy/app/models/.keep +0 -0
  59. data/spec/dummy/app/models/concerns/.keep +0 -0
  60. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  61. data/spec/dummy/bin/bundle +3 -0
  62. data/spec/dummy/bin/rails +4 -0
  63. data/spec/dummy/bin/rake +4 -0
  64. data/spec/dummy/config.ru +4 -0
  65. data/spec/dummy/config/application.rb +22 -0
  66. data/spec/dummy/config/boot.rb +5 -0
  67. data/spec/dummy/config/database.yml +25 -0
  68. data/spec/dummy/config/environment.rb +5 -0
  69. data/spec/dummy/config/environments/development.rb +29 -0
  70. data/spec/dummy/config/environments/production.rb +80 -0
  71. data/spec/dummy/config/environments/test.rb +36 -0
  72. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  73. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  74. data/spec/dummy/config/initializers/inflections.rb +16 -0
  75. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  76. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  77. data/spec/dummy/config/initializers/session_store.rb +3 -0
  78. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  79. data/spec/dummy/config/locales/en.yml +23 -0
  80. data/spec/dummy/config/routes.rb +4 -0
  81. data/spec/dummy/db/schema.rb +39 -0
  82. data/spec/dummy/lib/assets/.keep +0 -0
  83. data/spec/dummy/public/404.html +58 -0
  84. data/spec/dummy/public/422.html +58 -0
  85. data/spec/dummy/public/500.html +57 -0
  86. data/spec/dummy/public/favicon.ico +0 -0
  87. data/spec/factories/scraped_sites.rb +5 -0
  88. data/spec/fixtures/datawrapper.html +121 -0
  89. data/spec/jobs/pageflow/chart/scrape_site_job_spec.rb +22 -0
  90. data/spec/models/pageflow/chart/scraped_site_spec.rb +19 -0
  91. data/spec/pageflow/chart/downloader_spec.rb +90 -0
  92. data/spec/pageflow/chart/scraper_spec.rb +179 -0
  93. data/spec/requests/scraping_site_spec.rb +23 -0
  94. data/spec/spec_helper.rb +20 -0
  95. data/spec/support/factory_girl.rb +5 -0
  96. data/spec/support/html_fragment.rb +13 -0
  97. data/spec/support/paperclip.rb +11 -0
  98. data/spec/support/resque.rb +20 -0
  99. data/spec/support/webmock.rb +11 -0
  100. metadata +363 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZmViYWVjOGM0OGIwOTFkODk3MzA1NjBiOWQxMDBiMjQ3NDNkNzFjZA==
5
+ data.tar.gz: !binary |-
6
+ ZTBhODQ0ZTE2ZGNiYzI4NDQ0YTRhYmFlN2Y1NjZiZTg1NjllODNlMA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZTQzNzQxZjczZDBiZDkyY2VmMTg2ZjQ2NGY1ZDAwY2RiZDdmOGRjZGMyYWQx
10
+ NTYyMDU0YWUyNzYzMDllODQxNTA4NmYyYjc2NTVmNmIyMzVlMDc3NDJiNWY2
11
+ ODk1Y2M5NDVjNDAwY2IyZWM1ZTljNGMzODIzMjM2YWM0MWMxMTU=
12
+ data.tar.gz: !binary |-
13
+ NDk1NDY1YTkzNWQ0ODRiMWZlNjhjZDM2ZDM3ZTNhOTNiYTQ4YWI1MzUzMWQw
14
+ ZGNkZWRkM2ZiMjcxNjMxMTJmYTc0MmVlYjU3YzcwNDY1OWM5Mjc1NmQ5MWE4
15
+ MWQwZjIyYTlkMDk2MmFlOWYyYWIzYzk5ZmU2ZDNlM2M1NDE1Y2U=
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ *.sqlite3
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ log
20
+
21
+ .localeapp
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # CHANGELOG
2
+
3
+ ### Version 0.1.0
4
+
5
+ 2015-02-03
6
+
7
+ Initial release.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chart.gemspec
4
+ gemspec
5
+
6
+ gem 'activeadmin', :git => 'https://github.com/codevise/active_admin.git', :branch => 'rails4'
7
+ gem 'ransack'
8
+ gem 'inherited_resources', '1.4.1'
9
+ gem 'formtastic', '2.3.0.rc2'
10
+
data/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # Pageflow Chart
2
+
3
+ Page type showing scraped svg diagramms from Datawrapper.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ # Gemfile
10
+ gem 'pagflow-chart'
11
+
12
+ Mount the engine:
13
+
14
+ # config/routes.rb
15
+ mount Pageflow::Chart::Engine, :at => '/chart'
16
+
17
+ Register the page type:
18
+
19
+ # config/initializers/pageflow.rb
20
+ config.register_page_type(Pageflow::Chart.page_type)
21
+
22
+ Include javascript/stylesheets:
23
+
24
+ # app/assets/javascripts/pageflow/application.js
25
+ //= require "pageflow/chart"
26
+
27
+ # app/assets/javascripts/pageflow/editor.js
28
+ //= require pageflow/chart/editor
29
+
30
+ # app/assets/stylesheets/pageflow/application.scss.css;
31
+ @import "pageflow/chart";
32
+
33
+
34
+ # app/assets/stylesheets/pageflow/editor.scss.css;
35
+ @import "pageflow/chart/editor";
36
+
37
+ # Adding basic style to your theme
38
+ # app/assets/stylesheets/pageflow/themes/default.css.scss
39
+ @import "pageflow/chart/themes/default";
40
+
41
+ Install and run migrations:
42
+
43
+ rake pageflow_chart:install:migrations
44
+ rake db:migrate SCOPE=pageflow_chart
45
+
46
+ ## Create Proxy
47
+
48
+ Create a proxy (via Apache, Nginx, ...) from your domain to your configured
49
+ `S3_HOST_ALIAS` to circumvent the same-domain policy. Configure this
50
+ in your Pageflow Chart initializer `config/initializers/pageflow_chart.rb`.
51
+
52
+ Example conf snippet for Nginx:
53
+
54
+ location /datawrapper/ {
55
+ proxy_pass http://bucketname.s3-website-eu-west-1.amazonaws.com/;
56
+ proxy_redirect http://bucketname.s3-website-eu-west-1.amazonaws.com/ $scheme://$host/datawrapper/;
57
+ }
58
+
59
+ This is needed so the charts can be servered from the same origin as
60
+ the entry.
61
+
62
+ ## Configuration
63
+
64
+ Configure Pageflow Chart by creating an initializer in your app
65
+ `config/initializers/pageflow_chart.rb`.
66
+
67
+ Example:
68
+
69
+ Pageflow::Chart.configure do |config|
70
+ config.scraped_sites_root_url = '/datawrapper'
71
+ end
72
+
73
+ Please see `lib/pageflow/chart/configuration.rb` for the possible options.
74
+
75
+ TODO: Document config options here
76
+
77
+ ## Troubleshooting
78
+
79
+ If you run into problems while installing the page type, please also
80
+ refer to the
81
+ [Troubleshooting](https://github.com/codevise/pageflow/wiki/Troubleshooting)
82
+ wiki page in the
83
+ [Pageflow repository](https://github.com/codevise/pageflow). If that
84
+ doesn't help, consider
85
+ [filing an issue](https://github.com/codevise/pageflow-chart/issues).
86
+
87
+ ## Contributing Locales
88
+
89
+ Edit the translations directly on the
90
+ [pageflow-chart](http://www.localeapp.com/projects/public?search=tf/pageflow-chart)
91
+ locale project.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Pageflow Chart'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,5 @@
1
+ //= require_self
2
+ //= require ./chart/asset_urls
3
+ //= require ./chart/page_type
4
+
5
+ pageflow.chart = pageflow.chart || {};
@@ -0,0 +1,3 @@
1
+ pageflow.chart.assetUrls = {
2
+ customStylesheet: '<%= asset_path('pageflow/chart/custom.css', :protocol => 'http') %>'
3
+ };
@@ -0,0 +1,9 @@
1
+ //= require_self
2
+ //= require_tree ./editor/models
3
+ //= require_tree ./editor/collections
4
+ //= require_tree ./editor/views/inputs
5
+ //= require_tree ./editor/templates
6
+ //= require_tree ./editor/views
7
+ //= require_tree ./editor/initializers
8
+
9
+ pageflow.chart = pageflow.chart || {};
@@ -0,0 +1,23 @@
1
+ pageflow.chart.ScrapedSitesCollection = Backbone.Collection.extend({
2
+ model: pageflow.chart.ScrapedSite,
3
+
4
+ name: 'scraped_sites',
5
+
6
+ getOrFetch: function(id, options) {
7
+ options = options || {};
8
+ var model = this.get(id);
9
+
10
+ if (model) {
11
+ if (options.success) {
12
+ options.success(model);
13
+ }
14
+ }
15
+ else {
16
+ model = new pageflow.chart.ScrapedSite({id: id});
17
+ this.add(model);
18
+ model.fetch(options);
19
+ }
20
+
21
+ return model;
22
+ }
23
+ });
@@ -0,0 +1 @@
1
+ pageflow.chart.scrapedSites = new pageflow.chart.ScrapedSitesCollection();
@@ -0,0 +1,55 @@
1
+ pageflow.chart.ScrapedSite = Backbone.Model.extend({
2
+ modelName: 'scraped_site',
3
+ paramRoot: 'scraped_site',
4
+
5
+ initialize: function() {
6
+ this.listenTo(this, 'sync', function() {
7
+ if (this.isProcessing() && !this.pollingInterval) {
8
+ this.pollUntilScraped();
9
+ }
10
+ });
11
+ },
12
+
13
+ urlRoot: function() {
14
+ return '/chart/scraped_sites';
15
+ },
16
+
17
+ isProcessed: function() {
18
+ return this.get('state') === 'processed';
19
+ },
20
+
21
+ isProcessing: function() {
22
+ return this.get('state') === 'processing';
23
+ },
24
+
25
+ isFailed: function() {
26
+ return this.get('state') === 'processing_failed';
27
+ },
28
+
29
+ pollUntilScraped: function() {
30
+ var model = this;
31
+
32
+ if (model.isProcessed()) {
33
+ return;
34
+ }
35
+
36
+ model.pollingInterval = setInterval(poll, 1000);
37
+
38
+ function stopPolling() {
39
+ if (model.pollingInterval) {
40
+ clearInterval(model.pollingInterval);
41
+ model.pollingInterval = null;
42
+ }
43
+ }
44
+
45
+ function poll() {
46
+ model.fetch({
47
+ success: function() {
48
+ if (!model.isProcessing()) {
49
+ stopPolling();
50
+ }
51
+ }
52
+ });
53
+ }
54
+ }
55
+ });
@@ -0,0 +1,2 @@
1
+ <p class="processing state validation pending"><%= I18n.t('pageflow.chart.editor.templates.scraped_site_status.pending') %></p>
2
+ <p class="failed state validation failed"><%= I18n.t('pageflow.chart.editor.templates.scraped_site_status.failed') %></p>
@@ -0,0 +1,7 @@
1
+ <label>
2
+ <span class="name"></span>
3
+ <span class="inline_help"></span>
4
+ </label>
5
+ <input type="text" />
6
+ <div class="validation"></div>
7
+ <div class="status_container"></div>
@@ -0,0 +1,26 @@
1
+ pageflow.ConfigurationEditorView.register('chart', {
2
+ configure: function() {
3
+ var supportedHosts = this.options.pageType.supportedHosts;
4
+
5
+ this.tab('general', function() {
6
+ this.group('general');
7
+ });
8
+
9
+ this.tab('files', function() {
10
+ this.input('scraped_site_id', pageflow.chart.ScrapedUrlInputView, {
11
+ supportedHosts: supportedHosts,
12
+ displayPropertyName: 'display_scraped_site_url',
13
+ required: true
14
+ });
15
+ this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
16
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
17
+ collection: pageflow.imageFiles,
18
+ imagePositioning: false
19
+ });
20
+ });
21
+
22
+ this.tab('options', function() {
23
+ this.group('options');
24
+ });
25
+ }
26
+ });
@@ -0,0 +1,47 @@
1
+ pageflow.chart.IframeEmbeddedView = Backbone.Marionette.View.extend({
2
+ modelEvents: {
3
+ 'change': 'update'
4
+ },
5
+
6
+ render: function() {
7
+ this.updateScrapedSite();
8
+ return this;
9
+ },
10
+
11
+ update: function() {
12
+ if (this.model.hasChanged(this.options.propertyName)) {
13
+ this.updateScrapedSite();
14
+ }
15
+ },
16
+
17
+ updateScrapedSite: function() {
18
+ var view = this;
19
+
20
+ if (this.scrapedSite) {
21
+ this.stopListening(this.scrapedSite);
22
+ }
23
+
24
+ var scrapedSiteId = this.model.get(this.options.propertyName);
25
+
26
+ if (scrapedSiteId) {
27
+ this.scrapedSite = pageflow.chart.scrapedSites.getOrFetch(scrapedSiteId, {
28
+ success: function(scrapedSite) {
29
+ view.updateSrc(scrapedSite);
30
+ }
31
+ });
32
+
33
+ this.listenTo(this.scrapedSite, 'change', this.updateSrc);
34
+ }
35
+ },
36
+
37
+ updateSrc: function(scrapedSite) {
38
+ scrapedSite = scrapedSite || this.scrapedSite;
39
+
40
+ if (scrapedSite && scrapedSite.isProcessed()) {
41
+ this.$el.attr('src', scrapedSite.get('html_file_url'));
42
+ }
43
+ else {
44
+ this.$el.attr('src', '');
45
+ }
46
+ }
47
+ });
@@ -0,0 +1,49 @@
1
+ pageflow.chart.ScrapedUrlInputView = pageflow.UrlInputView.extend({
2
+ template: 'pageflow/chart/editor/templates/url_input',
3
+
4
+ regions: {
5
+ statusContainer: '.status_container'
6
+ },
7
+
8
+ onLoad: function() {
9
+ this.listenTo(this.model, 'change:' + this.options.propertyName, function() {
10
+ this.updateScrapingStatus();
11
+ });
12
+
13
+ this.updateScrapingStatus();
14
+ },
15
+
16
+ transformPropertyValue: function(url) {
17
+ return $.Deferred(function(deferred) {
18
+ pageflow.chart.scrapedSites.create(
19
+ {
20
+ url: url
21
+ },
22
+ {
23
+ success: function(scrapedSite) {
24
+ deferred.resolve(scrapedSite.id);
25
+ }
26
+ }
27
+ );
28
+ }).promise();
29
+ },
30
+
31
+ updateScrapingStatus: function() {
32
+ var scrapedSite = this.getScrapedSite();
33
+
34
+ if (scrapedSite) {
35
+ this.statusContainer.show(new pageflow.chart.ScrapedSiteStatusView({
36
+ model: scrapedSite
37
+ }));
38
+ }
39
+ else {
40
+ this.statusContainer.close();
41
+ }
42
+ },
43
+
44
+ getScrapedSite: function() {
45
+ if (this.model.has(this.options.propertyName)) {
46
+ return pageflow.chart.scrapedSites.getOrFetch(this.model.get(this.options.propertyName));
47
+ }
48
+ }
49
+ });
@@ -0,0 +1,18 @@
1
+ pageflow.chart.ScrapedSiteStatusView = Backbone.Marionette.ItemView.extend({
2
+ template: 'pageflow/chart/editor/templates/scraped_site_status',
3
+ className: 'scraped_site_status',
4
+
5
+ modelEvents: {
6
+ change: 'update'
7
+ },
8
+
9
+ onRender: function() {
10
+ this.update();
11
+ },
12
+
13
+ update: function() {
14
+ this.$el.toggleClass('processed', this.model.isProcessed());
15
+ this.$el.toggleClass('failed', this.model.isFailed());
16
+ this.$el.toggleClass('processing', this.model.isProcessing());
17
+ }
18
+ });