markety 1.4.3 → 2.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 (40) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +3 -0
  3. data/README.md +66 -15
  4. data/Rakefile +1 -1
  5. data/example_xml/get_lead_failure.xml +42 -0
  6. data/example_xml/get_lead_success.xml +63 -0
  7. data/example_xml/get_lead_success_two_leads.xml +88 -0
  8. data/example_xml/list_op_add_to_list_success.xml +42 -0
  9. data/example_xml/list_op_is_member_of_list_failure.xml +50 -0
  10. data/example_xml/list_op_is_member_of_list_success.xml +51 -0
  11. data/example_xml/list_op_remove_from_list_failure.xml +50 -0
  12. data/example_xml/list_op_remove_from_list_success.xml +42 -0
  13. data/example_xml/sync_lead_failure.xml +60 -0
  14. data/example_xml/sync_lead_success.xml +78 -0
  15. data/lib/markety.rb +26 -1
  16. data/lib/markety/authentication_header.rb +3 -3
  17. data/lib/markety/client.rb +35 -141
  18. data/lib/markety/command.rb +11 -0
  19. data/lib/markety/command/get_lead.rb +27 -0
  20. data/lib/markety/command/list_operation.rb +68 -0
  21. data/lib/markety/command/sync_lead.rb +55 -0
  22. data/lib/markety/enums.rb +18 -16
  23. data/lib/markety/lead.rb +69 -0
  24. data/lib/markety/lead_key.rb +5 -4
  25. data/lib/markety/response.rb +15 -0
  26. data/lib/markety/response/generic_response.rb +45 -0
  27. data/lib/markety/response/get_lead_response.rb +35 -0
  28. data/lib/markety/response/list_operation_response.rb +30 -0
  29. data/lib/markety/response/response_factory.rb +27 -0
  30. data/lib/markety/response/sync_lead_response.rb +32 -0
  31. data/lib/markety/version.rb +1 -3
  32. data/spec/markety/lead_key_spec.rb +10 -11
  33. data/spec/markety/{lead_record_spec.rb → lead_spec.rb} +13 -30
  34. data/spec/markety/response/get_lead_response_spec.rb +170 -0
  35. data/spec/markety/response/list_operation_response_spec.rb +76 -0
  36. data/spec/markety/response/sync_lead_response_spec.rb +107 -0
  37. data/spec/spec_helper.rb +4 -0
  38. data/spec/support/savon_helper.rb +14 -0
  39. metadata +61 -33
  40. data/lib/markety/lead_record.rb +0 -73
@@ -0,0 +1,32 @@
1
+ require 'markety/lead'
2
+ require 'markety/response/generic_response'
3
+
4
+ module Markety
5
+ module Response
6
+ # Response class for SyncLead commands
7
+ class SyncLeadResponse < GenericResponse
8
+
9
+ # +:created+ or +:updated+ (or nil if unsuccessful)
10
+ attr_reader :update_type
11
+ # the updated or created Lead (or nil if unsuccessful)
12
+ attr_reader :updated_lead
13
+ # the ID of the created or updated Lead (or nil if unsuccessful)
14
+ attr_reader :lead_id
15
+
16
+ def initialize(response)
17
+ super(:sync_response,response)
18
+ h = self.to_hash
19
+
20
+ if self.success?
21
+ sync_status = h[:success_sync_lead][:result][:sync_status]
22
+ @lead_id = sync_status[:lead_id]
23
+ @update_type = sync_status[:status].downcase.to_sym
24
+ @updated_lead = ::Markety::Lead.from_hash(h[:success_sync_lead][:result][:lead_record])
25
+ else
26
+ # overwrite super's crap error message with useful one
27
+ @error_message = h[:fault][:detail][:service_exception][:message]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,3 @@
1
1
  module Markety
2
-
3
- VERSION = "1.4.3"
4
-
2
+ VERSION = "2.0"
5
3
  end
@@ -4,29 +4,28 @@ module Markety
4
4
  describe LeadKeyType do
5
5
  it "should define the correct types" do
6
6
  LeadKeyType::IDNUM.should == 'IDNUM'
7
- LeadKeyType::COOKIE.should == 'COOKIE'
8
7
  LeadKeyType::EMAIL.should == 'EMAIL'
