frodo 0.10.8 → 0.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 242a3a7ce0b9c2a356ba2cdba2445f8a7be56ebfce1c17b542389ed2e05941e8
4
- data.tar.gz: fbbca282e8ef8ab298414dff1f646a471791b6ddff5461513647841d4a3717f8
3
+ metadata.gz: c450b1b8b973887c68afbcac4aa71b3adf58a92aeb4f5e85df13487c534709cf
4
+ data.tar.gz: 4ac726bbffccab55106a9fc9825b4c2f2c4d0c96b8106fc1452236f1cb63d3d8
5
5
  SHA512:
6
- metadata.gz: ec596fae3c352d1fe14761180222b61807156fbff0827f4dcf5cb66e8a1cc4bf65e0af18d9166993bb3b2073ba5ab193fb08dc7153d2ede76c1b590176d5e38a
7
- data.tar.gz: 024b0d345a278018da16c3e0cc5b257e45ada7bd7ffd6b0f54ad42287ecdeb2243216cbbd7e2830d8ca6a7aca17d8da5c697df7d1d5a9fce7bdb06749816b0c5
6
+ metadata.gz: e4ccd11d628aae7f69bc9a3bd0237451f6158849533c9366e3604b803a38e71105fcf5dde60956b36e1ea9de9165c7c3bef2cb69cf65bb8faf1d0f398fbf8e0a
7
+ data.tar.gz: c8e7948d55791d0f226f1bae3409fcbd9c45dc80514669b10355966bc0f6eb9ad5d0338f600c5039679cacafcf646d4f7dc4803da4e2512ddc1e3c1deccd3ba5
@@ -157,7 +157,6 @@ module Frodo
157
157
  raise ArgumentError, 'ID field missing from provided attributes' if entity.is_new?
158
158
 
159
159
  api_patch url_chunk, attrs do |req|
160
- puts "#{req.class.name}"
161
160
  req.headers.merge!(additional_headers)
162
161
  end
163
162
  true
@@ -303,7 +303,6 @@ module Frodo
303
303
  entity.instance_eval do
304
304
  new_links = instance_variable_get(:@links) || {}
305
305
  schema.navigation_properties[name].each do |nav_name, details|
306
- p nav_name
307
306
  xml_doc.xpath("./link[@title='#{nav_name}']").each do |node|
308
307
  next if node.attributes['type'].nil?
309
308
  next unless node.attributes['type'].value =~ /^application\/atom\+xml;type=(feed|entry)$/i
@@ -88,33 +88,48 @@ module Frodo
88
88
  # @return [Hash<Hash<Frodo::NavigationProperty>>]
89
89
  def navigation_properties
90
90
  @navigation_properties ||= metadata.xpath('//EntityType').map do |entity_type_def|
91
+ entity_name = entity_type_def.attributes['Name'].value
91
92
  [
92
- entity_type_def.attributes['Name'].value,
93
- entity_type_def.xpath('./NavigationProperty').map do |nav_property_def|
94
- [
95
- nav_property_def.attributes['Name'].value,
96
- ::Frodo::NavigationProperty.build(nav_property_def)
97
- ]
98
- end.to_h
93
+ entity_name,
94
+ navigation_properties_for_entity(entity_name)
99
95
  ]
100
96
  end.to_h
101
97
  end
102
98
 
99
+ # Get the list of navigation properties and their various options for the supplied
100
+ # Entity name.
101
+ # @param entity_name [to_s]
102
+ # @return [Hash]
103
+ # @api private
104
+ def navigation_properties_for_entity(entity_name)
105
+ type_definition = get_type_definition_for_entity_name(entity_name)
106
+
107
+ parent_properties = recurse_on_parent_type(type_definition)
108
+
109
+ properties_to_return = type_definition.xpath('./NavigationProperty').map do |nav_property_def|
110
+ [
111
+ nav_property_def.attributes['Name'].value,
112
+ ::Frodo::NavigationProperty.build(nav_property_def)
113
+ ]
114
+ end.to_h
115
+ parent_properties.merge!(properties_to_return)
116
+ end
117
+
103
118
  # Returns a hash for finding the associated read-only value property for a given
104
119
  # navigation property
105
- # @return [Hash<String, Hash<String, String>>]
106
- def referential_constraints
107
- @referential_constraints ||= metadata.xpath('//EntityType').map do |entity_type_def|
120
+ # @return Hash<String, String>
121
+ def referential_constraints_for_entity(entity_name)
122
+ type_definition = get_type_definition_for_entity_name(entity_name)
123
+
124
+ parent_refcons = recurse_on_parent_type(type_definition)
125
+
126
+ refcons_to_return = type_definition.xpath('./NavigationProperty[ReferentialConstraint]').map do |nav_property_def|
108
127
  [
109
- entity_type_def.attributes['Name'].value,
110
- entity_type_def.xpath('./NavigationProperty[ReferentialConstraint]').map do |nav_property_def|
111
- [
112
- nav_property_def.attributes['Name'].value,
113
- nav_property_def.xpath('./ReferentialConstraint').first.attributes['Property'].value
114
- ]
115
- end.to_h
128
+ nav_property_def.attributes['Name'].value,
129
+ nav_property_def.xpath('./ReferentialConstraint').first.attributes['Property'].value
116
130
  ]
117
131
  end.to_h
132
+ parent_refcons.merge!(refcons_to_return)
118
133
  end
119
134
 
120
135
  # Get the property type for an entity from metadata.
@@ -140,17 +155,10 @@ module Frodo
140
155
  # @return [Hash]
141
156
  # @api private
142
157
  def properties_for_entity(entity_name)
143
- type_definition = metadata.xpath("//EntityType[@Name='#{entity_name}']").first
144
-
145
- raise ArgumentError, "Unknown EntityType: #{entity_name}" if type_definition.nil?
158
+ type_definition = get_type_definition_for_entity_name(entity_name)
146
159
  properties_to_return = {}
147
160
 
