pageflow-chart 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ });