disco_app 0.9.2 → 0.9.3

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +77 -20
  3. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +3 -3
  4. data/app/assets/javascripts/disco_app/disco_app.js +0 -1
  5. data/app/assets/stylesheets/disco_app/admin/_header.scss +16 -7
  6. data/app/assets/stylesheets/disco_app/admin/_layout.scss +1 -9
  7. data/app/assets/stylesheets/disco_app/admin/_nav.scss +15 -3
  8. data/app/assets/stylesheets/disco_app/disco_app.scss +3 -0
  9. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +1 -1
  10. data/app/assets/stylesheets/disco_app/frame/_forms.scss +1 -1
  11. data/app/assets/stylesheets/disco_app/frame/_type.scss +2 -9
  12. data/app/assets/stylesheets/disco_app/frame.scss +1 -0
  13. data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +27 -0
  14. data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +13 -10
  15. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +94 -67
  16. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +15 -3
  17. data/app/jobs/disco_app/concerns/shop_update_job.rb +2 -5
  18. data/app/models/disco_app/concerns/shop.rb +0 -13
  19. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +18 -2
  20. data/db/migrate/20160521135510_move_shop_to_synchronises.rb +61 -0
  21. data/lib/disco_app/engine.rb +0 -1
  22. data/lib/disco_app/version.rb +1 -1
  23. data/lib/generators/disco_app/disco_app_generator.rb +42 -3
  24. data/lib/generators/disco_app/{monitorify/templates → templates}/config/newrelic.yml +0 -0
  25. data/lib/generators/disco_app/{monitorify/templates → templates}/initializers/rollbar.rb +0 -0
  26. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  27. data/lib/tasks/shops.rake +10 -0
  28. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +1 -1
  29. data/test/dummy/app/models/disco_app/shop.rb +1 -1
  30. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  31. data/test/dummy/db/schema.rb +7 -22
  32. data/test/fixtures/disco_app/shops.yml +2 -2
  33. data/test/jobs/disco_app/app_installed_job_test.rb +1 -1
  34. data/test/jobs/disco_app/app_uninstalled_job_test.rb +1 -1
  35. metadata +8 -5
  36. data/lib/generators/disco_app/mailify/mailify_generator.rb +0 -54
  37. data/lib/generators/disco_app/monitorify/monitorify_generator.rb +0 -28
@@ -394,31 +394,28 @@ hr.helper--divider {
394
394
  margin: 20px 0;
395
395
  }
396
396
 
397
- @font-face {
398
- font-family: 'Golos-Bold';
399
- src: url(/golos-bold.eot);
400
- }
401
-
402
- @font-face {
403
- font-family: 'Golos-Bold';
404
- src: url(/golos-bold.woff) format("woff"), url(/golos-bold.ttf) format("truetype");
405
- font-weight: normal;
406
- font-style: normal;
407
- }
408
-
409
397
  html {
410
- font-size: 62.5%;
398
+ font-size: 87.5%;
411
399
  -webkit-text-size-adjust: 100%;
412
400
  -ms-text-size-adjust: 100%;
413
401
  text-size-adjust: 100%;
402
+ text-rendering: optimizeLegibility;
414
403
  }
415
404
 
416
405
  body {
417
- line-height: 18px;
418
- font-size: 13px;
419
- color: #31373d;
420
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
421
- text-rendering: optimizeLegibility;
406
+ color: rgba(0,0,0,0.9);
407
+ font-size: 1.07143rem;
408
+ line-height: 1.42857rem;
409
+ font-weight: 400;
410
+ text-transform: initial;
411
+ letter-spacing: initial;
412
+ -webkit-font-smoothing: antialiased;
413
+ -moz-osx-font-smoothing: grayscale;
414
+ font-family: $font-family;
415
+
416
+ @media screen and (min-width: 640px) {
417
+ font-size: 1rem;
418
+ }
422
419
  }
423
420
 