148
- parent_properties = if base_type = type_definition.attributes['BaseType']
149
- parent_type = base_type.value.split('.').last
150
- properties_for_entity(parent_type)
151
- else
152
- {}
153
- end
161
+ parent_properties = recurse_on_parent_type(type_definition)
154
162
 
155
163
  type_definition.xpath('./Property').each do |property_xml|
156
164
  property_name, property = process_property_from_xml(property_xml)
@@ -183,5 +191,21 @@ module Frodo
183
191
 
184
192
  return [property_name, property]
185
193
  end
194
+
195
+ def get_type_definition_for_entity_name(entity_name)
196
+ type_definition = metadata.xpath("//EntityType[@Name='#{entity_name}']").first
197
+ raise ArgumentError, "Unknown EntityType: #{entity_name}" if type_definition.nil?
198
+ return type_definition
199
+ end
200
+
201
+ def recurse_on_parent_type(type_definition)
202
+ meth = caller_locations(1,1)[0].label
203
+ if base_type = type_definition.attributes['BaseType']
204
+ parent_type = base_type.value.split('.').last
205
+ return method(meth).call(parent_type)
206
+ end
207
+ return {}
208
+ end
209
+
186
210
  end
187
211
  end
@@ -1,3 +1,3 @@
1
1
  module Frodo
2
- VERSION = '0.10.8'
2
+ VERSION = '0.11.0'
3
3
  end
@@ -11,6 +11,200 @@
11
11
  <edmx:DataServices>
12
12
  <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Microsoft.Dynamics.CRM" Alias="mscrm">
13
13
  <EntityType Name="crmbaseentity" Abstract="true"/>
