viewpoint 0.0.5 → 0.1.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 (59) hide show
  1. data/README +84 -45
  2. data/Rakefile +7 -5
  3. data/TODO +6 -0
  4. data/VERSION +1 -1
  5. data/lib/exceptions/exceptions.rb +34 -0
  6. data/lib/extensions/string.rb +37 -0
  7. data/lib/model/calendar_folder.rb +45 -0
  8. data/lib/model/calendar_item.rb +145 -0
  9. data/lib/model/contact.rb +58 -0
  10. data/lib/model/contacts_folder.rb +35 -0
  11. data/lib/model/distribution_list.rb +26 -0
  12. data/lib/model/event.rb +118 -0
  13. data/lib/model/folder.rb +36 -0
  14. data/lib/model/generic_folder.rb +302 -0
  15. data/lib/model/item.rb +126 -0
  16. data/lib/model/mailbox_user.rb +107 -0
  17. data/lib/model/meeting_cancellation.rb +28 -0
  18. data/lib/{viewpoint/errors.rb → model/meeting_message.rb} +10 -14
  19. data/lib/model/meeting_request.rb +26 -0
  20. data/lib/model/meeting_response.rb +26 -0
  21. data/lib/model/message.rb +73 -0
  22. data/lib/model/model.rb +161 -0
  23. data/lib/model/search_folder.rb +36 -0
  24. data/lib/model/task.rb +62 -0
  25. data/lib/model/task_list.rb +19 -0
  26. data/lib/model/tasks_folder.rb +33 -0
  27. data/lib/soap/handsoap/builder.rb +22 -0
  28. data/lib/soap/handsoap/builders/ews_build_helpers.rb +317 -0
  29. data/lib/soap/handsoap/builders/ews_builder.rb +86 -0
  30. data/lib/soap/handsoap/ews_service.rb +646 -0
  31. data/lib/soap/handsoap/parser.rb +106 -0
  32. data/lib/soap/handsoap/parsers/ews_parser.rb +165 -0
  33. data/lib/soap/soap_provider.rb +75 -0
  34. data/lib/viewpoint.rb +98 -3
  35. data/preamble +1 -1
  36. data/test/spec/basic_functions.spec +51 -0
  37. data/test/spec/folder_subscriptions.spec +35 -0
  38. data/test/spec/folder_synchronization.spec +28 -0
  39. data/utils/ewsWSDL2rb.rb +29 -0
  40. metadata +101 -43
  41. data/lib/exchwebserv.rb +0 -6
  42. data/lib/soap/viewpoint.conf +0 -3
  43. data/lib/viewpoint/calendar.rb +0 -128
  44. data/lib/viewpoint/calendar_item.rb +0 -118
  45. data/lib/viewpoint/event.rb +0 -0
  46. data/lib/viewpoint/exchange_headers.rb +0 -49
  47. data/lib/viewpoint/exchwebserv.rb +0 -236
  48. data/lib/viewpoint/folder.rb +0 -358
  49. data/lib/viewpoint/item.rb +0 -101
  50. data/lib/viewpoint/mail.rb +0 -117
  51. data/lib/viewpoint/message.rb +0 -132
  52. data/lib/viewpoint/task.rb +0 -0
  53. data/lib/viewpoint/tasks.rb +0 -0
  54. data/lib/wsdl/defaultMappingRegistry.rb +0 -10680
  55. data/lib/wsdl/exchangeServiceBinding.rb +0 -349
  56. data/lib/wsdl/exchangeServiceTypes.rb +0 -11013
  57. data/test/spec/basic_features_spec.rb +0 -37
  58. data/test/test_client.rb +0 -13
  59. data/test/testrestrict.rb +0 -75
data/preamble CHANGED
@@ -1,5 +1,5 @@
1
1
  #############################################################################
2
- # Copyright © 2009 Dan Wanek <dan.wanek@gmail.com>
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
3
  #
4
4
  #
5
5
  # This file is part of Viewpoint.
