frodo 0.10.8 → 0.11.0

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