14
+ <EntityType Name="activitypointer" BaseType="mscrm.crmbaseentity" Abstract="true">
15
+ <Key>
16
+ <PropertyRef Name="activityid"/>
17
+ </Key>
18
+ <Property Name="lastonholdtime" Type="Edm.DateTimeOffset"/>
19
+ <Property Name="_owningteam_value" Type="Edm.Guid"/>
20
+ <Property Name="exchangeitemid" Type="Edm.String" Unicode="false"/>
21
+ <Property Name="ismapiprivate" Type="Edm.Boolean"/>
22
+ <Property Name="createdon" Type="Edm.DateTimeOffset"/>
23
+ <Property Name="seriesid" Type="Edm.Guid"/>
24
+ <Property Name="_regardingobjectid_value" Type="Edm.Guid"/>
25
+ <Property Name="deliverylastattemptedon" Type="Edm.DateTimeOffset"/>
26
+ <Property Name="isbilled" Type="Edm.Boolean"/>
27
+ <Property Name="isworkflowcreated" Type="Edm.Boolean"/>
28
+ <Property Name="_sendermailboxid_value" Type="Edm.Guid"/>
29
+ <Property Name="scheduledend" Type="Edm.DateTimeOffset"/>
30
+ <Property Name="description" Type="Edm.String" Unicode="false"/>
31
+ <Property Name="onholdtime" Type="Edm.Int32"/>
32
+ <Property Name="_modifiedby_value" Type="Edm.Guid"/>
33
+ <Property Name="community" Type="Edm.Int32"/>
34
+ <Property Name="sortdate" Type="Edm.DateTimeOffset"/>
35
+ <Property Name="instancetypecode" Type="Edm.Int32"/>
36
+ <Property Name="timezoneruleversionnumber" Type="Edm.Int32"/>
37
+ <Property Name="_createdonbehalfby_value" Type="Edm.Guid"/>
38
+ <Property Name="_createdby_value" Type="Edm.Guid"/>
39
+ <Property Name="_transactioncurrencyid_value" Type="Edm.Guid"/>
40
+ <Property Name="versionnumber" Type="Edm.Int64"/>
41
+ <Property Name="processid" Type="Edm.Guid"/>
42
+ <Property Name="prioritycode" Type="Edm.Int32"/>
43
+ <Property Name="_serviceid_value" Type="Edm.Guid"/>
44
+ <Property Name="_slaid_value" Type="Edm.Guid"/>
45
+ <Property Name="stageid" Type="Edm.Guid"/>
46
+ <Property Name="actualstart" Type="Edm.DateTimeOffset"/>
47
+ <Property Name="_owningbusinessunit_value" Type="Edm.Guid"/>
48
+ <Property Name="_owninguser_value" Type="Edm.Guid"/>
49
+ <Property Name="utcconversiontimezonecode" Type="Edm.Int32"/>
50
+ <Property Name="exchangeweblink" Type="Edm.String" Unicode="false"/>
51
+ <Property Name="scheduleddurationminutes" Type="Edm.Int32"/>
52
+ <Property Name="senton" Type="Edm.DateTimeOffset"/>
53
+ <Property Name="scheduledstart" Type="Edm.DateTimeOffset"/>
54
+ <Property Name="_slainvokedid_value" Type="Edm.Guid"/>
55
+ <Property Name="statecode" Type="Edm.Int32"/>
56
+ <Property Name="subject" Type="Edm.String" Unicode="false"/>
57
+ <Property Name="postponeactivityprocessinguntil" Type="Edm.DateTimeOffset"/>
58
+ <Property Name="_modifiedonbehalfby_value" Type="Edm.Guid"/>
59
+ <Property Name="exchangerate" Type="Edm.Decimal" Scale="Variable"/>
60
+ <Property Name="isregularactivity" Type="Edm.Boolean"/>
61
+ <Property Name="deliveryprioritycode" Type="Edm.Int32"/>
62
+ <Property Name="actualdurationminutes" Type="Edm.Int32"/>
63
+ <Property Name="traversedpath" Type="Edm.String" Unicode="false"/>
64
+ <Property Name="activityid" Type="Edm.Guid"/>
65
+ <Property Name="activitytypecode" Type="Edm.String" Unicode="false"/>
66
+ <Property Name="activityadditionalparams" Type="Edm.String" Unicode="false"/>
67
+ <Property Name="modifiedon" Type="Edm.DateTimeOffset"/>
68
+ <Property Name="_ownerid_value" Type="Edm.Guid"/>
69
+ <Property Name="leftvoicemail" Type="Edm.Boolean"/>
70
+ <Property Name="statuscode" Type="Edm.Int32"/>
71
+ <Property Name="actualend" Type="Edm.DateTimeOffset"/>
72
+ <NavigationProperty Name="regardingobjectid_entitlement" Type="mscrm.entitlement" Nullable="false" Partner="entitlement_ActivityPointers">
73
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="entitlementid"/>
74
+ </NavigationProperty>
75
+ <NavigationProperty Name="createdby" Type="mscrm.systemuser" Nullable="false" Partner="lk_activitypointer_createdby">
76
+ <ReferentialConstraint Property="_createdby_value" ReferencedProperty="systemuserid"/>
77
+ </NavigationProperty>
78
+ <NavigationProperty Name="slainvokedid_activitypointer_sla" Type="mscrm.sla" Nullable="false" Partner="sla_activitypointer">
79
+ <ReferentialConstraint Property="_slainvokedid_value" ReferencedProperty="slaid"/>
80
+ </NavigationProperty>
81
+ <NavigationProperty Name="regardingobjectid_account" Type="mscrm.account" Nullable="false" Partner="Account_ActivityPointers">
82
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="accountid"/>
83
+ </NavigationProperty>
84
+ <NavigationProperty Name="regardingobjectid_contact" Type="mscrm.contact" Nullable="false" Partner="Contact_ActivityPointers">
85
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="contactid"/>
86
+ </NavigationProperty>
87
+ <NavigationProperty Name="regardingobjectid_msdyn_postalbum" Type="mscrm.msdyn_postalbum" Nullable="false" Partner="msdyn_postalbum_ActivityPointers">
88
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="msdyn_postalbumid"/>
89
+ </NavigationProperty>
90
+ <NavigationProperty Name="regardingobjectid_bookableresourcebookingheader" Type="mscrm.bookableresourcebookingheader" Nullable="false" Partner="bookableresourcebookingheader_ActivityPointers">
91
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="bookableresourcebookingheaderid"/>
92
+ </NavigationProperty>
93
+ <NavigationProperty Name="activity_pointer_phonecall" Type="Collection(mscrm.phonecall)" Partner="activityid_activitypointer"/>
94
+ <NavigationProperty Name="regardingobjectid_opportunity" Type="mscrm.opportunity" Nullable="false" Partner="Opportunity_ActivityPointers">
95
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="opportunityid"/>
96
+ </NavigationProperty>
97
+ <NavigationProperty Name="activitypointer_connections1" Type="Collection(mscrm.connection)" Partner="record1id_activitypointer"/>
98
+ <NavigationProperty Name="modifiedby" Type="mscrm.systemuser" Nullable="false" Partner="lk_activitypointer_modifiedby">
99
+ <ReferentialConstraint Property="_modifiedby_value" ReferencedProperty="systemuserid"/>
100
+ </NavigationProperty>
101
+ <NavigationProperty Name="activity_pointer_BulkOperation_logs" Type="Collection(mscrm.bulkoperationlog)" Partner="bulkoperationid_activitypointer"/>
102
+ <NavigationProperty Name="regardingobjectid_quote" Type="mscrm.quote" Nullable="false" Partner="Quote_ActivityPointers">
103
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="quoteid"/>
104
+ </NavigationProperty>
105
+ <NavigationProperty Name="regardingobjectid_campaignactivity" Type="mscrm.campaignactivity" Nullable="false" Partner="CampaignActivity_ActivityPointers"/>
106
+ <NavigationProperty Name="activity_pointer_incident_resolution" Type="Collection(mscrm.incidentresolution)" Partner="activityid_activitypointer"/>
107
+ <NavigationProperty Name="activity_pointer_li_inmail" Type="Collection(mscrm.li_inmail)" Partner="activityid_li_inmail"/>
108
+ <NavigationProperty Name="activity_pointer_fax" Type="Collection(mscrm.fax)" Partner="activityid_activitypointer"/>
109
+ <NavigationProperty Name="activity_pointer_opportunity_close" Type="Collection(mscrm.opportunityclose)" Partner="activityid_activitypointer"/>
110
+ <NavigationProperty Name="ActivityPointer_BulkDeleteFailures" Type="Collection(mscrm.bulkdeletefailure)" Partner="regardingobjectid_activitypointer"/>
111
+ <NavigationProperty Name="modifiedonbehalfby" Type="mscrm.systemuser" Nullable="false" Partner="lk_activitypointer_modifiedonbehalfby">
112
+ <ReferentialConstraint Property="_modifiedonbehalfby_value" ReferencedProperty="systemuserid"/>
113
+ </NavigationProperty>
114
+ <NavigationProperty Name="activity_pointer_BulkOperation" Type="Collection(mscrm.bulkoperation)" Partner="activityid_activitypointer"/>
115
+ <NavigationProperty Name="regardingobjectid_site" Type="mscrm.site" Nullable="false" Partner="site_ActivityPointers">
116
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="siteid"/>
117
+ </NavigationProperty>
118
+ <NavigationProperty Name="activity_pointer_campaignresponse" Type="Collection(mscrm.campaignresponse)" Partner="activityid_activitypointer"/>
119
+ <NavigationProperty Name="regardingobjectid_entitlementtemplate" Type="mscrm.entitlementtemplate" Nullable="false" Partner="entitlementtemplate_ActivityPointers">
120
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="entitlementtemplateid"/>
121
+ </NavigationProperty>
122
+ <NavigationProperty Name="regardingobjectid_new_interactionforemail" Type="mscrm.interactionforemail" Nullable="false" Partner="new_interactionforemail_ActivityPointers">
123
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="interactionforemailid"/>
124
+ </NavigationProperty>
125
+ <NavigationProperty Name="regardingobjectid_lead" Type="mscrm.lead" Nullable="false" Partner="Lead_ActivityPointers">
126
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="leadid"/>
127
+ </NavigationProperty>
128
+ <NavigationProperty Name="createdonbehalfby" Type="mscrm.systemuser" Nullable="false" Partner="lk_activitypointer_createdonbehalfby">
129
+ <ReferentialConstraint Property="_createdonbehalfby_value" ReferencedProperty="systemuserid"/>
130
+ </NavigationProperty>
131
+ <NavigationProperty Name="ActivityPointer_AsyncOperations" Type="Collection(mscrm.asyncoperation)" Partner="regardingobjectid_activitypointer"/>
132
+ <NavigationProperty Name="activity_pointer_recurringappointmentmaster" Type="Collection(mscrm.recurringappointmentmaster)" Partner="activityid_activitypointer"/>
133
+ <NavigationProperty Name="regardingobjectid_salesorder" Type="mscrm.salesorder" Nullable="false" Partner="SalesOrder_ActivityPointers">
134
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="salesorderid"/>
135
+ </NavigationProperty>
136
+ <NavigationProperty Name="owninguser" Type="mscrm.systemuser" Nullable="false" Partner="user_activity">
137
+ <ReferentialConstraint Property="_owninguser_value" ReferencedProperty="systemuserid"/>
138
+ </NavigationProperty>
139
+ <NavigationProperty Name="activity_pointer_order_close" Type="Collection(mscrm.orderclose)" Partner="activityid_activitypointer"/>
140
+ <NavigationProperty Name="activity_pointer_service_appointment" Type="Collection(mscrm.serviceappointment)" Partner="activityid_activitypointer"/>
141
+ <NavigationProperty Name="CreatedActivity_BulkOperationLogs" Type="Collection(mscrm.bulkoperationlog)" Partner="createdobjectid_activitypointer"/>
142
+ <NavigationProperty Name="activity_pointer_campaignactivity" Type="Collection(mscrm.campaignactivity)" Partner="activityid_activitypointer"/>
143
+ <NavigationProperty Name="activity_pointer_appointment" Type="Collection(mscrm.appointment)" Partner="activityid_activitypointer"/>
144
+ <NavigationProperty Name="activity_pointer_quote_close" Type="Collection(mscrm.quoteclose)" Partner="activityid_activitypointer"/>
145
+ <NavigationProperty Name="regardingobjectid_invoice" Type="mscrm.invoice" Nullable="false" Partner="Invoice_ActivityPointers">
146
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="invoiceid"/>
147
+ </NavigationProperty>
148
+ <NavigationProperty Name="activity_pointer_email" Type="Collection(mscrm.email)" Partner="activityid_activitypointer"/>
149
+ <NavigationProperty Name="transactioncurrencyid" Type="mscrm.transactioncurrency" Nullable="false" Partner="TransactionCurrency_ActivityPointer">
150
+ <ReferentialConstraint Property="_transactioncurrencyid_value" ReferencedProperty="transactioncurrencyid"/>
151
+ </NavigationProperty>
152
+ <NavigationProperty Name="regardingobjectid_knowledgearticle" Type="mscrm.knowledgearticle" Nullable="false" Partner="KnowledgeArticle_ActivityPointers">
153
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="knowledgearticleid"/>
154
+ </NavigationProperty>
155
+ <NavigationProperty Name="ownerid" Type="mscrm.principal" Nullable="false" Partner="owner_activitypointers">
156
+ <ReferentialConstraint Property="_ownerid_value" ReferencedProperty="ownerid"/>
157
+ </NavigationProperty>
158
+ <NavigationProperty Name="activity_campaignresponse" Type="Collection(mscrm.campaignresponse)" Partner="originatingactivityid_activitypointer"/>
159
+ <NavigationProperty Name="regardingobjectid_knowledgebaserecord" Type="mscrm.knowledgebaserecord" Nullable="false" Partner="KnowledgeBaseRecord_ActivityPointers">
160
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="knowledgebaserecordid"/>
161
+ </NavigationProperty>
162
+ <NavigationProperty Name="activity_pointer_letter" Type="Collection(mscrm.letter)" Partner="activityid_activitypointer"/>
163
+ <NavigationProperty Name="activity_pointer_recurrencerule" Type="Collection(mscrm.recurrencerule)" Partner="objectid"/>
164
+ <NavigationProperty Name="serviceid" Type="mscrm.service" Nullable="false" Partner="service_activity_pointers">
165
+ <ReferentialConstraint Property="_serviceid_value" ReferencedProperty="serviceid"/>
166
+ </NavigationProperty>
167
+ <NavigationProperty Name="sla_activitypointer_sla" Type="mscrm.sla" Nullable="false" Partner="manualsla_activitypointer">
168
+ <ReferentialConstraint Property="_slaid_value" ReferencedProperty="slaid"/>
169
+ </NavigationProperty>
170
+ <NavigationProperty Name="activity_pointer_activity_mime_attachment" Type="Collection(mscrm.activitymimeattachment)" Partner="objectid_activitypointer"/>
171
+ <NavigationProperty Name="regardingobjectid_bulkoperation" Type="mscrm.bulkoperation" Nullable="false" Partner="BulkOperation_ActivityPointers"/>
172
+ <NavigationProperty Name="owningbusinessunit" Type="mscrm.businessunit" Nullable="false" Partner="business_unit_activitypointer">
173
+ <ReferentialConstraint Property="_owningbusinessunit_value" ReferencedProperty="businessunitid"/>
174
+ </NavigationProperty>
175
+ <NavigationProperty Name="activity_pointer_msfp_surveyinvite" Type="Collection(mscrm.msfp_surveyinvite)" Partner="activityid_msfp_surveyinvite"/>
176
+ <NavigationProperty Name="ActivityPointer_CampaignActivityItems" Type="Collection(mscrm.campaignactivityitem)" Partner="campaignactivityid"/>
177
+ <NavigationProperty Name="activitypointer_activity_parties" Type="Collection(mscrm.activityparty)" Partner="activityid_activitypointer"/>
178
+ <NavigationProperty Name="activitypointer_connections2" Type="Collection(mscrm.connection)" Partner="record2id_activitypointer"/>
179
+ <NavigationProperty Name="regardingobjectid_bookableresourcebooking" Type="mscrm.bookableresourcebooking" Nullable="false" Partner="bookableresourcebooking_ActivityPointers">
180
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="bookableresourcebookingid"/>
181
+ </NavigationProperty>
182
+ <NavigationProperty Name="activity_pointer_msfp_surveyresponse" Type="Collection(mscrm.msfp_surveyresponse)" Partner="activityid_msfp_surveyresponse"/>
183
+ <NavigationProperty Name="regardingobjectid_campaign" Type="mscrm.campaign" Nullable="false" Partner="Campaign_ActivityPointers">
184
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="campaignid"/>
185
+ </NavigationProperty>
186
+ <NavigationProperty Name="regardingobjectid_msdyn_playbookinstance" Type="mscrm.msdyn_playbookinstance" Nullable="false" Partner="msdyn_playbookinstance_ActivityPointers">
187
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="msdyn_playbookinstanceid"/>
188
+ </NavigationProperty>
189
+ <NavigationProperty Name="owningteam" Type="mscrm.team" Nullable="false" Partner="team_activity">
190
+ <ReferentialConstraint Property="_owningteam_value" ReferencedProperty="teamid"/>
191
+ </NavigationProperty>
192
+ <NavigationProperty Name="sendermailboxid" Type="mscrm.mailbox" Nullable="false" Partner="activitypointer_sendermailboxid_mailbox">
193
+ <ReferentialConstraint Property="_sendermailboxid_value" ReferencedProperty="mailboxid"/>
194
+ </NavigationProperty>
195
+ <NavigationProperty Name="ActivityPointer_QueueItem" Type="Collection(mscrm.queueitem)" Partner="objectid_activitypointer"/>
196
+ <NavigationProperty Name="slakpiinstance_activitypointer" Type="Collection(mscrm.slakpiinstance)" Partner="regarding_activitypointer"/>
197
+ <NavigationProperty Name="activity_pointer_li_pointdrivepresentationviewed" Type="Collection(mscrm.li_pointdrivepresentationviewed)" Partner="activityid_li_pointdrivepresentationviewed"/>
198
+ <NavigationProperty Name="regardingobjectid_contract" Type="mscrm.contract" Nullable="false" Partner="Contract_ActivityPointers">
199
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="contractid"/>
200
+ </NavigationProperty>
201
+ <NavigationProperty Name="activity_pointer_li_message" Type="Collection(mscrm.li_message)" Partner="activityid_li_message"/>
202
+ <NavigationProperty Name="activity_pointer_task" Type="Collection(mscrm.task)" Partner="activityid_activitypointer"/>
203
+ <NavigationProperty Name="activity_pointer_socialactivity" Type="Collection(mscrm.socialactivity)" Partner="activityid_activitypointer"/>
204
+ <NavigationProperty Name="regardingobjectid_incident" Type="mscrm.incident" Nullable="false" Partner="Incident_ActivityPointers">
205
+ <ReferentialConstraint Property="_regardingobjectid_value" ReferencedProperty="incidentid"/>
206
+ </NavigationProperty>
207
+ </EntityType>
14
208
  <EntityType Name="contact" BaseType="mscrm.crmbaseentity">