@@ -0,0 +1,51 @@
1
+ $: << File.dirname(__FILE__) + '/../../lib/'
2
+ require 'kconv'
3
+ require 'viewpoint'
4
+ require 'json'
5
+
6
+ # To run this test put a file called 'creds.json' in this directory with the following format:
7
+ # {"user":"myuser","pass":"mypass","endpoint":"https://mydomain.com/ews/exchange.asmx"}
8
+
9
+
10
+ describe "Test the basic features of Viewpoint" do
11
+ before(:all) do
12
+ creds = JSON.load(File.open('spec/creds.json','r'))
13
+ Viewpoint::EWS::EWS.endpoint = creds['endpoint']
14
+ Viewpoint::EWS::EWS.set_auth(creds['user'],creds['pass'])
15
+ @ews = Viewpoint::EWS::EWS.instance
16
+ end
17
+
18
+ it 'should retrieve the various Folder Types' do
19
+ (Viewpoint::EWS::GenericFolder.get_folder :inbox).should be_instance_of(Viewpoint::EWS::Folder)
20
+ (Viewpoint::EWS::GenericFolder.get_folder :calendar).should be_instance_of(Viewpoint::EWS::CalendarFolder)
21
+ (Viewpoint::EWS::GenericFolder.get_folder :contacts).should be_instance_of(Viewpoint::EWS::ContactsFolder)
22
+ (Viewpoint::EWS::GenericFolder.get_folder :tasks).should be_instance_of(Viewpoint::EWS::TasksFolder)
23
+ end
24
+
25
+ it 'should retrieve an Array of Folder Types' do
26
+ flds = Viewpoint::EWS::GenericFolder.find_folders
27
+ flds.should be_instance_of(Array)
28
+ flds.first.should be_kind_of(Viewpoint::EWS::GenericFolder)
29
+ end
30
+
31
+ it 'should retrieve messages from a mail folder' do
32
+ inbox = Viewpoint::EWS::GenericFolder.get_folder :inbox
33
+ msgs = inbox.find_items
34
+ msgs.should be_instance_of(Array)
35
+ if(msgs.length > 0)
36
+ msgs.first.should be_kind_of(Viewpoint::EWS::Item)
37
+ end
38
+ end
39
+
40
+ it 'should retrieve an item by id if one exists' do
41
+ inbox = Viewpoint::EWS::GenericFolder.get_folder :inbox
42
+ msgs = inbox.find_items
43
+ if(msgs.length > 0)
44
+ item = inbox.get_item(msgs.first.id)
45
+ item.should be_kind_of(Viewpoint::EWS::Item)
46
+ else
47
+ msgs.should be_empty
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,35 @@
1
+ $: << File.dirname(__FILE__) + '/../../lib/'
2
+ require 'kconv'
3
+ require 'viewpoint'
4
+ require 'json'
5
+
6
+ # To run this test put a file called 'creds.json' in this directory with the following format:
7
+ # {"user":"myuser","pass":"mypass","endpoint":"https://mydomain.com/ews/exchange.asmx"}
8
+
9
+
10
+ describe "Folder Subscriptions" do
11
+ before(:all) do
12
+ creds = JSON.load(File.open('spec/creds.json','r'))
13
+ Viewpoint::EWS::EWS.endpoint = creds['endpoint']
14
+ Viewpoint::EWS::EWS.set_auth(creds['user'],creds['pass'])
15
+ @ews = Viewpoint::EWS::EWS.instance
16
+ @inbox = Viewpoint::EWS::GenericFolder.get_folder :inbox
17
+ end
18
+
19
+ describe "Example Folder Subscription for the Inbox" do
20
+
21
+ it 'should subscribe to the Inbox Folder' do
22
+ @inbox.subscribe.should be_true
23
+ end
24
+
25
+ it 'should retrieve new subscription events' do
26
+ @inbox.get_events.should_not be_empty
27
+ end
28
+
29
+ it 'should unsubscribe to the Inbox Folder' do
30
+ @inbox.unsubscribe.should be_true
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,28 @@
1
+ $: << File.dirname(__FILE__) + '/../../lib/'
2
+ require 'kconv'
3
+ require 'viewpoint'
4
+ require 'json'
5
+
6
+ # To run this test put a file called 'creds.json' in this directory with the following format:
7
+ # {"user":"myuser","pass":"mypass","endpoint":"https://mydomain.com/ews/exchange.asmx"}
8
+
9
+
10
+ describe "Folder Synchronization" do
11
+ before(:all) do
12
+ creds = JSON.load(File.open('spec/creds.json','r'))
13
+ Viewpoint::EWS::EWS.endpoint = creds['endpoint']
14
+ Viewpoint::EWS::EWS.set_auth(creds['user'],creds['pass'])
15
+ @ews = Viewpoint::EWS::EWS.instance
16
+ @inbox = Viewpoint::EWS::GenericFolder.get_folder :inbox
17
+ end
18
+
19
+ describe "Example Folder Synchronization for the Inbox" do
20
+
21
+ it 'should start synchronization of the Inbox Folder' do
22
+ @inbox.sync_items!(2)
23
+ @inbox.sync_state.should_not be_nil
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+
4
+ wsdl = Nokogiri::XML(File.read('Services.wsdl'))
5
+
6
+ methods = []
7
+
8
+ wsdl.xpath('//wsdl:binding/wsdl:operation').each do |op|
9
+ meth_name = op[:name].gsub(/([a-z])([A-Z])/, '\1_\2').downcase
10
+ methods << meth_name
11
+ str = " def #{meth_name}\n"
12
+ str << " action = '#{op.xpath('soap:operation').first[:soapAction]}'\n"
13
+ str << " resp = invoke('tns:#{op[:name]}', :soap_action => action) do |#{meth_name}|\n"
14
+ str << " build_#{meth_name}!(#{meth_name})\n"
15
+ str << " end\n"
16
+ str << " parse_#{meth_name}(resp)\n"
17
+ str << " end\n\n"
18
+ puts str
19
+ end
20
+
21
+ puts "\n\n ## Helper methods (builders and parsers)\n"
22
+ puts " private\n\n"
23
+ methods.each do |meth|
24
+ str = " def build_#{meth}!(#{meth})\n"
25
+ str << " end\n\n"
26
+ str << " def parse_#{meth}()\n"
27
+ str << " end\n\n"
28
+ puts str
29
+ end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: viewpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Dan Wanek
@@ -9,40 +14,75 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-12-07 00:00:00 -06:00
17
+ date: 2010-08-02 00:00:00 -05:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
- name: soap4r
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
21
+ name: handsoap
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
20
25
  requirements:
