disco_app 0.9.9 → 0.9.10
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 +4 -4
- data/app/models/disco_app/concerns/can_be_liquified.rb +42 -0
- data/app/models/disco_app/concerns/has_metafields.rb +48 -0
- data/lib/disco_app/version.rb +1 -1
- data/test/dummy/app/models/product.rb +3 -0
- data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
- data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
- data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
- data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
- data/test/fixtures/liquid/model.liquid +7 -0
- data/test/models/disco_app/can_be_liquified_test.rb +54 -0
- data/test/models/disco_app/has_metafields_test.rb +40 -0
- metadata +17 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6733d6f14a6a34189871a0255a65ca91527f864eb9e79ffff55e60aa4dc92a5d
|
4
|
+
data.tar.gz: a2988c764253a7e52a6ee67d1d27d57443296dc5c38534697d736fcb39c6575f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a2f55c26a2f1bdb55825784a3eb35015c3cb5dc4999a28ba73f8ed7d8a12d482259c5675f70650f1b3530a259da29dba4a221d7df282c15df721981a5a8bd7d
|
7
|
+
data.tar.gz: f7205e93ab775c08e91a692874e84bd5914f2db122e73123862c88b2854dec7b98f72cac97d7e2f9f6c65d05e67d3ec03e346a5e9d59e9aef07732b1e1819574
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module DiscoApp::Concerns::CanBeLiquified
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
SPLIT_ARRAY_SEPARATOR = '@!@'
|
5
|
+
|
6
|
+
included do
|
7
|
+
|
8
|
+
# Return this model as an array of Liquid {% assign %} statements.
|
9
|
+
def as_liquid
|
10
|
+
as_json.map { |k, v| "{% assign #{liquid_model_name}_#{k} = #{as_liquid_value(v)} %}" }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Render this model as a series of concatenated Liquid {% assign %} statements.
|
14
|
+
def to_liquid
|
15
|
+
as_liquid.join("\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Method to allow override of the model name in Liquid. Useful for models
|
19
|
+
# residing in namespaces that would otherwise have very long prefixes.
|
20
|
+
def liquid_model_name
|
21
|
+
model_name.param_key
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Return given value as a string expression that will be evaluated in Liquid to result in the correct value type.
|
27
|
+
def as_liquid_value(value)
|
28
|
+
if value.is_a? Numeric or (!!value == value)
|
29
|
+
return value.to_s
|
30
|
+
end
|
31
|
+
if value.nil?
|
32
|
+
return "nil"
|
33
|
+
end
|
34
|
+
if value.is_a? Array
|
35
|
+
return "\"#{value.map { |e| (e.is_a? String) ? CGI::escapeHTML(e) : e }.join(SPLIT_ARRAY_SEPARATOR)}\" | split: \"#{SPLIT_ARRAY_SEPARATOR}\""
|
36
|
+
end
|
37
|
+
"\"#{CGI::escapeHTML(value.to_s)}\""
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module DiscoApp::Concerns::HasMetafields
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
|
6
|
+
# Write multiple metafields for this object in a single call.
|
7
|
+
#
|
8
|
+
# Expects an argument in a nested hash structure with :namespace => :key =>
|
9
|
+
# :value, eg:
|
10
|
+
#
|
11
|
+
# Product.write_metafields(myapp: {
|
12
|
+
# key1: 'value1',
|
13
|
+
# key2: 'value2'
|
14
|
+
# })
|
15
|
+
#
|
16
|
+
# This method assumes that it is being called within a valid Shopify API
|
17
|
+
# session context, eg @shop.temp { ... }.
|
18
|
+
#
|
19
|
+
# It also assumes that the including class has defined the appropriate value
|
20
|
+
# for SHOPIFY_API_CLASS and that calling the `id` method on the instance
|
21
|
+
# will return the relevant object's Shopify ID.
|
22
|
+
#
|
23
|
+
# Returns true on success, false otherwise.
|
24
|
+
def write_metafields(metafields)
|
25
|
+
self.class::SHOPIFY_API_CLASS.new(
|
26
|
+
id: id,
|
27
|
+
metafields: build_metafields(metafields)
|
28
|
+
).save
|
29
|
+
end
|
30
|
+
|
31
|
+
# Give a nested hash of metafields in the format described above, return
|
32
|
+
# an array of corresponding ShopifyAPI::Metafield instances.
|
33
|
+
def build_metafields(metafields)
|
34
|
+
metafields.map do |namespace, keys|
|
35
|
+
keys.map do |key, value|
|
36
|
+
ShopifyAPI::Metafield.new(
|
37
|
+
namespace: namespace,
|
38
|
+
key: key,
|
39
|
+
value: value,
|
40
|
+
value_type: value.is_a?(Integer) ? :integer : :string
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end.flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/lib/disco_app/version.rb
CHANGED
data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
{
|
2
|
+
"product": {
|
3
|
+
"id": 632910393,
|
4
|
+
"metafields": [
|
5
|
+
{
|
6
|
+
"namespace": "namespace1",
|
7
|
+
"key": "n1key1",
|
8
|
+
"value": "value1",
|
9
|
+
"value_type": "string"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"namespace": "namespace1",
|
13
|
+
"key": "n1key2",
|
14
|
+
"value": 2,
|
15
|
+
"value_type": "integer"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"namespace": "namespace2",
|
19
|
+
"key": "n2key3",
|
20
|
+
"value": "value3",
|
21
|
+
"value_type": "string"
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"namespace": "namespace2",
|
25
|
+
"key": "n2key4",
|
26
|
+
"value": 2,
|
27
|
+
"value_type": "integer"
|
28
|
+
}
|
29
|
+
]
|
30
|
+
}
|
31
|
+
}
|
data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"product": {
|
3
|
+
"id": 632910393,
|
4
|
+
"metafields": [
|
5
|
+
{
|
6
|
+
"namespace": "namespace1",
|
7
|
+
"key": "key1",
|
8
|
+
"value": "value1",
|
9
|
+
"value_type": "string"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"namespace": "namespace1",
|
13
|
+
"key": "key2",
|
14
|
+
"value": 2,
|
15
|
+
"value_type": "integer"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
{% assign model_numeric = 42 %}
|
2
|
+
{% assign model_boolean = true %}
|
3
|
+
{% assign model_empty = nil %}
|
4
|
+
{% assign model_string = "The cat's pyjamas are "great"." %}
|
5
|
+
{% assign model_array_of_numerics = "1@!@2@!@3" | split: "@!@" %}
|
6
|
+
{% assign model_array_of_strings = "A@!@B@!@C" | split: "@!@" %}
|
7
|
+
{% assign model_hash = "{}" %}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DiscoApp::CanBeLiquifiedTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
class Model
|
6
|
+
include ActiveModel::Model
|
7
|
+
include DiscoApp::Concerns::CanBeLiquified
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@attributes = attributes
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_json
|
14
|
+
@attributes.as_json
|
15
|
+
end
|
16
|
+
|
17
|
+
def liquid_model_name
|
18
|
+
'model'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@model = Model.new(
|
24
|
+
numeric: 42,
|
25
|
+
boolean: true,
|
26
|
+
empty: nil,
|
27
|
+
string: "The cat's pyjamas are \"great\".",
|
28
|
+
array_of_numerics: [1, 2, 3],
|
29
|
+
array_of_strings: ['A', 'B', 'C'],
|
30
|
+
hash: {}
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def teardown
|
35
|
+
@model = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Test Liquid output.
|
40
|
+
##
|
41
|
+
|
42
|
+
test 'correct liquid is output for model' do
|
43
|
+
assert_equal liquid_fixture('model.liquid'), @model.to_liquid
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Return an asset fixture as a string.
|
49
|
+
def liquid_fixture(path)
|
50
|
+
filename = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'fixtures', 'liquid', "#{path}")
|
51
|
+
File.read(filename)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DiscoApp::HasMetafieldsTest < ActiveSupport::TestCase
|
4
|
+
include DiscoApp::Test::ShopifyAPI
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@product = products(:ipod)
|
8
|
+
@shop = @product.shop
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
@product = nil
|
13
|
+
@shop = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'can write metafields with a single namespace' do
|
17
|
+
stub_api_request(:put, "#{@shop.admin_url}/products/#{@product.id}.json", 'widget_store/products/write_metafields_single_namespace')
|
18
|
+
assert @shop.temp { @product.write_metafields(
|
19
|
+
namespace1: {
|
20
|
+
key1: 'value1',
|
21
|
+
key2: 2
|
22
|
+
}
|
23
|
+
) }
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'can write metafields with multiple namespaces' do
|
27
|
+
stub_api_request(:put, "#{@shop.admin_url}/products/#{@product.id}.json", 'widget_store/products/write_metafields_multiple_namespaces')
|
28
|
+
assert @shop.temp { @product.write_metafields(
|
29
|
+
namespace1: {
|
30
|
+
n1key1: 'value1',
|
31
|
+
n1key2: 2
|
32
|
+
},
|
33
|
+
namespace2: {
|
34
|
+
n2key3: 'value3',
|
35
|
+
n2key4: 2
|
36
|
+
},
|
37
|
+
) }
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: disco_app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Ballard
|
@@ -440,6 +440,8 @@ files:
|
|
440
440
|
- app/models/disco_app/app_settings.rb
|
441
441
|
- app/models/disco_app/application_charge.rb
|
442
442
|
- app/models/disco_app/concerns/app_settings.rb
|
443
|
+
- app/models/disco_app/concerns/can_be_liquified.rb
|
444
|
+
- app/models/disco_app/concerns/has_metafields.rb
|
443
445
|
- app/models/disco_app/concerns/plan.rb
|
444
446
|
- app/models/disco_app/concerns/plan_code.rb
|
445
447
|
- app/models/disco_app/concerns/renders_assets.rb
|
@@ -642,6 +644,10 @@ files:
|
|
642
644
|
- test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json
|
643
645
|
- test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json
|
644
646
|
- test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json
|
647
|
+
- test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json
|
648
|
+
- test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json
|
649
|
+
- test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json
|
650
|
+
- test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json
|
645
651
|
- test/fixtures/api/widget_store/shop.json
|
646
652
|
- test/fixtures/api/widget_store/webhooks.json
|
647
653
|
- test/fixtures/assets/test.js
|
@@ -653,6 +659,7 @@ files:
|
|
653
659
|
- test/fixtures/disco_app/shops.yml
|
654
660
|
- test/fixtures/disco_app/subscriptions.yml
|
655
661
|
- test/fixtures/js_configurations.yml
|
662
|
+
- test/fixtures/liquid/model.liquid
|
656
663
|
- test/fixtures/products.yml
|
657
664
|
- test/fixtures/webhooks/app_uninstalled.json
|
658
665
|
- test/fixtures/webhooks/product_created.json
|
@@ -662,6 +669,8 @@ files:
|
|
662
669
|
- test/integration/synchronises_test.rb
|
663
670
|
- test/jobs/disco_app/app_installed_job_test.rb
|
664
671
|
- test/jobs/disco_app/app_uninstalled_job_test.rb
|
672
|
+
- test/models/disco_app/can_be_liquified_test.rb
|
673
|
+
- test/models/disco_app/has_metafields_test.rb
|
665
674
|
- test/models/disco_app/plan_test.rb
|
666
675
|
- test/models/disco_app/renders_assets_test.rb
|
667
676
|
- test/models/disco_app/session_test.rb
|
@@ -756,6 +765,7 @@ test_files:
|
|
756
765
|
- test/dummy/config/database.yml
|
757
766
|
- test/dummy/config/database.gitlab-ci.yml
|
758
767
|
- test/dummy/config/application.rb
|
768
|
+
- test/fixtures/liquid/model.liquid
|
759
769
|
- test/fixtures/api/widget_store/assets/create_test_js_response.json
|
760
770
|
- test/fixtures/api/widget_store/assets/create_widget_js_response.json
|
761
771
|
- test/fixtures/api/widget_store/assets/create_test_js_request.json
|
@@ -774,6 +784,10 @@ test_files:
|
|
774
784
|
- test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json
|
775
785
|
- test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json
|
776
786
|
- test/fixtures/api/widget_store/assets/create_widget_js_request.json
|
787
|
+
- test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json
|
788
|
+
- test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json
|
789
|
+
- test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json
|
790
|
+
- test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json
|
777
791
|
- test/fixtures/api/widget_store/webhooks.json
|
778
792
|
- test/fixtures/api/widget_store/charges/create_application_charge_response.json
|
779
793
|
- test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json
|
@@ -822,9 +836,11 @@ test_files:
|
|
822
836
|
- test/controllers/home_controller_test.rb
|
823
837
|
- test/integration/synchronises_test.rb
|
824
838
|
- test/models/disco_app/plan_test.rb
|
839
|
+
- test/models/disco_app/has_metafields_test.rb
|
825
840
|
- test/models/disco_app/shop_test.rb
|
826
841
|
- test/models/disco_app/session_test.rb
|
827
842
|
- test/models/disco_app/subscription_test.rb
|
843
|
+
- test/models/disco_app/can_be_liquified_test.rb
|
828
844
|
- test/models/disco_app/renders_assets_test.rb
|
829
845
|
- test/services/disco_app/charges_service_test.rb
|
830
846
|
- test/services/disco_app/subscription_service_test.rb
|