15
209
  <Key>
16
210
  <PropertyRef Name="contactid"/>
@@ -339,6 +533,133 @@
339
533
  <NavigationProperty Name="contact_activity_parties" Type="Collection(mscrm.activityparty)" Partner="partyid_contact"/>
340
534
  <NavigationProperty Name="Contact_Letters" Type="Collection(mscrm.letter)" Partner="regardingobjectid_contact_letter"/>
341
535
  </EntityType>
536
+ <EntityType Name="email" BaseType="mscrm.activitypointer">
537
+ <Key>
538
+ <PropertyRef Name="activityid"/>
539
+ </Key>
540
+ <Property Name="reminderactioncardid" Type="Edm.Guid"/>
541
+ <Property Name="trackingtoken" Type="Edm.String" Unicode="false"/>
542
+ <Property Name="overriddencreatedon" Type="Edm.DateTimeOffset"/>
543
+ <Property Name="readreceiptrequested" Type="Edm.Boolean"/>
544
+ <Property Name="compressed" Type="Edm.Boolean"/>
545
+ <Property Name="emailremindertext" Type="Edm.String" Unicode="false"/>
546
+ <Property Name="emailtrackingid" Type="Edm.Guid"/>
547
+ <Property Name="emailreminderexpirytime" Type="Edm.DateTimeOffset"/>
548
+ <Property Name="isunsafe" Type="Edm.Int32"/>
549
+ <Property Name="subcategory" Type="Edm.String" Unicode="false"/>
550
+ <Property Name="_parentactivityid_value" Type="Edm.Guid"/>
551
+ <Property Name="postponeemailprocessinguntil" Type="Edm.DateTimeOffset"/>
552
+ <Property Name="category" Type="Edm.String" Unicode="false"/>
553
+ <Property Name="replycount" Type="Edm.Int32"/>
554
+ <Property Name="directioncode" Type="Edm.Boolean"/>
555
+ <Property Name="correlationmethod" Type="Edm.Int32"/>
556
+ <Property Name="_sendersaccount_value" Type="Edm.Guid"/>
557
+ <Property Name="emailreminderstatus" Type="Edm.Int32"/>
558
+ <Property Name="linksclickedcount" Type="Edm.Int32"/>
559
+ <Property Name="submittedby" Type="Edm.String" Unicode="false"/>
560
+ <Property Name="_emailsender_value" Type="Edm.Guid"/>
561
+ <Property Name="deliveryreceiptrequested" Type="Edm.Boolean"/>
562
+ <Property Name="notifications" Type="Edm.Int32"/>
563
+ <Property Name="conversationtrackingid" Type="Edm.Guid"/>
564
+ <Property Name="opencount" Type="Edm.Int32"/>
565
+ <Property Name="torecipients" Type="Edm.String" Unicode="false"/>
566
+ <Property Name="deliveryattempts" Type="Edm.Int32"/>
567
+ <Property Name="delayedemailsendtime" Type="Edm.DateTimeOffset"/>
568
+ <Property Name="followemailuserpreference" Type="Edm.Boolean"/>
569
+ <Property Name="_templateid_value" Type="Edm.Guid"/>
570
+ <Property Name="inreplyto" Type="Edm.String" Unicode="false"/>
571
+ <Property Name="mimetype" Type="Edm.String" Unicode="false"/>
572
+ <Property Name="messageid" Type="Edm.String" Unicode="false"/>
573
+ <Property Name="attachmentcount" Type="Edm.Int32"/>
574
+ <Property Name="lastopenedtime" Type="Edm.DateTimeOffset"/>
575
+ <Property Name="importsequencenumber" Type="Edm.Int32"/>
576
+ <Property Name="isemailreminderset" Type="Edm.Boolean"/>
577
+ <Property Name="isemailfollowed" Type="Edm.Boolean"/>
578
+ <Property Name="conversationindex" Type="Edm.String" Unicode="false"/>
579
+ <Property Name="emailremindertype" Type="Edm.Int32"/>
580
+ <Property Name="baseconversationindexhash" Type="Edm.Int32"/>
581
+ <Property Name="sender" Type="Edm.String" Unicode="false"/>
582
+ <Property Name="attachmentopencount" Type="Edm.Int32"/>
583
+ <NavigationProperty Name="regardingobjectid_incident_email" Type="mscrm.incident" Nullable="false" Partner="Incident_Emails"/>
584
+ <NavigationProperty Name="regardingobjectid_lead_email" Type="mscrm.lead" Nullable="false" Partner="Lead_Emails"/>
585
+ <NavigationProperty Name="regardingobjectid_asyncoperation" Type="mscrm.asyncoperation" Nullable="false" Partner="AsyncOperation_Emails"/>
586
+ <NavigationProperty Name="regardingobjectid_bookableresourcebooking_email" Type="mscrm.bookableresourcebooking" Nullable="false" Partner="bookableresourcebooking_Emails"/>
587
+ <NavigationProperty Name="stageid_processstage" Type="mscrm.processstage" Nullable="false" Partner="processstage_emails"/>
588
+ <NavigationProperty Name="slakpiinstance_email" Type="Collection(mscrm.slakpiinstance)" Partner="regarding_email"/>
589
+ <NavigationProperty Name="serviceid_email" Type="mscrm.service" Nullable="false" Partner="service_emails"/>
590
+ <NavigationProperty Name="emailsender_contact" Type="mscrm.contact" Nullable="false" Partner="Contact_Email_EmailSender">
591
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="contactid"/>
592
+ </NavigationProperty>
593
+ <NavigationProperty Name="email_principalobjectattributeaccess" Type="Collection(mscrm.principalobjectattributeaccess)" Partner="objectid_email"/>
594
+ <NavigationProperty Name="Email_DuplicateMatchingRecord" Type="Collection(mscrm.duplicaterecord)" Partner="duplicaterecordid_email"/>
595
+ <NavigationProperty Name="emailsender_queue" Type="mscrm.queue" Nullable="false" Partner="Queue_Email_EmailSender">
596
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="queueid"/>
597
+ </NavigationProperty>
598
+ <NavigationProperty Name="regardingobjectid_bulkoperation_email" Type="mscrm.bulkoperation" Nullable="false" Partner="BulkOperation_Email"/>
599
+ <NavigationProperty Name="emailsender_account" Type="mscrm.account" Nullable="false" Partner="Account_Email_EmailSender">
600
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="accountid"/>
601
+ </NavigationProperty>
602
+ <NavigationProperty Name="regardingobjectid_opportunity_email" Type="mscrm.opportunity" Nullable="false" Partner="Opportunity_Emails"/>
603
+ <NavigationProperty Name="modifiedby_email" Type="mscrm.systemuser" Nullable="false" Partner="lk_email_modifiedby"/>
604
+ <NavigationProperty Name="slainvokedid_email_sla" Type="mscrm.sla" Nullable="false" Partner="sla_email"/>
605
+ <NavigationProperty Name="modifiedonbehalfby_email" Type="mscrm.systemuser" Nullable="false" Partner="lk_email_modifiedonbehalfby"/>
606
+ <NavigationProperty Name="regardingobjectid_salesorder_email" Type="mscrm.salesorder" Nullable="false" Partner="SalesOrder_Emails"/>
607
+ <NavigationProperty Name="owningteam_email" Type="mscrm.team" Nullable="false" Partner="team_email"/>
608
+ <NavigationProperty Name="Email_DuplicateBaseRecord" Type="Collection(mscrm.duplicaterecord)" Partner="baserecordid_email"/>
609
+ <NavigationProperty Name="transactioncurrencyid_email" Type="mscrm.transactioncurrency" Nullable="false" Partner="TransactionCurrency_Email"/>
610
+ <NavigationProperty Name="email_connections1" Type="Collection(mscrm.connection)" Partner="record1id_email"/>
611
+ <NavigationProperty Name="Email_AsyncOperations" Type="Collection(mscrm.asyncoperation)" Partner="regardingobjectid_email"/>
612
+ <NavigationProperty Name="templateid" Type="mscrm.template" Nullable="false" Partner="Email_EmailTemplate">
613
+ <ReferentialConstraint Property="_templateid_value" ReferencedProperty="templateid"/>
614
+ </NavigationProperty>
615
+ <NavigationProperty Name="Email_ProcessSessions" Type="Collection(mscrm.processsession)" Partner="regardingobjectid_email"/>
616
+ <NavigationProperty Name="Email_Annotation" Type="Collection(mscrm.annotation)" Partner="objectid_email"/>
617
+ <NavigationProperty Name="email_activity_parties" Type="Collection(mscrm.activityparty)" Partner="activityid_email"/>
618
+ <NavigationProperty Name="regardingobjectid_knowledgebaserecord_email" Type="mscrm.knowledgebaserecord" Nullable="false" Partner="KnowledgeBaseRecord_Emails"/>
619
+ <NavigationProperty Name="sla_email_sla" Type="mscrm.sla" Nullable="false" Partner="manualsla_email"/>
620
+ <NavigationProperty Name="regardingobjectid_entitlementtemplate_email" Type="mscrm.entitlementtemplate" Nullable="false" Partner="entitlementtemplate_Emails"/>
621
+ <NavigationProperty Name="email_connections2" Type="Collection(mscrm.connection)" Partner="record2id_email"/>
622
+ <NavigationProperty Name="Email_QueueItem" Type="Collection(mscrm.queueitem)" Partner="objectid_email"/>
623
+ <NavigationProperty Name="createdby_email" Type="mscrm.systemuser" Nullable="false" Partner="lk_email_createdby"/>
624
+ <NavigationProperty Name="regardingobjectid_site_email" Type="mscrm.site" Nullable="false" Partner="site_Emails"/>
625
+ <NavigationProperty Name="Email_SyncErrors" Type="Collection(mscrm.syncerror)" Partner="regardingobjectid_email_syncerror"/>
626
+ <NavigationProperty Name="regardingobjectid_campaignactivity_email" Type="mscrm.campaignactivity" Nullable="false" Partner="CampaignActivity_Emails"/>
627
+ <NavigationProperty Name="owningbusinessunit_email" Type="mscrm.businessunit" Nullable="false" Partner="business_unit_email_activities"/>
628
+ <NavigationProperty Name="activityid_activitypointer" Type="mscrm.activitypointer" Nullable="false" Partner="activity_pointer_email"/>
629
+ <NavigationProperty Name="owninguser_email" Type="mscrm.systemuser" Nullable="false" Partner="user_email"/>
630
+ <NavigationProperty Name="regardingobjectid_campaign_email" Type="mscrm.campaign" Nullable="false" Partner="Campaign_Emails"/>
631
+ <NavigationProperty Name="regardingobjectid_quote_email" Type="mscrm.quote" Nullable="false" Partner="Quote_Emails"/>
632
+ <NavigationProperty Name="regardingobjectid_msdyn_playbookinstance_email" Type="mscrm.msdyn_playbookinstance" Nullable="false" Partner="msdyn_playbookinstance_Emails"/>
633
+ <NavigationProperty Name="parentactivityid" Type="mscrm.email" Nullable="false" Partner="email_email_parentactivityid"/>
634
+ <NavigationProperty Name="email_email_parentactivityid" Type="Collection(mscrm.email)" Partner="parentactivityid"/>
635
+ <NavigationProperty Name="regardingobjectid_knowledgearticle_email" Type="mscrm.knowledgearticle" Nullable="false" Partner="KnowledgeArticle_Emails"/>
636
+ <NavigationProperty Name="regardingobjectid_contract_email" Type="mscrm.contract" Nullable="false" Partner="Contract_Emails"/>
637
+ <NavigationProperty Name="emailsender_lead" Type="mscrm.lead" Nullable="false" Partner="Lead_Email_EmailSender">
638
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="leadid"/>
639
+ </NavigationProperty>
640
+ <NavigationProperty Name="createdonbehalfby_email" Type="mscrm.systemuser" Nullable="false" Partner="lk_email_createdonbehalfby"/>
641
+ <NavigationProperty Name="regardingobjectid_msdyn_postalbum_email" Type="mscrm.msdyn_postalbum" Nullable="false" Partner="msdyn_postalbum_Emails"/>
642
+ <NavigationProperty Name="emailsender_systemuser" Type="mscrm.systemuser" Nullable="false" Partner="SystemUser_Email_EmailSender">
643
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="systemuserid"/>
644
+ </NavigationProperty>
645
+ <NavigationProperty Name="emailsender_equipment" Type="mscrm.equipment" Nullable="false" Partner="Equipment_Email_EmailSender">
646
+ <ReferentialConstraint Property="_emailsender_value" ReferencedProperty="equipmentid"/>
647
+ </NavigationProperty>
648
+ <NavigationProperty Name="regardingobjectid_account_email" Type="mscrm.account" Nullable="false" Partner="Account_Emails"/>
649
+ <NavigationProperty Name="regardingobjectid_contact_email" Type="mscrm.contact" Nullable="false" Partner="Contact_Emails"/>
650
+ <NavigationProperty Name="email_campaignresponse" Type="Collection(mscrm.campaignresponse)" Partner="originatingactivityid_email"/>
651
+ <NavigationProperty Name="sendersaccount" Type="mscrm.account" Nullable="false" Partner="Account_Email_SendersAccount">
652
+ <ReferentialConstraint Property="_sendersaccount_value" ReferencedProperty="accountid"/>
653
+ </NavigationProperty>
654
+ <NavigationProperty Name="Email_BulkDeleteFailures" Type="Collection(mscrm.bulkdeletefailure)" Partner="regardingobjectid_email"/>
655
+ <NavigationProperty Name="regardingobjectid_invoice_email" Type="mscrm.invoice" Nullable="false" Partner="Invoice_Emails"/>
656
+ <NavigationProperty Name="email_activity_mime_attachment" Type="Collection(mscrm.activitymimeattachment)" Partner="objectid_email"/>
657
+ <NavigationProperty Name="Email_FileAttachment" Type="Collection(mscrm.fileattachment)" Partner="objectid_email_fileattachment"/>
658
+ <NavigationProperty Name="email_actioncard" Type="Collection(mscrm.actioncard)" Partner="regardingobjectid_email_actioncard"/>
659
+ <NavigationProperty Name="sendermailboxid_email" Type="mscrm.mailbox" Nullable="false" Partner="email_sendermailboxid_mailbox"/>
660
+ <NavigationProperty Name="regardingobjectid_bookableresourcebookingheader_email" Type="mscrm.bookableresourcebookingheader" Nullable="false" Partner="bookableresourcebookingheader_Emails"/>
661
+ <NavigationProperty Name="regardingobjectid_entitlement_email" Type="mscrm.entitlement" Nullable="false" Partner="entitlement_Emails"/>
662
+ </EntityType>
342
663
  <EntityType Name="role" BaseType="mscrm.crmbaseentity">