424
421
  strong {
@@ -533,7 +530,7 @@ code {
533
530
  input {
534
531
  font-size: 13px;
535
532
  line-height: 18px;
536
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
533
+ font-family: $font-family;
537
534
  }
538
535
 
539
536
  del {
@@ -1327,6 +1324,37 @@ a.type--subdued:hover {
1327
1324
  padding-left: 20px;
1328
1325
  }
1329
1326
 
1327
+ .btn {
1328
+ color: rgba(0,0,0,0.9);
1329
+ font-size: 1.14286rem;
1330
+ line-height: 1.71429rem;
1331
+ font-weight: 400;
1332
+ text-transform: initial;
1333
+ letter-spacing: initial;
1334
+ -webkit-font-smoothing: antialiased;
1335
+ -moz-osx-font-smoothing: grayscale;
1336
+ line-height: 1.14286rem;
1337
+ box-sizing: border-box;
1338
+ cursor: pointer;
1339
+ display: inline-block;
1340
+ padding: 9px 15px;
1341
+ margin: 0;
1342
+ border-radius: 3px;
1343
+ height: auto;
1344
+ white-space: nowrap;
1345
+ text-transform: none;
1346
+ font-family: inherit;
1347
+ font-weight: normal;
1348
+ position: relative;
1349
+ vertical-align: middle;
1350
+ -webkit-user-select: none;
1351
+ -moz-user-select: none;
1352
+ -ms-user-select: none;
1353
+ user-select: none;
1354
+ -webkit-appearance: none;
1355
+ -webkit-tap-highlight-color: transparent;
1356
+ }
1357
+
1330
1358
  .btn-default, .btn {
1331
1359
  background-color: #ffffff;
1332
1360
  color: #479ccf;
@@ -1507,30 +1535,6 @@ a.type--subdued:hover {
1507
1535
  background: rgba(49, 55, 61, 0.1);
1508
1536
  }
1509
1537
 
1510
- .btn {
1511
- box-sizing: border-box;
1512
- cursor: pointer;
1513
- display: inline-block;
1514
- padding: 8.5px 15px;
1515
- margin: 0;
1516
- border-radius: 3px;
1517
- font-size: 13px;
1518
- line-height: 1;
1519
- height: auto;
1520
- white-space: nowrap;
1521
- text-transform: none;
1522
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
1523
- font-weight: normal;
1524
- position: relative;
1525
- vertical-align: middle;
1526
- -webkit-user-select: none;
1527
- -moz-user-select: none;
1528
- -ms-user-select: none;
1529
- user-select: none;
1530
- -webkit-appearance: none;
1531
- -webkit-tap-highlight-color: transparent;
1532
- }
1533
-
1534
1538
  .btn.has-loading::before {
1535
1539
  background-position: 50% 50% !important;
1536
1540
  background-repeat: no-repeat !important;
@@ -1636,7 +1640,7 @@ input[type="submit"].btn-disabled.btn--outline,
1636
1640
  z-index: 226;
1637
1641
  border-radius: 0;
1638
1642
  left: 0;
1639
- min-width: 230px;
1643
+ min-width: 240px;
1640
1644
  padding: 20px 0 !important;
1641
1645
  text-align: center;
1642
1646
  top: 0;
@@ -2545,8 +2549,8 @@ input, textarea {
2545
2549
  max-width: 100%;
2546
2550
  vertical-align: top;
2547
2551
  height: 28px;
2548
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2549
- font-size: 13px;
2552
+ font-family: $font-family;
2553
+ font-size: 14px;
2550
2554
  padding: 4px;
2551
2555
  margin: 0;
2552
2556
  border: 1px solid #d3dbe2;
@@ -2739,8 +2743,8 @@ textarea.is-expanded {
2739
2743
 
2740
2744
  select {
2741
2745
  margin: 0;
2742
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2743
- font-size: 13px;
2746
+ font-family: $font-family;
2747
+ font-size: 14px;
2744
2748
  display: inline-block;
2745
2749
  color: #222;
2746
2750
  vertical-align: top;
@@ -3138,7 +3142,7 @@ input.attached-to-both {
3138
3142
  padding: 0;
3139
3143
  }
3140
3144
 
3141
- .next-input, .next-input--stylized, .next-input--invisible {
3145
+ .next-input, .sp-input, .next-input--stylized, .next-input--invisible {
3142
3146
  display: inline-block;
3143
3147
  max-width: auto;
3144
3148
  min-width: 75px;
@@ -3205,16 +3209,21 @@ input[type=button].next-input--button {
3205
3209
  -moz-appearance: none;
3206
3210
  }
3207
3211
 
3208
- .next-input, .next-input--stylized, .next-textarea {
3212
+ .next-input, .sp-input, .next-input--stylized, .next-textarea, .next-token-list--is-input {
3209
3213
  padding: 5px 10px;
3210
3214
  border: 1px solid #d3dbe2;
3211
3215
  border-radius: 3px;
3212
- font-size: 15px;
3213
- color: #31373d;
3216
+ color: rgba(0,0,0,0.9);
3217
+ font-size: 1.14286rem;
3218
+ line-height: 1.71429rem;
3219
+ font-weight: 400;
3220
+ text-transform: initial;
3221
+ letter-spacing: initial;
3222
+ -webkit-font-smoothing: antialiased;
3223
+ -moz-osx-font-smoothing: grayscale;
3214
3224
  box-sizing: border-box;
3215
3225
  display: block;
3216
3226
  width: 100%;
3217
- line-height: 20px;
3218
3227
  }
3219
3228
 
3220
3229
  .next-input::-webkit-input-placeholder, .next-input--stylized::-webkit-input-placeholder, .next-textarea::-webkit-input-placeholder {
@@ -3244,10 +3253,19 @@ input[type=button].next-input--button {
3244
3253
  .next-label {
3245
3254
  display: block;
3246
3255
  margin-bottom: 5px;
3247
- color: #31373d;
3248
- font-size: 13px;
3249
- font-weight: normal;
3256
+ color: rgba(0,0,0,0.9);
3257
+ font-size: 1.07143rem;
3258
+ line-height: 1.42857rem;
3259
+ font-weight: 400;
3260
+ text-transform: initial;
3261
+ letter-spacing: initial;
3262
+ -webkit-font-smoothing: antialiased;
3263
+ -moz-osx-font-smoothing: grayscale;
3250
3264
  cursor: pointer;
3265
+
3266
+ @media screen and (min-width: 640px) {
3267
+ font-size: 1rem;
3268
+ }
3251
3269
  }
3252
3270
 
3253
3271
  .next-label--inline {
@@ -3487,7 +3505,7 @@ input[type=checkbox].next-checkbox, .next-radio--styled, .next-checkbox--styled
3487
3505
  display: block;
3488
3506
  position: absolute;
3489
3507
  left: 0;
3490
- top: 0;
3508
+ top: 0.15em;
3491
3509
  height: 16px;
3492
3510
  width: 16px;
3493
3511
  border: 1px solid #d3dbe2;
@@ -3646,17 +3664,22 @@ input[type=checkbox].next-checkbox {
3646
3664
  -webkit-appearance: none;
3647
3665
  -moz-appearance: none;
3648
3666
  width: 100%;
3649
- font-size: 15px;
3667
+ color: rgba(0,0,0,0.9);
3668
+ font-size: 1.14286rem;
3669
+ line-height: 1.71429rem;
3670
+ font-weight: 400;
3671
+ text-transform: initial;
3672
+ letter-spacing: initial;
3673
+ -webkit-font-smoothing: antialiased;
3674
+ -moz-osx-font-smoothing: grayscale;
3650
3675
  background: transparent;
3651
3676
  padding: 5px 10px;
3652
3677
  padding-right: 32px;
3653
- border: none;
3678
+ border: 0;
3654
3679
  box-sizing: border-box;
3655
3680
  height: auto;
3656
- line-height: 20px;
3657
3681
  max-width: none;
3658
3682
  display: block;
3659
- color: #31373d;
3660
3683
  }
3661
3684
 
3662
3685
  .next-select:focus {
@@ -3772,11 +3795,15 @@ input[type=checkbox].next-checkbox {
3772
3795
  }
3773
3796
 
3774
3797
  .next-heading {
3775
- color: #31373d;
3776
- margin: 0 0 20px 0;
3777
- font-weight: 400;
3778
- font-size: 18px;
3779
- line-height: 1.2em;
3798
+ color: rgba(0,0,0,0.9);
3799
+ font-size: 1.21429rem;
3800
+ line-height: 1.71429rem;
3801
+ font-weight: 600;
3802
+ margin: 0 0 20px;
3803
+
3804
+ @media screen and (min-width: 640px) {
3805
+ font-size: 1.14286rem;
3806
+ }
3780
3807
  }
3781
3808
 
3782
3809
  .next-heading--1 {
@@ -5038,11 +5065,11 @@ td a.subdued:hover {
5038
5065
  }
5039
5066
 
5040
5067
  .ui-annotated-section__annotation {
5068
+ color: rgba(0,0,0,0.56);
5041
5069
  -webkit-box-flex: 1;
5042
5070
  -webkit-flex: 1 0 240px;
5043
5071
  -ms-flex: 1 0 240px;
5044
5072
  flex: 1 0 240px;
5045
- color: #798c9c;
5046
5073
  }
5047
5074
 
5048
5075
  .ui-annotated-section__title {
@@ -30,19 +30,30 @@
30
30
  }
31
31
 
32
32
  .next-tab {
33
+ color: rgba(0,0,0,0.56);
33
34
  padding: 15px 20px;
34
35
  text-decoration: none;
35
- color: #798c9c;
36
36
  border-right: 1px solid #ebeef0;
37
37
  border-bottom: 1px solid #ebeef0;
38
38
  text-align: center;
39
39
  line-height: 1;
40
40
  cursor: pointer;
41
41
  position: relative;
42
- font-size: 13px;
42
+ -webkit-box-flex: 1;
43
+ -webkit-flex-grow: 1;
44
+ -ms-flex-positive: 1;
43
45
  flex-grow: 1;
46
+ display: -webkit-box;
47
+ display: -webkit-flex;
48
+ display: -ms-flexbox;
44
49
  display: flex;
50
+ -webkit-box-align: center;
51
+ -webkit-align-items: center;
52
+ -ms-flex-align: center;
45
53
  align-items: center;
54
+ -webkit-box-pack: center;
55
+ -webkit-justify-content: center;
56
+ -ms-flex-pack: center;
46
57
  justify-content: center;
47
58
 
48
59
  &:focus,
@@ -54,8 +65,9 @@
54
65
  }
55
66
 
56
67
  &.next-tab--is-active {
68
+ font-weight: normal;
69
+ color: rgba(0,0,0,0.9);
57
70
  background-color: #ffffff;
58
- color: #31373d;
59
71
  border-bottom-color: #ffffff;
60
72
  cursor: default;
61
73
  text-decoration: none;
@@ -6,11 +6,8 @@ module DiscoApp::Concerns::ShopUpdateJob
6
6
  # If we weren't provided with shop data (eg from a webhook), fetch it.
7
7
  shop_data ||= ActiveSupport::JSON::decode(ShopifyAPI::Shop.current.to_json)
8
8
 
9
- # Ensure we can access shop data through symbols.
10
- shop_data = HashWithIndifferentAccess.new(shop_data)
11
-
12
- # Update model attributes present in both our model and the data hash.
13
- @shop.update_attributes(shop_data.except(:id, :created_at).slice(*DiscoApp::Shop.column_names))
9
+ # Update attributes stored directly on the Shop model, along with the data hash itself.
10
+ @shop.update(shop_data.with_indifferent_access.slice(*DiscoApp::Shop.column_names).except(:id, :created_at).merge(data: shop_data))
14
11
  end
15
12
 
16
13
  end
@@ -23,19 +23,6 @@ module DiscoApp::Concerns::Shop
23
23
  # Alias 'with_shopify_session' as 'temp', as per our existing conventions.
24
24
  alias_method :temp, :with_shopify_session
25
25
 
26
- # Return a hash of attributes that should be used to create a new charge for this shop.
27
- # This method can be overridden by the inheriting Shop class in order to provide charges
28
- # customised to a particular shop. Otherwise, the default settings configured in application.rb
29
- # will be used.
30
- def new_charge_attributes
31
- {
32
- type: Rails.configuration.x.shopify_charges_default_type,
33
- name: DiscoApp.configuration.app_name,
34
- price: Rails.configuration.x.shopify_charges_default_price,
35
- trial_days: Rails.configuration.x.shopify_charges_default_trial_days,
36
- }
37
- end
38
-
39
26
  # Convenience method to check if this shop has a current subscription.
40
27
  def current_subscription?
41
28
  current_subscription.present?
@@ -5,8 +5,8 @@ module DiscoApp::Admin::Resources::Concerns::ShopResource
5
5
 
6
6
  included do
7
7
 
8
- attributes :domain, :status, :email, :country_name
9
- attributes :currency, :plan_display_name, :created_at
8
+ attributes :domain, :status, :created_at
9
+ attributes :email, :country_name, :currency, :plan_display_name
10
10
  attributes :current_subscription_id, :current_subscription_display_amount, :current_subscription_display_plan, :current_subscription_display_plan_code, :current_subscription_source
11
11
  attributes :installed_duration
12
12
 
@@ -45,6 +45,22 @@ module DiscoApp::Admin::Resources::Concerns::ShopResource
45
45
  []
46
46
  end
47
47
 
48
+ def email
49
+ @model.data['email']
50
+ end
51
+
52
+ def country_name
53
+ @model.data['country_name']
54
+ end
55
+
56
+ def currency
57
+ @model.data['currency']
58
+ end
59
+
60
+ def plan_display_name
61
+ @model.data['plan_display_name']
62
+ end
63
+
48
64
  def current_subscription_id
49
65
  if @model.current_subscription?
50
66
  @model.current_subscription.id
@@ -0,0 +1,61 @@
1
+ class MoveShopToSynchronises < ActiveRecord::Migration
2
+
3
+ class DiscoApp::Shop < ActiveRecord::Base
4
+ end
5
+
6
+ ATTRIBUTES_TO_MIGRATE = [
7
+ :email, :country_name, :currency, :money_format,
8
+ :money_with_currency_format, :plan_display_name,
9
+ :latitude, :longitude, :customer_email, :password_enabled, :phone,
10
+ :primary_locale, :ships_to_countries, :timezone, :iana_timezone,
11
+ :has_storefront
12
+ ]
13
+
14
+ def up
15
+ add_column :disco_app_shops, :data, :jsonb, default: {}
16
+
17
+ DiscoApp::Shop.find_each do |shop|
18
+ data = shop.data
19
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
20
+ data[attribute.to_s] = shop.send(attribute)
21
+ end
22
+ shop.update(data: data)
23
+ end
24
+
25
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
26
+ remove_column :disco_app_shops, attribute
27
+ end
28
+ end
29
+
30
+ def down
31
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
32
+ add_column :disco_app_shops, attribute, attribute_column_type(attribute)
33
+ end
34
+
35
+ DiscoApp::Shop.find_each do |shop|
36
+ shop.update(Hash[ATTRIBUTES_TO_MIGRATE.map do |attribute|
37
+ [attribute, shop.data[attribute.to_s]]
38
+ end])
39
+ end
40
+
41
+ remove_column :disco_app_shops, :data
42
+ end
43
+
44
+ private
45
+
46
+ def attribute_column_type(attribute)
47
+ case attribute
48
+ when :password_enabled
49
+ :boolean
50
+ when :has_storefront
51
+ :boolean
52
+ when :latitude
53
+ :decimal
54
+ when :longitude
55
+ :decimal
56
+ else
57
+ :string
58
+ end
59
+ end
60
+
61
+ end
@@ -1,5 +1,4 @@
1
1
  require 'shopify_app'
2
- require 'bootstrap-sass'
3
2
  require 'jquery-rails'
4
3
  require 'turbolinks'
5
4
  require 'activerecord/session_store'
@@ -1,3 +1,3 @@
1
1
  module DiscoApp
2
- VERSION = '0.9.2'
2
+ VERSION = '0.9.3'
3
3
  end
@@ -9,7 +9,7 @@ class DiscoAppGenerator < Rails::Generators::Base
9
9
  # - Default simple Procfile for Heroku.
10
10
  #
11
11
  def copy_root_files
12
- %w(.env .env.local .gitignore Procfile).each do |file|
12
+ %w(.env .env.local .gitignore Procfile CHECKS).each do |file|
13
13
  copy_file "root/#{file}", file
14
14
  end
15
15
  end
@@ -30,7 +30,6 @@ class DiscoAppGenerator < Rails::Generators::Base
30
30
  gem 'shopify_app', '~> 6.4.1'
31
31
  gem 'sidekiq', '~> 4.0.2'
32
32
  gem 'puma', '~> 2.14.0'
33
- gem 'bootstrap-sass', '~> 3.3.5.1'
34
33
  gem 'activerecord-session_store', '~> 0.1.2'
35
34
  gem 'activeresource', github: 'shopify/activeresource', tag: '4.2-threadsafe'
36
35
  gem 'rails-bigint-pk', '~> 1.2.0'
@@ -39,6 +38,10 @@ class DiscoAppGenerator < Rails::Generators::Base
39
38
  gem 'react-rails', '~> 1.6.0'
40
39
  gem 'classnames-rails', '~> 2.1.5'
41
40
  gem 'active_link_to', '~> 1.0.2'
41
+ # Add premailer gem to Gemfile.
42
+ gem 'premailer-rails', '~> 1.8.2'
43
+ # Add explicit dependency on Nokogiri
44
+ gem 'nokogiri', '~> 1.6.7.2'
42
45
 
43
46
  # Add gems for development and testing only.
44
47
  gem_group :development, :test do
@@ -51,7 +54,13 @@ class DiscoAppGenerator < Rails::Generators::Base
51
54
  # Add gems for production only.
52
55
  gem_group :production do
53
56
  gem 'rails_12factor', '~> 0.0.3'
57
+ gem 'mailgun_rails', '~> 0.7.0'
54
58
  end
59
+
60
+ # Add monitoring gems to Gemfile
61
+ gem 'rollbar', '~> 2.8.0'
62
+ gem 'oj', '~> 2.14.5'
63
+ gem 'newrelic_rpm', '~> 3.15.2.317'
55
64
  end
56
65
 
57
66
  # copy template for pg configuration
@@ -113,6 +122,36 @@ class DiscoAppGenerator < Rails::Generators::Base
113
122
 
114
123
  # Copy over the default puma configuration.
115
124
  copy_file 'config/puma.rb', 'config/puma.rb'
125
+
126
+ # Mail configuration
127
+ configuration = <<-CONFIG.strip_heredoc
128
+
129
+ # Configure ActionMailer to use MailGun
130
+ if ENV['MAILGUN_API_KEY']
131
+ config.action_mailer.delivery_method = :mailgun
132
+ config.action_mailer.mailgun_settings = {
133
+ api_key: ENV['MAILGUN_API_KEY'],
134
+ domain: ENV['MAILGUN_API_DOMAIN']
135
+ }
136
+ end
137
+ CONFIG
138
+ application configuration, env: :production
139
+
140
+ # Monitoring configuration
141
+ copy_file 'initializers/rollbar.rb', 'config/initializers/rollbar.rb'
142
+ copy_file 'config/newrelic.yml', 'config/newrelic.yml'
143
+ end
144
+
145
+
146
+ # Add entries to .env and .env.local
147
+ def add_env_variables
148
+ configuration = <<-CONFIG.strip_heredoc
149
+
150
+ MAILGUN_API_KEY=
151
+ MAILGUN_API_DOMAIN=
152
+ CONFIG
153
+ append_to_file '.env', configuration
154
+ append_to_file '.env.local', configuration
116
155
  end
117
156
 
118
157
  # Set up routes.
@@ -182,7 +221,7 @@ class DiscoAppGenerator < Rails::Generators::Base
182
221
  # This should be the last operation, to allow all other operations to run in the initial Ruby version.
183
222
  def set_ruby_version
184
223
  copy_file 'root/.ruby-version', '.ruby-version'
185
- prepend_to_file 'Gemfile', "ruby '2.3.0'\n"
224
+ prepend_to_file 'Gemfile', "ruby '2.3.1'\n"
186
225
  end
187
226
 
188
227
  private
@@ -0,0 +1,4 @@
1
+ WAIT=5
2
+ ATTEMPTS=6
3
+ /login
4
+
@@ -0,0 +1,10 @@
1
+ namespace :shops do
2
+
3
+ desc 'Synchronise shop data across all installed shops.'
4
+ task sync: :environment do
5
+ DiscoApp::Shop.installed.has_active_shopify_plan.each do |shop|
6
+ DiscoApp::ShopUpdateJob.perform_later(shop.shopify_domain)
7
+ end
8
+ end
9
+
10
+ end
@@ -5,7 +5,7 @@ class DiscoApp::AppUninstalledJob < DiscoApp::ShopJob
5
5
  # 'Nowhere' on uninstallation.
6
6
  def perform(domain, shop_data)
7
7
  super(domain, shop_data)
8
- @shop.update(country_name: 'Nowhere')
8
+ @shop.update(data: @shop.data.merge(country_name: 'Nowhere'))
9
9
  end
10
10
 
11
11
  end
@@ -6,7 +6,7 @@ class DiscoApp::Shop < ActiveRecord::Base
6
6
  # Extend the Shop model to return the Shop's country as an ActiveUtils country.
7
7
  def country
8
8
  begin
9
- ActiveUtils::Country.find(country_name)
9
+ ActiveUtils::Country.find(data['country_name'])
10
10
  rescue ActiveUtils::InvalidCountryCodeError
11
11
  nil
12
12
  end
@@ -0,0 +1,24 @@
1
+ development:
2
+ adapter: postgresql
3
+ host: postgres
4
+ encoding: unicode
5
+ pool: 10
6
+ username: disco_pguser
7
+ template: template1
8
+ password: disco_pgpassword
9
+ database: disco_app
10
+ port: 5432
11
+ sslmode: disable
12
+
13
+ test:
14
+ adapter: postgresql
15
+ host: postgres
16
+ encoding: unicode
17
+ pool: 10
18
+ username: disco_pguser
19
+ template: template1
20
+ password: disco_pgpassword
21
+ database: disco_app
22
+ port: 5432
23
+ sslmode: disable
24
+
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20160513140727) do
14
+ ActiveRecord::Schema.define(version: 20160521135510) do
15
15
 
16
16
  # These are extensions that must be enabled in order to support this database
17
17
  enable_extension "plpgsql"
@@ -76,30 +76,15 @@ ActiveRecord::Schema.define(version: 20160513140727) do
76
76
  add_index "disco_app_sessions", ["updated_at"], name: "index_disco_app_sessions_on_updated_at", using: :btree
77
77
 
78
78
  create_table "disco_app_shops", force: :cascade do |t|
79
- t.string "shopify_domain", null: false
80
- t.string "shopify_token", null: false
81
- t.datetime "created_at", null: false
82
- t.datetime "updated_at", null: false
83
- t.integer "status", default: 0
84
- t.string "email"
85
- t.string "country_name"
86
- t.string "currency"
87
- t.string "money_format"
88
- t.string "money_with_currency_format"
79
+ t.string "shopify_domain", null: false
80
+ t.string "shopify_token", null: false
81
+ t.datetime "created_at", null: false
82
+ t.datetime "updated_at", null: false
83
+ t.integer "status", default: 0
89
84
  t.string "domain"
90
85
  t.string "plan_name"
91
- t.string "plan_display_name"
92
- t.decimal "latitude"
93
- t.decimal "longitude"
94
- t.string "customer_email"
95
- t.boolean "password_enabled"
96
- t.string "phone"
97
- t.string "primary_locale"
98
- t.string "ships_to_countries"
99
- t.string "timezone"
100
- t.string "iana_timezone"
101
- t.boolean "has_storefront"
102
86
  t.string "name"
87
+ t.jsonb "data", default: {}
103
88
  end
104
89
 
105
90
  add_index "disco_app_shops", ["shopify_domain"], name: "index_disco_app_shops_on_shopify_domain", unique: true, using: :btree
@@ -1,10 +1,10 @@
1
1
  widget_store:
2
2
  shopify_domain: widgets.myshopify.com
3
3
  shopify_token: 00000000000000000000000000000000
4
- country_name: Australia
4
+ data: '{ "country_name": "Australia" }'
5
5
 
6
6
  widget_store_dev:
7
7
  shopify_domain: widgets-dev.myshopify.com
8
8
  shopify_token: 00000000000000000000000000000000
9
9
  status: 3
10
- country_name: Australia
10
+ data: '{ "country_name": "Australia" }'