9
- LeadKeyType::LEADOWNEREMAIL.should == 'LEADOWNEREMAIL'
10
- LeadKeyType::SFDCACCOUNTID.should == 'SFDCACCOUNTID'
11
- LeadKeyType::SFDCCONTACTID.should == 'SFDCCONTACTID'
12
- LeadKeyType::SFDCLEADID.should == 'SFDCLEADID'
13
- LeadKeyType::SFDCLEADOWNERID.should == 'SFDCLEADOWNERID'
14
- LeadKeyType::SFDCOPPTYID.should == 'SFDCOPPTYID'
8
+ #LeadKeyType::COOKIE.should == 'COOKIE'
9
+ #LeadKeyType::LEADOWNEREMAIL.should == 'LEADOWNEREMAIL'
10
+ #LeadKeyType::SFDCACCOUNTID.should == 'SFDCACCOUNTID'
11
+ #LeadKeyType::SFDCCONTACTID.should == 'SFDCCONTACTID'
12
+ #LeadKeyType::SFDCLEADID.should == 'SFDCLEADID'
13
+ #LeadKeyType::SFDCLEADOWNERID.should == 'SFDCLEADOWNERID'
14
+ #LeadKeyType::SFDCOPPTYID.should == 'SFDCOPPTYID'
15
15
  end
16
16
  end
17
17
 
18
18
  describe LeadKey do
19
+ KEY_VALUE = 'a value'
20
+ KEY_TYPE = LeadKeyType::IDNUM
21
+
19
22
  it "should store type and value on construction" do
20
- KEY_VALUE = 'a value'
21
- KEY_TYPE = LeadKeyType::IDNUM
22
23
  lead_key = LeadKey.new(KEY_TYPE, KEY_VALUE)
23
24
  lead_key.key_type.should == KEY_TYPE
24
25
  lead_key.key_value.should == KEY_VALUE
25
26
  end
26
27
 
27
28
  it "should to_hash correctly" do
28
- KEY_VALUE = 'a value'
29
- KEY_TYPE = LeadKeyType::IDNUM
30
29
  lead_key = LeadKey.new(KEY_TYPE, KEY_VALUE)
31
30
 
32
31
  lead_key.to_hash.should == {
@@ -6,22 +6,22 @@ module Markety
6
6
 
7
7
 
8
8
 
9
- describe LeadRecord do
9
+ describe Lead do
10
10
  it "should store the idnum" do
11
- lead_record = LeadRecord.new(EMAIL, IDNUM)
11
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
12
12
  lead_record.idnum.should == IDNUM
13
13
  end
14
14
 
15
15
  it "should store the email" do
16
- LeadRecord.new(EMAIL, IDNUM).email.should == EMAIL
16
+ Lead.new(email:EMAIL, idnum:IDNUM).email.should == EMAIL
17
17
  end
18
18
 
19
19
  it "should implement == sensibly" do
20
- lead_record1 = LeadRecord.new(EMAIL, IDNUM)
20
+ lead_record1 = Lead.new(email:EMAIL, idnum:IDNUM)
21
21
  lead_record1.set_attribute('favourite color', 'red')
22
22
  lead_record1.set_attribute('age', '100')
23
23
 
24
- lead_record2 = LeadRecord.new(EMAIL, IDNUM)
24
+ lead_record2 = Lead.new(email:EMAIL, idnum:IDNUM)
25
25
  lead_record2.set_attribute('favourite color', 'red')
26
26
  lead_record2.set_attribute('age', '100')
27
27
 
@@ -29,35 +29,18 @@ module Markety
29
29
  end
30
30
 
31
31
  it "should store when attributes are set" do
32
- lead_record = LeadRecord.new(EMAIL, IDNUM)
32
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
33
33
  lead_record.set_attribute('favourite color', 'red')
34
34
  lead_record.get_attribute('favourite color').should == 'red'
35
35
  end
36
36
 
37
37
  it "should store when attributes are updated" do
38
- lead_record = LeadRecord.new(EMAIL, IDNUM)
38
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
39
39
  lead_record.set_attribute('favourite color', 'red')
40
40
  lead_record.set_attribute('favourite color', 'green')
41
41
  lead_record.get_attribute('favourite color').should == 'green'
42
42
  end
43
43
 
44
- it "should yield all attributes through each_attribute_pair" do
45
- lead_record = LeadRecord.new(EMAIL, IDNUM)
46
- lead_record.set_attribute('favourite color', 'red')
47
- lead_record.set_attribute('favourite color', 'green')
48
- lead_record.set_attribute('age', '99')
49
-
50
- pairs = []
51
- lead_record.each_attribute_pair do |attribute_name, attribute_value|
52
- pairs << [attribute_name, attribute_value]
53
- end
54
-
55
- pairs.size.should == 3
56
- pairs.should include(['favourite color', 'green'])
57
- pairs.should include(['age', '99'])
58
- pairs.should include(['Email', EMAIL])
59
- end
60
-
61
44
  it 'should be instantiable from savon hash with no attributes' do
62
45
  savon_hash = {
63
46
  :id => IDNUM,
@@ -67,8 +50,8 @@ module Markety
67
50
  :lead_attribute_list => nil
68
51
  }
69
52
 
70
- actual = LeadRecord.from_hash(savon_hash)
71
- expected = LeadRecord.new(EMAIL, IDNUM)
53
+ actual = Lead.from_hash(savon_hash)
54
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
72
55
 
73
56
  actual.should == expected
74
57
  end
@@ -84,9 +67,9 @@ module Markety
84
67
  {:attribute => { :attr_name => 'FirstName', :attr_value => 'Yaya', :attr_type => 'string'}}
85
68
  }