343
664
  <Key>
344
665
  <PropertyRef Name="roleid"/>
@@ -48,6 +48,39 @@ describe Frodo::Entity, vcr: false do
48
48
  } }
49
49
 
50
50
  it_behaves_like 'a valid product'
51
+
52
+ context "with navigation properties inherited from supertype" do
53
+ before do
54
+ Frodo::Service.new('http://dynamics.com', name: 'DynamicsTestService', metadata_file: metadata_file)
55
+ end
56
+ let(:metadata_file) { 'spec/fixtures/files/metadata_dynamics.xml' }
57
+ let(:entity_set) {
58
+ Frodo::EntitySet.new(
59
+ container: 'System',
60
+ namespace: 'Microsoft.Dynamics.CRM',
61
+ name: 'emails',
62
+ type: 'email',
63
+ service_name: 'DynamicsTestService')
64
+ }
65
+ let(:options) { {
66
+ type: 'Microsoft.Dynamics.CRM.email',
67
+ namespace: 'Microsoft.Dynamics.CRM',
68
+ service_name: 'DynamicsTestService',
69
+ entity_set: entity_set
70
+ } }
71
+ let(:properties) {{
72
+ "activitypointer_activity_parties" => [ # This is inherited from the parent type `activitypointer`
73
+ {"partyid_systemuser@odata.bind"=>"/systemusers(cef21737-4714-e911-a957-000d3a3b959b)", "participationtypemask"=>1},
74
+ {"partyid_lead@odata.bind"=>"/leads(0474694b-199d-e911-a95d-000d3a3b9a2b)", "participationtypemask"=>2}
75
+ ],
76
+ "activityid"=>"708bff0f-ebdb-e911-a960-000d3a3b9b3d"
77
+ }}
78
+ it 'returns navigation property from parent' do
79
+ expect(subject.get_property('activitypointer_activity_parties')).to be_a(Frodo::NavigationProperty::Proxy)
80
+ expect(subject['activitypointer_activity_parties']).to eq(properties['activitypointer_activity_parties'])
81
+ end
82
+ end
83
+
51
84
  end