21
26
  - - ">="
22
27
  - !ruby/object:Gem::Version
23
- version: 1.5.8
24
- version:
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
25
33
  - !ruby/object:Gem::Dependency
26
- name: icalendar
34
+ name: nokogiri
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
27
44
  type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: httpclient
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
30
51
  requirements:
31
52
  - - ">="
32
53
  - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
33
56
  version: "0"
34
- version:
57
+ type: :runtime
58
+ version_requirements: *id003
35
59
  - !ruby/object:Gem::Dependency
36
60
  name: rubyntlm
61
+ prerelease: false
62
+ requirement: &id004 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
37
70
  type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
71
+ version_requirements: *id004
72
+ - !ruby/object:Gem::Dependency
73
+ name: icalendar
74
+ prerelease: false
75
+ requirement: &id005 !ruby/object:Gem::Requirement
76
+ none: false
40
77
  requirements:
41
78
  - - ">="
42
79
  - !ruby/object:Gem::Version
43
- version: 0.1.1
44
- version:
45
- description: " \tA Ruby client access library for Microsoft Exchange Web Services (EWS). It is a work in progress. Methods are still being added from the EWS API docs. Please see them for further information: http://msdn.microsoft.com/en-us/library/bb204119.aspx\n"
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ type: :runtime
84
+ version_requirements: *id005
85
+ description: " \tA Ruby client access library for Microsoft Exchange Web Services (EWS). Examples can be found here: http://distributed-frostbite.blogspot.com\n"
46
86
  email: dan.wanek@gmail.com
47
87
  executables: []
48
88
 
@@ -55,6 +95,7 @@ files:
55
95
  - COPYING.txt
56
96
  - README
57
97
  - Rakefile
98
+ - TODO
58
99
  - VERSION
59
100
  - examples/cal2ical.rb
60
101
  - examples/ews_fusefs.rb
@@ -102,58 +143,75 @@ files:
102
143
  - examples/webclient/views/layout.haml
103
144
  - examples/webclient/views/mail.haml
104
145
  - examples/webclient/views/welcome.haml
