com 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect COM::MethodInvocationError do
5
+ COM::Error.from(stub(:message => %{method
6
+ OLE error code:123abcDE in server
7
+ message
8
+ HRESULT error code:0x123abcDE
9
+ hresult message}))
10
+ end
11
+
12
+ expect 'method' do
13
+ COM::Error.from(stub(:message => %{method
14
+ OLE error code:123abcDE in server
15
+ message
16
+ HRESULT error code:0x123abcDE
17
+ hresult message})).method
18
+ end
19
+
20
+ expect 'server' do
21
+ COM::Error.from(stub(:message => %{method
22
+ OLE error code:123abcDE in server
23
+ message
24
+ HRESULT error code:0x123abcDE
25
+ hresult message})).server
26
+ end
27
+
28
+ expect 0x123abcDE do
29
+ COM::Error.from(stub(:message => %{method
30
+ OLE error code:123abcDE in server
31
+ message
32
+ HRESULT error code:0x123abcDE
33
+ hresult message})).code
34
+ end
35
+
36
+ expect 0x123abcDE do
37
+ COM::Error.from(stub(:message => %{method
38
+ OLE error code:123abcDE in server
39
+ message
40
+ HRESULT error code:0x123abcDE
41
+ hresult message})).hresult_code
42
+ end
43
+
44
+ expect 'hresult message' do
45
+ COM::Error.from(stub(:message => %{method
46
+ OLE error code:123abcDE in server
47
+ message
48
+ HRESULT error code:0x123abcDE
49
+ hresult message})).hresult_message
50
+ end
51
+
52
+ expect 'message' do
53
+ COM::Error.from(stub(:message => %{method
54
+ OLE error code:123abcDE in server
55
+ message
56
+ HRESULT error code:0x123abcDE
57
+ hresult message})).message
58
+ end
59
+
60
+ expect 'message' do
61
+ COM::Error.from(stub(:message => %{method
62
+ OLE error code:123abcDE in server
63
+ message
64
+ HRESULT error code:0x123abcDE
65
+ hresult message})).to_s
66
+ end
67
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ =begin
5
+ expect :result do
6
+ COM::Object.new(stub).with_properties({}){ :result }
7
+ end
8
+
9
+ expect 1 do
10
+ o = {:a => 1}
11
+ COM::Object.new(o).with_properties(:a => 2){ }
12
+ o[:a]
13
+ end
14
+
15
+ expect 1 do
16
+ o = {:a => 1}
17
+ COM::Object.new(o).with_properties(:a => 2){ raise } rescue nil
18
+ o[:a]
19
+ end
20
+
21
+ expect 2 do
22
+ o = {:a => 1}
23
+ v = nil
24
+ COM::Object.new(o).with_properties(:a => 2){ v = o[:a] } rescue nil
25
+ o[:a]
26
+ v
27
+ end
28
+ =end
29
+
30
+ expect StandardError do
31
+ COM::Object.new(stub).with_properties({}){ raise StandardError }
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'pathname'
4
+
5
+ Expectations do
6
+ expect 'c:/a' do
7
+ stub(COM).charset{ 'UTF-8' }
8
+ Pathname('c:/a').to_com
9
+ end
10
+
11
+ expect 'c:/å' do
12
+ stub(COM).charset{ 'UTF-8' }
13
+ Pathname('c:/å').to_com
14
+ end
15
+
16
+ # ANSI and ISO-8859-1 å
17
+ expect 'c:/å' do
18
+ stub(COM).charset{ 'UTF-8' }
19
+ Pathname("c:/\xe5".force_encoding('Windows-1252')).to_com
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect NotImplementedError do
5
+ COM::Error.from(stub(:message => "\nHRESULT error code:0x80004001\n"))
6
+ end
7
+
8
+ expect NoMethodError do
9
+ COM::Error.from(stub(:message => "\nHRESULT error code:0x80020006\n"))
10
+ end
11
+
12
+ expect ArgumentError do
13
+ COM::Error.from(stub(:message => "\nHRESULT error code:0x8002000e\n"))
14
+ end
15
+
16
+ expect ArgumentError do
17
+ COM::Error.from(stub(:message => "\nHRESULT error code:0x800401e4\n"))
18
+ end
19
+
20
+ expect COM::OperationUnavailableError do
21
+ COM::Error.from(stub(:message => "\nHRESULT error code:0x800401e3\n"))
22
+ end
23
+
24
+ expect NameError.new('unknown COM server: A.B') do
25
+ COM::Error.from(stub(:message => "unknown OLE server: `A.B'\n HRESULT error code:0x800401f3\n"))
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: com
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nikolai Weibull
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: lookout
16
+ requirement: &14503188 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *14503188
25
+ - !ruby/object:Gem::Dependency
26
+ name: yard
27
+ requirement: &14502792 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.6.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *14502792
36
+ description: ! "# COM #\n\nCOM is an object-oriented wrapper around WIN32OLE. COM
37
+ makes it easy to add\nbehavior to WIN32OLE objects, making them easier to work with
38
+ from Ruby.\n\n\n## Usage ##\n\nUsing COM is rather straightforward. There’s basically
39
+ four concepts to keep\ntrack of:\n\n 1. COM objects\n 2. Instantiable COM objects\n
40
+ \ 3. COM events\n 4. COM errors\n\nLet’s look at each concept separately, using
41
+ the following example as a base.\n\n module Word end\n\n class Word::Application
42
+ < COM::Instantiable\n def without_interaction\n with_properties('displayalerts'
43
+ => Word::WdAlertsNone){ yield }\n end\n\n def documents\n Word::Documents.new(com.documents)\n
44
+ \ end\n\n def quit(saving = Word::WdDoNotSaveChanges, *args)\n com.quit
45
+ saving, *args\n end\n end\n\n### COM Objects ###\n\nA COM::Object is a wrapper
46
+ around a COM object. It provides error\nspecialization, which is discussed later
47
+ and a few utility methods. You\ntypically use it to wrap COM objects that are returned
48
+ by COM methods. If we\ntake the example given in the introduction, Word::Documents
49
+ is a good\ncandidate:\n\n class Word::Documents < COM::Object\n DefaultOpenOptions
50
+ = {\n 'confirmconversions' => false,\n 'readonly' => true,\n 'addtorecentfiles'
51
+ => false,\n 'visible' => false\n }.freeze\n def open(path, options
52
+ = {})\n options = DefaultOpenOptions.merge(options)\n options['filename']
53
+ = Pathname(path).to_com\n Word::Document.new(com.open(options))\n end\n
54
+ \ end\n\nHere we override the #open method to be a bit easier to use, providing
55
+ sane\ndefaults for COM interaction. Worth noting is the use of the #com method
56
+ to\naccess the actual COM object to invoke the #open method on it. Also note that\nWord::Document
57
+ is also a COM::Object.\n\nCOM::Object provides a convenience method called #with_properties,
58
+ which is\nused in the #without_interaction method above. It lets you set properties
59
+ on\nthe COM::Object during the duration of a block, restoring them after it exits\n(successfully
60
+ or with an error).\n\n\n### Instantiable COM Objects ###\n\nInstantiable COM objects
61
+ are COM objects that we can connect to and that can be\ncreated. The Word::Application
62
+ object can, for example, be created.\nInstantiable COM objects should inherit from
63
+ COM::Instantiable. Instantiable\nCOM objects can be told what program ID to use,
64
+ whether or not to allow\nconnecting to an already running object, and to load its
65
+ associated constants\nupon creation.\n\nThe program ID is used to determine what
66
+ instantiable COM object to connect to.\nBy default the name of the COM::Instantiable
67
+ class’ name is used, taking the\nlast two double-colon-separated components and
68
+ joining them with a dot. For\nWord::Application, the program ID is “Word.Application”.
69
+ \ The program ID can be\nset by using the .program_id method:\n\n class IDontCare::ForConventions
70
+ < COM::Instantiable\n program_id 'Word.Application'\n end\n\nThe program
71
+ ID can be accessed with the same method:\n\n Word::Application.program_id # ⇒
72
+ 'Word.Application'\n\nConnecting to an already running COM object is not done by
73
+ default, but is\nsometimes desirable: the COM object might take a long time to create,
74
+ or some\ncommon state needs to be accessed. If the default for a certain instantiable\nCOM
75
+ object should be to connect, this can be done using the .connect method:\n\n class
76
+ Word::Application < COM::Instantiable\n connect\n end\n\nIf no running COM
77
+ object is available, then a new COM object will be created in\nits stead. Whether
78
+ or not a class uses the connection method can be queried\nwith the .connect? method:\n\n
79
+ \ Word::Application.connect? # ⇒ true\n\nWhether or not to load constants associated
80
+ with an instantiable COM object is\nset with the .constants method:\n\n class
81
+ Word::Application < COM::Instantiable\n constants true\n end\n\nand can
82
+ similarly be checked:\n\n Word::Application.constants? # ⇒ true\n\nConstants
83
+ are loaded by default.\n\nWhen an instance of the instantiable COM object is created,
84
+ a check is run to\nsee if constants should be loaded and whether or not they already
85
+ have been\nloaded. If they should be loaded and they haven’t already been loaded,\nthey’re,
86
+ you guessed it, loaded. The constants are added to the module\ncontaining the COM::Instantiable.
87
+ \ Thus, for Word::Application, the Word module\nwill contain all the constants.
88
+ \ Whether or not the constants have already been\nloaded can be checked with .constants_loaded?:\n\n
89
+ \ Word::Application.constants_loaded # ⇒ false\n\nThat concludes the class-level
90
+ methods.\n\nLet’s begin with the #connected? method among the instance-level methods.
91
+ \ This\nmethod queries whether or not this instance connected to an already running
92
+ COM\nobject:\n\n Word::Application.new.connected? # ⇒ false\n\nThis can be very
93
+ important in determining how shutdown of a COM object should\nbe done. If you connected
94
+ to an already COM object it might be foolish to shut\nit down if someone else is
95
+ using it.\n\nThe #initialize method takes a couple of options:\n\n * connect: whether
96
+ or not to connect to a running instance\n * constants: whether or not to load constants\n\nThese
97
+ options will, when given, override the class-level defaults.\n\n### Events ###\n\nCOM
98
+ events are easily dealt with:\n\n class Word::Application < COM::Instantiable\n
99
+ \ def initialize(options = {})\n super\n @events = COM::Events.new(com,
100
+ 'ApplicationEvents',\n 'OnQuit')\n end\n\n
101
+ \ def quit(saving = Word::WdDoNotSaveChanges, *args)\n @events.observe('OnQuit',
102
+ proc{ com.quit saving, *args }) do\n yield if block_given?\n end\n
103
+ \ end\n end\n\nTo tell you the truth this API sucks and will most likely
104
+ be rewritten. The\nreason that it is the way it is is that WIN32OLE, which COM
105
+ wraps, sucks. It’s\nevent API is horrid and the implementation is buggy. It will
106
+ keep every\nregistered event block in memory for ever, freeing neither the blocks
107
+ nor the\nCOM objects that yield the events.\n\n### Errors ###\n\nAll errors generated
108
+ by COM methods descend from COM::Error, except for those\ncases where a Ruby error
109
+ already exists. The following HRESULT error codes are\nturned into Ruby errors:\n\n
110
+ \ HRESULT Error Code | Error Class\n -------------------|------------\n 0x80004001
111
+ \ | NotImplementedError\n 0x80020005 | TypeError\n 0x80020006 |
112
+ NoMethodError\n 0x8002000e | ArgumentError\n 0x800401e4 | ArgumentError\n\nThere
113
+ are also a couple of other HRESULT error codes that are turned into more\nspecific
114
+ errors than COM::Error:\n\n HRESULT Error Code | Error Class\n -------------------|------------\n
115
+ \ 0x80020003 | MemberNotFoundError\n 0x800401e3 | OperationUnavailableError\n\nFinally,
116
+ when a method results in any other error, a COM::MethodInvocationError\nwill be
117
+ raised, which can be queried for the specifics, specifically #message,\n #method,
118
+ #server, #code, #hresult_code, and #hresult_message.\n\n### Pathname ###\n\nThe
119
+ Pathname object receives an additional method, #to_com. This method is\nuseful
120
+ for when you want to pass a Pathname object to a COM method. Simply\ncall #to_com
121
+ to turn it into a String of the right encoding for COM:\n\n Word::Application.new.documents.open(Pathname('a.docx').to_com)\n
122
+ \ # ⇒ Word::Document\n\n\n## Installation ##\n\nInstall COM with\n\n % gem
123
+ install com\n\n\n## License ##\n\nYou may use, copy and redistribute this library
124
+ under the same [terms][1] as\nRuby itself.\n\n[1]: http://www.ruby-lang.org/en/LICENSE.txt\n\n\n##
125
+ Contributors ##\n\n * Nikolai Weibull\n"
126
+ email: now@bitwi.se
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - lib/com/error.rb
132
+ - lib/com/events.rb
133
+ - lib/com/instantiable.rb
134
+ - lib/com/methodinvocationerror.rb
135
+ - lib/com/object.rb
136
+ - lib/com/pathname.rb
137
+ - lib/com/patternerror.rb
138
+ - lib/com/standarderror.rb
139
+ - lib/com/version.rb
140
+ - lib/com/win32ole.rb
141
+ - lib/com/wrapper.rb
142
+ - lib/com.rb
143
+ - test/unit/com/error.rb
144
+ - test/unit/com/events.rb
145
+ - test/unit/com/instantiable.rb
146
+ - test/unit/com/methodinvocationerror.rb
147
+ - test/unit/com/object.rb
148
+ - test/unit/com/pathname.rb
149
+ - test/unit/com/standarderror.rb
150
+ - test/unit/com.rb
151
+ - README
152
+ - Rakefile
153
+ homepage: http://github.com/now/com
154
+ licenses: []
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 1.8.10
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: COM is an object-oriented wrapper around WIN32OLE.
178
+ test_files: []