52
85
 
53
86
  describe '.with_properties with bind properties' do
@@ -195,4 +228,5 @@ describe Frodo::Entity, vcr: false do
195
228
 
196
229
  it { expect(subject.to_json).to eq(properties.to_json) }
197
230
  end
231
+
198
232
  end
@@ -67,14 +67,26 @@ describe Frodo::Schema do
67
67
  it { expect(subject).to respond_to(:navigation_properties) }
68
68
  it { expect(subject.navigation_properties['Product'].size).to eq(3) }
69
69
  it { expect(subject.navigation_properties['Product'].values).to all(be_a(Frodo::NavigationProperty)) }
70
+
71
+ context "with navigation property inherited from parent type" do
72
+ let(:metadata_file) { 'spec/fixtures/files/metadata_dynamics.xml' }
73
+ it { expect(subject.navigation_properties['email'].size).to eq(132) }
74
+ it { expect(subject.navigation_properties['email']['activitypointer_activity_parties']).to be_a(Frodo::NavigationProperty) }
75
+ end
76
+
70
77
  end
71
78
 
72
- describe '#referential_constraints' do
79
+ describe '#referential_constraints_for_entity' do
73
80
  let(:metadata_file) { 'spec/fixtures/files/metadata_dynamics.xml' }
74
- it { expect(subject).to respond_to(:referential_constraints) }
75
- it { expect(subject.referential_constraints['contact'].size).to eq(20) }
76
- it { expect(subject.referential_constraints['contact'].values).to all(be_a(String)) }
77
- it { expect(subject.referential_constraints['contact']['parentcustomerid_account']).to eq('_parentcustomerid_value') }
81
+ it { expect(subject).to respond_to(:referential_constraints_for_entity) }
82
+ it { expect(subject.referential_constraints_for_entity('contact').size).to eq(20) }
83
+ it { expect(subject.referential_constraints_for_entity('contact').values).to all(be_a(String)) }
84
+ it { expect(subject.referential_constraints_for_entity('contact')['parentcustomerid_account']).to eq('_parentcustomerid_value') }
85
+
86
+ context "with navigation property inherited from parent type" do
87
+ it { expect(subject.referential_constraints_for_entity('email').size).to eq(41) }
88
+ it { expect(subject.referential_constraints_for_entity('email')['regardingobjectid_opportunity']).to eq('_regardingobjectid_value') }
89
+ end
78
90
  end