86
69
 
87
- actual = LeadRecord.from_hash(savon_hash)
70
+ actual = Lead.from_hash(savon_hash)
88
71
 
89
- expected = LeadRecord.new(EMAIL, IDNUM)
72
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
90
73
  expected.set_attribute('FirstName', 'Yaya')
91
74
 
92
75
  actual.should == expected
@@ -107,9 +90,9 @@ module Markety
107
90
  :id => IDNUM
108
91
  }
109
92
 
110
- actual = LeadRecord.from_hash(savon_hash)
93
+ actual = Lead.from_hash(savon_hash)
111
94
 
112
- expected = LeadRecord.new(EMAIL, IDNUM)
95
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
113
96
  expected.set_attribute('Company', 'Yaya')
114
97
  expected.set_attribute('FirstName', 'James')
115
98
  expected.set_attribute('LastName', 'O\'Brien')
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe GetLeadResponse do
6
+
7
+ let(:success_xml) { <<END
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
10
+ <SOAP-ENV:Body>
11
+ <ns1:successGetLead>
12
+ <result>
13
+ <count>1</count>
14
+ <leadRecordList>
15
+ <leadRecord>
16
+ <Id>1001081</Id>
17
+ <Email>foo@example.com</Email>
18
+ <ForeignSysPersonId xsi:nil="true"/>
19
+ <ForeignSysType xsi:nil="true"/>
20
+ <leadAttributeList>
21
+ <attribute>
22
+ <attrName>FirstName</attrName>
23
+ <attrType>string</attrType>
24
+ <attrValue>Burt</attrValue>
25
+ </attribute>
26
+ <attribute>
27
+ <attrName>LastName</attrName>
28
+ <attrType>string</attrType>
29
+ <attrValue>Reynolds</attrValue>
30
+ </attribute>
31
+ </leadAttributeList>
32
+ </leadRecord>
33
+ </leadRecordList>
34
+ </result>
35
+ </ns1:successGetLead>
36
+ </SOAP-ENV:Body>
37
+ </SOAP-ENV:Envelope>
38
+ END
39
+ }
40
+
41
+ let(:success_xml_two_leads) { <<END
42
+ <?xml version="1.0" encoding="UTF-8"?>
43
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
44
+ <SOAP-ENV:Body>
45
+ <ns1:successGetLead>
46
+ <result>
47
+ <count>2</count>
48
+ <leadRecordList>
49
+ <leadRecord>
50
+ <Id>1001084</Id>
51
+ <Email>foo@example.com</Email>
52
+ <ForeignSysPersonId xsi:nil="true"/>
53
+ <ForeignSysType xsi:nil="true"/>
54
+ <leadAttributeList>
55
+ <attribute>
56
+ <attrName>Company</attrName>
57
+ <attrType>string</attrType>
58
+ <attrValue>The Price is Right</attrValue>
59
+ </attribute>
60
+ <attribute>
61
+ <attrName>FirstName</attrName>
62
+ <attrType>string</attrType>
63
+ <attrValue>Bob</attrValue>
64
+ </attribute>
65
+ <attribute>
66
+ <attrName>LastName</attrName>
67
+ <attrType>string</attrType>
68
+ <attrValue>Barker</attrValue>
69
+ </attribute>
70
+ </leadAttributeList>
71
+ </leadRecord>
72
+ <leadRecord>
73
+ <Id>1001081</Id>
74
+ <Email>foo@example.com</Email>
75
+ <ForeignSysPersonId xsi:nil="true"/>
76
+ <ForeignSysType xsi:nil="true"/>
77
+ <leadAttributeList>
78
+ <attribute>
79
+ <attrName>Company</attrName>
80
+ <attrType>string</attrType>
81
+ <attrValue>foo</attrValue>
82
+ </attribute>
83
+ <attribute>
84
+ <attrName>FirstName</attrName>
85
+ <attrType>string</attrType>
86
+ <attrValue>foo</attrValue>
87
+ </attribute>
88
+ <attribute>
89
+ <attrName>LastName</attrName>
90
+ <attrType>string</attrType>
91
+ <attrValue>foo</attrValue>
92
+ </attribute>
93
+ <attribute>
94
+ <attrName>LeadStatus</attrName>
95
+ <attrType>string</attrType>
96
+ <attrValue>Inactive</attrValue>
97
+ </attribute>
98
+ </leadAttributeList>
99
+ </leadRecord>
100
+ </leadRecordList>
101
+ </result>
102
+ </ns1:successGetLead>
103
+ </SOAP-ENV:Body>
104
+ </SOAP-ENV:Envelope>
105
+ END
106
+ }
107
+
108
+ let(:failure_xml) { <<END
109
+ <?xml version="1.0" encoding="UTF-8"?>
110
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
111
+ <SOAP-ENV:Body>
112
+ <SOAP-ENV:Fault>
113
+ <faultcode>SOAP-ENV:Client</faultcode>
114
+ <faultstring>20103 - Lead not found</faultstring>
115
+ <detail>
116
+ <ns1:serviceException xmlns:ns1="http://www.marketo.com/mktows/">
117
+ <name>mktServiceException</name>
118
+ <message>No lead found with EMAIL = pants@example.com (20103)</message>
119
+ <code>20103</code>
120
+ </ns1:serviceException>
121
+ </detail>
122
+ </SOAP-ENV:Fault>
123
+ </SOAP-ENV:Body>
124
+ </SOAP-ENV:Envelope>
125
+ END
126
+ }
127
+
128
+
129
+ it 'can construct from a success - one lead' do
130
+ savon_resp = SavonHelper.create_response(success_xml)
131
+ r = GetLeadResponse.new(savon_resp)
132
+
133
+ # GenericResponse fields
134
+ r.success?.should == true
135
+ r.error_message.should be_nil
136
+
137
+ # SyncLeadResponse fields
138
+ r.leads.length.should == 1
139
+ r.leads.first.get_attribute("FirstName").should == "Burt"
140
+ end
141
+
142
+ it 'can construct from a success - two leads' do
143
+ savon_resp = SavonHelper.create_response(success_xml_two_leads)
144
+ r = GetLeadResponse.new(savon_resp)
145
+
146
+ # GenericResponse fields
147
+ r.success?.should == true
148
+ r.error_message.should be_nil
149
+
150
+ # SyncLeadResponse fields
151
+ r.leads.length.should == 2
152
+ r.leads[0].get_attribute("Company").should == "The Price is Right"
153
+ r.leads[1].get_attribute("Company").should == "foo"
154
+ end
155
+
156
+
157
+ it 'can construct from a failure' do
158
+ savon_resp = SavonHelper.create_response(failure_xml)
159
+ r = GetLeadResponse.new(savon_resp)
160
+
161
+ # GenericResponse fields
162
+ r.success?.should == false
163
+ r.error_message.should == "No lead found with EMAIL = pants@example.com (20103)"
164
+
165
+ # SyncLeadResponse fields
166
+ r.leads.empty?.should be true
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe ListOperationResponse do
6
+
7
+ let(:success_xml) {<<END
8
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.marketo.com/mktows/">
9
+ <SOAP-ENV:Body>
10
+ <ns1:successListOperation>
11
+ <result>
12
+ <success>true</success>
13
+ <statusList>
14
+ <leadStatus>
15
+ <leadKey>
16
+ <keyType>IDNUM</keyType>
17
+ <keyValue>1001088</keyValue>
18
+ </leadKey>
19
+ <status>true</status>
20
+ </leadStatus>
21
+ </statusList>
22
+ </result>
23
+ </ns1:successListOperation>
24
+ </SOAP-ENV:Body>
25
+ </SOAP-ENV:Envelope>
26
+ END
27
+ }
28
+
29
+ let(:failure_xml) {<<END
30
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.marketo.com/mktows/">
31
+ <SOAP-ENV:Body>
32
+ <ns1:successListOperation>
33
+ <result>
34
+ <success>false</success>
35
+ <statusList>
36
+ <leadStatus>
37
+ <leadKey>
38
+ <keyType>IDNUM</keyType>
39
+ <keyValue>1001086</keyValue>
40
+ </leadKey>
41
+ <status>false</status>
42
+ </leadStatus>
43
+ </statusList>
44
+ </result>
45
+ </ns1:successListOperation>
46
+ </SOAP-ENV:Body>
47
+ </SOAP-ENV:Envelope>
48
+ END
49
+ }
50
+
51
+
52
+ it 'can construct from a success' do
53
+ savon_resp = SavonHelper.create_response(success_xml)
54
+ r = ListOperationResponse.new(savon_resp)
55
+
56
+ # GenericResponse fields
57
+ r.success?.should == true
58
+ r.error_message.should be_nil
59
+
60
+ r.list_operation_success?.should == true
61
+ end
62
+
63
+ it 'can construct from a failure' do
64
+ savon_resp = SavonHelper.create_response(failure_xml)
65
+ r = ListOperationResponse.new(savon_resp)
66
+
67
+ # GenericResponse fields
68
+ r.success?.should == true
69
+ r.error_message.should be_nil
70
+
71
+ r.list_operation_success?.should == false
72
+ end
73
+
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe SyncLeadResponse do
6
+
7
+ let(:success_xml) { <<END
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
10
+ <SOAP-ENV:Body>
11
+ <ns1:successSyncLead>
12
+ <result>
13
+ <leadId>1001064</leadId>
14
+ <syncStatus>
15
+ <leadId>1001064</leadId>
16
+ <status>CREATED</status>
17
+ <error xsi:nil="true"/>
18
+ </syncStatus>
19
+ <leadRecord>
20
+ <Id>1001064</Id>
21
+ <Email>spiderman@example.com</Email>
22
+ <ForeignSysPersonId xsi:nil="true"/>
23
+ <ForeignSysType xsi:nil="true"/>
24
+ <leadAttributeList>
25
+ <attribute>
26
+ <attrName>FirstName</attrName>
27
+ <attrType>string</attrType>
28
+ <attrValue>Peter</attrValue>
29
+ </attribute>
30
+ <attribute>
31
+ <attrName>LastName</attrName>
32
+ <attrType>string</attrType>
33
+ <attrValue>Parker</attrValue>
34
+ </attribute>
35
+ <attribute>
36
+ <attrName>Website</attrName>
37
+ <attrType>url</attrType>
38
+ <attrValue>example.com</attrValue>
39
+ </attribute>
40
+ </leadAttributeList>
41
+ </leadRecord>
42
+ </result>
43
+ </ns1:successSyncLead>
44
+ </SOAP-ENV:Body>
45
+ </SOAP-ENV:Envelope>
46
+ END
47
+ }
48
+
49
+ let(:failure_xml) { <<END
50
+ <?xml version="1.0" encoding="UTF-8"?>
51
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
52
+ <SOAP-ENV:Body>
53
+ <SOAP-ENV:Fault>
54
+ <faultcode>SOAP-ENV:Client</faultcode>
55
+ <faultstring>20105 - Unknown lead field</faultstring>
56
+ <detail>
57
+ <ns1:serviceException xmlns:ns1="http://www.marketo.com/mktows/">
58
+ <name>mktServiceException</name>
59
+ <message>syncLead operation failed: unknown fields for import: pants (20105)</message>
60
+ <code>20105</code>
61
+ </ns1:serviceException>
62
+ </detail>
63
+ </SOAP-ENV:Fault>
64
+ </SOAP-ENV:Body>
65
+ </SOAP-ENV:Envelope>
66
+ END
67
+ }
68
+
69
+
70
+
71
+ it 'can construct from a success' do
72
+ savon_resp = SavonHelper.create_response(success_xml)
73
+
74
+ r = SyncLeadResponse.new(savon_resp)
75
+
76
+ # GenericResponse fields
77
+ r.success?.should == true
78
+ r.error_message.should be_nil
79
+ # to_xml
80
+ # to_hash
81
+
82
+ # SyncLeadResponse fields
83
+ r.lead_id.should == "1001064"
84
+ r.update_type.should == :created
85
+ r.updated_lead.is_a?(::Markety::Lead).should == true
86
+ end
87
+
88
+ it 'can construct from a failure' do
89
+ savon_resp = SavonHelper.create_response(failure_xml)
90
+
91
+ r = SyncLeadResponse.new(savon_resp)
92
+
93
+ # GenericResponse fields
94
+ r.success?.should == false
95
+ r.error_message.should == "syncLead operation failed: unknown fields for import: pants (20105)"
96
+ # to_xml
97
+ # to_hash
98
+
99
+ # SyncLeadResponse fields
100
+ r.lead_id.should be_nil
101
+ r.update_type.should be_nil
102
+ r.updated_lead.should be_nil
103
+ end
104
+
105
+ end #describe SyncLeadResponse
106
+ end #module Response
107
+ end #module Markety