105
- - lib/exchwebserv.rb
106
- - lib/soap/viewpoint.conf
146
+ - lib/exceptions/exceptions.rb
147
+ - lib/extensions/string.rb
148
+ - lib/model/calendar_folder.rb
149
+ - lib/model/calendar_item.rb
150
+ - lib/model/contact.rb
151
+ - lib/model/contacts_folder.rb
152
+ - lib/model/distribution_list.rb
153
+ - lib/model/event.rb
154
+ - lib/model/folder.rb
155
+ - lib/model/generic_folder.rb
156
+ - lib/model/item.rb
157
+ - lib/model/mailbox_user.rb
158
+ - lib/model/meeting_cancellation.rb
159
+ - lib/model/meeting_message.rb
160
+ - lib/model/meeting_request.rb
161
+ - lib/model/meeting_response.rb
162
+ - lib/model/message.rb
163
+ - lib/model/model.rb
164
+ - lib/model/search_folder.rb
165
+ - lib/model/task.rb
166
+ - lib/model/task_list.rb
167
+ - lib/model/tasks_folder.rb
168
+ - lib/soap/handsoap/builder.rb
169
+ - lib/soap/handsoap/builders/ews_build_helpers.rb
170
+ - lib/soap/handsoap/builders/ews_builder.rb
171
+ - lib/soap/handsoap/ews_service.rb
172
+ - lib/soap/handsoap/parser.rb
173
+ - lib/soap/handsoap/parsers/ews_parser.rb
174
+ - lib/soap/soap_provider.rb
107
175
  - lib/viewpoint.rb
108
- - lib/viewpoint/calendar.rb
109
- - lib/viewpoint/calendar_item.rb
110
- - lib/viewpoint/errors.rb
111
- - lib/viewpoint/event.rb
112
- - lib/viewpoint/exchange_headers.rb
113
- - lib/viewpoint/exchwebserv.rb
114
- - lib/viewpoint/folder.rb
115
- - lib/viewpoint/item.rb
116
- - lib/viewpoint/mail.rb
117
- - lib/viewpoint/message.rb
118
- - lib/viewpoint/task.rb
119
- - lib/viewpoint/tasks.rb
120
- - lib/wsdl/defaultMappingRegistry.rb
121
- - lib/wsdl/exchangeServiceBinding.rb
122
- - lib/wsdl/exchangeServiceTypes.rb
123
176
  - preamble
124
- - test/spec/basic_features_spec.rb
125
- - test/test_client.rb
126
- - test/testrestrict.rb
177
+ - test/spec/basic_functions.spec
178
+ - test/spec/folder_subscriptions.spec
179
+ - test/spec/folder_synchronization.spec
180
+ - utils/ewsWSDL2rb.rb
127
181
  has_rdoc: true
128
182
  homepage: http://github.com/zenchild/Viewpoint
129
183
  licenses: []
130
184
 
131
- post_install_message: Don't forget to create .viewpointrc. See README
185
+ post_install_message:
132
186
  rdoc_options:
133
187
  - -x
134
- - wsdl/
135
- - -x
136
188
  - test/
137
189
  - -x
138
190
  - examples/
139
191
  require_paths:
140
192
  - lib
141
193
  required_ruby_version: !ruby/object:Gem::Requirement
194
+ none: false
142
195
  requirements:
143
196
  - - ">="
144
197
  - !ruby/object:Gem::Version
198
+ segments:
199
+ - 1
200
+ - 8
201
+ - 7
145
202
  version: 1.8.7
146
- version:
147
203
  required_rubygems_version: !ruby/object:Gem::Requirement
204
+ none: false
148
205
  requirements:
149
206
  - - ">="
150
207
  - !ruby/object:Gem::Version
208
+ segments:
209
+ - 0
151
210
  version: "0"
152
- version:
153
211
  requirements: []
154
212
 
155
213
  rubyforge_project:
156
- rubygems_version: 1.3.5
214
+ rubygems_version: 1.3.7
157
215
  signing_key:
158
216
  specification_version: 3
159
217
  summary: A Ruby client access library for Microsoft Exchange Web Services (EWS)
@@ -1,6 +0,0 @@
1
- # This exists for legacy reasons and will be depreciated soon
2
- warn "*******************************************"
3
- warn "Requiring exchwebserv is depreciated and will be removed soon.\nPlease require 'viewpoint'"
4
- warn "*******************************************"
5
-
6
- require 'viewpoint'
@@ -1,3 +0,0 @@
1
- exchange.ews.user=user
2
- exchange.ews.pass=pass
3
- exchange.ews.endpoint=https://hostname/ews/exchange.asmx
@@ -1,128 +0,0 @@
1
- #############################################################################
2
- # Copyright © 2009 Dan Wanek <dan.wanek@gmail.com>
3
- #
4
- #
5
- # This file is part of Viewpoint.
6
- #
7
- # Viewpoint is free software: you can redistribute it and/or
8
- # modify it under the terms of the GNU General Public License as published
9
- # by the Free Software Foundation, either version 3 of the License, or (at
10
- # your option) any later version.
11
- #
12
- # Viewpoint is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
- # Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License along
18
- # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
- #############################################################################
20
- $:.unshift(File.dirname(__FILE__))
21
- require 'rubygems'
22
- require 'icalendar'
23
- require 'wsdl/exchangeServiceBinding'
24
- # --- Folder Types ---
25
- require 'folder'
26
- # --- Item Types ---
27
- require 'calendar_item'
28
- #require 'meeting_request'
29
-
30
-
31
-
32
- class Viewpoint::CalendarFolder < Viewpoint::Folder
33
- include Viewpoint
34
-
35
- # initialize with an item of CalendarFolderType
36
- def initialize(folder)
37
- # Call initialize in the
38
- super(folder)
39
- end
40
-
41
- def get_todays_events
42
- get_events(DateTime.parse(Date.today.to_s), DateTime.parse(Date.today.next.to_s))
43
- end
44
-
45
- def get_weeks_events
46
- start_date = Date.today
47
- end_date = (start_date + ( 6 - start_date.wday))
48
-
49
- get_events(DateTime.parse(start_date.to_s), DateTime.parse(end_date.to_s))
50
- end
51
-
52
- # Get events between a certain time period. Defaults to "today"
53
- # Input: DateTime of start, DateTime of end
54
- # You can get a year of events by passing 'nil, nil', but you should really consider using synchronization then.
55
- # This method will return an Array of CalendarItem
56
- def get_events(start_time = (DateTime.parse(Date.today.to_s)), end_time = (DateTime.parse(Date.today.next.to_s)))
57
- find_item_t = FindItemType.new
58
- find_item_t.xmlattr_Traversal = ItemQueryTraversalType::Shallow
59
- item_shape = ItemResponseShapeType.new(DefaultShapeNamesType::Default, false)
60
-
61
- find_item_t.itemShape = item_shape
62
-
63
- folder_ids = NonEmptyArrayOfBaseFolderIdsType.new()
64
- dist_folder = DistinguishedFolderIdType.new
65
- dist_folder.xmlattr_Id = DistinguishedFolderIdNameType.new(@display_name.downcase)
66
- folder_ids.distinguishedFolderId = dist_folder
67
- find_item_t.parentFolderIds = folder_ids
68
-
69
- # If we pass nil, force times to be:
70
- # start: 1 years ago
71
- # end: 1 years from now
72
- cal_span = CalendarViewType.new
73
- if ( start_time == nil or end_time == nil)
74
- cal_span.xmlattr_StartDate = DateTime.parse((Date.today - 365).to_s).to_s
75
- cal_span.xmlattr_EndDate = DateTime.parse((Date.today + 365).to_s).to_s
76
- find_item_t.calendarView = cal_span
77
- else
78
- cal_span.xmlattr_StartDate = start_time.to_s
79
- cal_span.xmlattr_EndDate = end_time.to_s
80
- find_item_t.calendarView = cal_span
81
- end
82
-
83
- resp = find_items(find_item_t)
84
- if resp != nil
85
- cal_items = []
86
-
87
- resp.rootFolder.items.calendarItem.each do |cali|
88
- cal_items << CalendarItem.new(cali, self)
89
- end
90
- # TODO: Handle the following types of Calendar data
91
- # meetingMessage
92
- # meetingRequest
93
- # meetingResponse
94
- # meetingCancellation
95
-
96
- return cal_items
97
- else
98
- return resp # return nil
99
- end
100
- end
101
-
102
-
103
- # Returns an Icalendar::Calendar object
104
- # Input: DateTime of start, DateTime of end
105
- def to_ical(dtstart = nil, dtend = nil)
106
- ical = Icalendar::Calendar.new
107
- events = get_events(dtstart, dtend)
108
- events.each do |ev|
109
- ical.add_event(ev.to_ical_event)
110
- end
111
- return ical
112
- end
113
-
114
-
115
- # See docs for Folder::get_item
116
- def get_item(item_id)
117
- cali = super(item_id, "calendarItem", true)
118
- end
119
-
120
- def get_event(item_id)
121
- begin
122
- return CalendarItem.new(get_item(item_id), self)
123
- rescue InvalidEWSItemError => e
124
- return nil
125
- end
126
- end
127
- end
128
-