79
91
 
80
92
  describe '#get_property_type' do
@@ -1,19 +1,18 @@
1
1
  module MiddlewareExampleGroup
2
- def self.included(base)
3
- base.class_eval do
4
- let(:app) { double('@app', call: nil) }
5
- let(:env) { { request_headers: {}, response_headers: {} } }
6
- let(:retries) { 3 }
7
- let(:options) { {} }
8
- let(:client) { double(Frodo::AbstractClient) }
9
- let(:auth_callback) { double(Proc) }
2
+ def self.included(base)
3
+ base.class_eval do
4
+ let(:app) { double('@app', call: nil) }
5
+ let(:env) { { request_headers: {}, response_headers: {} } }
6
+ let(:retries) { 3 }
7
+ let(:options) { {} }
8
+ let(:client) { double(Frodo::AbstractClient) }
9
+ let(:auth_callback) { double(Proc) }
10
10
 
11
- subject(:middleware) { described_class.new app, client, options }
12
- end
11
+ subject(:middleware) { described_class.new app, client, options }
13
12
  end
13
+ end
14
14
 
15
- RSpec.configure do |config|
16
- config.include self,
17
- example_group: { file_path: %r{spec/frodo/middleware} }
18
- end
19
- end
15
+ RSpec.configure do |config|
16
+ config.include self, file_path: %r{spec/frodo/middleware}
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frodo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.8
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emmanuel Pinault
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-28 00:00:00.000000000 Z
11
+ date: 2019-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri