rubypython 0.5.1 → 0.5.2

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.
data/Contributors.rdoc CHANGED
@@ -7,3 +7,4 @@ RubyPython has a growing list of contributors.
7
7
  * Steeve Morin (steeve)
8
8
  * Austin Ziegler (halostatue)
9
9
  * Aman Gupta (tmm1)
10
+ * Ben Doerr (bendoerr)
data/History.rdoc CHANGED
@@ -1,3 +1,10 @@
1
+ === 0.5.2 / 2011-10-21
2
+ * Minor Enhancements:
3
+ * The traceback for Python exceptions is now returned usefully. [raineszm]
4
+ * Bug Fixes:
5
+ * Improved the robustness of Windows DLL detection. Based on work by
6
+ bendoerr, raineszm, and halostatue.
7
+
1
8
  === 0.5.1 / 2011-03-17
2
9
  * Major Enhancements:
3
10
  * Procs and methods can be passed to Python. [raineszm]
data/Manifest.txt CHANGED
@@ -33,6 +33,7 @@ spec/legacy_spec.rb
33
33
  spec/pymainclass_spec.rb
34
34
  spec/pyobject_spec.rb
35
35
  spec/python_helpers/basics.py
36
+ spec/python_helpers/errors.py
36
37
  spec/python_helpers/objects.py
37
38
  spec/pythonerror_spec.rb
38
39
  spec/refcnt_spec.rb
data/README.rdoc CHANGED
@@ -71,7 +71,7 @@ start before running the code provided in the block and stop it afterwards.
71
71
  RubyPython.start_from_virtualenv("/path/to/virtualenv")
72
72
 
73
73
  # Or verbose
74
- RubyPython.start(:python => "/path/to/virtualenv/bin/python")
74
+ RubyPython.start(:python_exe => "/path/to/virtualenv/bin/python")
75
75
  RubyPython.activate
76
76
 
77
77
  === Iterator support
@@ -259,10 +259,10 @@ It should work with other implementations that support the Ruby FFI gem with no
259
259
  modification.
260
260
 
261
261
  === OS Support
262
- RubyPython has been tested on Mac OS 10.5 and 10.6, and Ubuntu 10.10 (64-bit
263
- Intel). If your platform has a DLL or shared object version of Python and
264
- supports the FFI gem, it should work. Feedback on other platforms is always
265
- welcome.
262
+ RubyPython has been extensively tested on Mac OS 10.5 and 10.6, and Ubuntu
263
+ 10.10 (64-bit Intel). If your platform has a DLL or shared object version of
264
+ Python and supports the FFI gem, it should work. Feedback on other platforms is
265
+ always welcome.
266
266
 
267
267
  == Install
268
268
  gem install rubypython
data/Rakefile CHANGED
@@ -7,7 +7,6 @@ Hoe.plugin :doofus
7
7
  Hoe.plugin :gemspec
8
8
  Hoe.plugin :git
9
9
  Hoe.plugin :hg
10
- Hoe.plugin :rubyforge
11
10
 
12
11
  Hoe.spec 'rubypython' do |spec|
13
12
  spec.rubyforge_name = spec.name
data/lib/rubypython.rb CHANGED
@@ -15,7 +15,7 @@
15
15
  # puts cPickle.dumps("RubyPython is awesome!").rubify
16
16
  # RubyPython.stop
17
17
  module RubyPython
18
- VERSION = '0.5.1' #:nodoc:
18
+ VERSION = '0.5.2' #:nodoc:
19
19
 
20
20
  # Do not load the FFI interface by default. Wait until the user asks for
21
21
  # it.
@@ -217,7 +217,7 @@ module RubyPython
217
217
  # is *strongly* discouraged as this may lead to segmentation faults.
218
218
  # This feature is highly experimental and may be disabled in the future.
219
219
  def start_from_virtualenv(virtualenv)
220
- result = start(:python => File.join(virtualenv, "bin", "python"))
220
+ result = start(:python_exe => File.join(virtualenv, "bin", "python"))
221
221
  activate
222
222
  result
223
223
  end
@@ -3,11 +3,17 @@ require 'rubypython/macros'
3
3
 
4
4
  # Raised when an error occurs in the \Python interpreter.
5
5
  class RubyPython::PythonError < RuntimeError
6
+ # The \Python traceback object associated with this error. This will be
7
+ # a RubyPython::RubyPyProxy object.
8
+ attr_reader :traceback
9
+
6
10
  # Creates the PythonError.
7
11
  # [typeName] The class name of the \Python error.
8
12
  # [msg] The message attached to the \Python error.
9
- def initialize(typeName, msg)
13
+ # [traceback] The traceback, if any, associated with the \Python error.
14
+ def initialize(typeName, msg, traceback = nil)
10
15
  @type = typeName
16
+ @traceback = traceback
11
17
  super([typeName, msg].join(': '))
12
18
  end
13
19
 
@@ -27,10 +33,15 @@ class RubyPython::PythonError < RuntimeError
27
33
  msg = nil
28
34
  end
29
35
 
36
+ if not rbTraceback.null?
37
+ traceback = RubyPython::RubyPyProxy.new rbTraceback
38
+ else
39
+ traceback = nil
40
+ end
41
+
30
42
  # Decrease the reference count. This will happen anyway when they go out
31
43
  # of scope but might as well.
32
44
  rbValue.xDecref
33
- rbTraceback.xDecref
34
45
  pyName = rbType.getAttr("__name__")
35
46
 
36
47
  rbType.xDecref
@@ -38,7 +49,7 @@ class RubyPython::PythonError < RuntimeError
38
49
  pyName.xDecref
39
50
 
40
51
  RubyPython::PythonError.clear
41
- RubyPython::PythonError.new(rbName, msg)
52
+ RubyPython::PythonError.new(rbName, msg, traceback)
42
53
  end
43
54
 
44
55
  # A wrapper to the \Python C API +PyErr_Fetch+ function. Returns an array
@@ -15,11 +15,15 @@ class RubyPython::PythonExec
15
15
  @python = python_executable || "python"
16
16
  @python = %x(#{@python} -c "import sys; print sys.executable").chomp
17
17
 
18
- @version = run_command 'import sys; print "%d.%d" % sys.version_info[:2]'
18
+ @version = run_command "import sys; print '%d.%d' % sys.version_info[:2]"
19
19
 
20
+ @dirname = File.dirname(@python)
20
21
  @realname = @python.dup
21
- if @realname !~ /#{@version}$/
22
+ if (@realname !~ /#{@version}$/ and @realname !~ /\.exe$/)
22
23
  @realname = "#{@python}#{@version}"
24
+ else
25
+ basename = File.basename(@python, '.exe')
26
+ @realname = File.join(@dirname, "#{basename}#{@version.gsub(/\./, '')}")
23
27
  end
24
28
  @basename = File.basename(@realname)
25
29
 
@@ -62,6 +66,20 @@ class RubyPython::PythonExec
62
66
  end
63
67
  end
64
68
 
69
+ if FFI::Platform.windows?
70
+ # On Windows, the appropriate DLL is usually be found in
71
+ # %SYSTEMROOT%\system or %SYSTEMROOT%\system32; as a fallback we'll
72
+ # use C:\Windows\system{,32} as well as the install directory and the
73
+ # install directory + libs.
74
+ system_root = File.expand_path(ENV['SYSTEMROOT']).gsub(/\\/, '/')
75
+ locations << File.join(system_root, 'system', libname)
76
+ locations << File.join(system_root, 'system32', libname)
77
+ locations << File.join("C:/WINDOWS", "System", libname)
78
+ locations << File.join("C:/WINDOWS", "System32", libname)
79
+ locations << File.join(@dirname, libname)
80
+ locations << File.join(@dirname, 'libs', libname)
81
+ end
82
+
65
83
  # Let's add alternative extensions; again, just in case.
66
84
  locations.dup.each do |location|
67
85
  path = File.dirname(location)
@@ -96,12 +114,12 @@ class RubyPython::PythonExec
96
114
  attr_reader :sys_prefix
97
115
  # The Python library.
98
116
  attr_reader :library
99
- # The version
117
+ # The Python version
100
118
  attr_reader :version
101
119
 
102
120
  # Run a Python command-line command.
103
121
  def run_command(command)
104
- %x(#{@python} -c '#{command}').chomp if @python
122
+ %x(#{@python} -c "#{command}").chomp if @python
105
123
  end
106
124
 
107
125
  def to_s
@@ -0,0 +1,2 @@
1
+ def nested_error():
2
+ return 1 / 0
@@ -35,4 +35,18 @@ describe RubyPython::PythonError do
35
35
  rbType.getAttr("__name__").rubify.should == "ImportError"
36
36
  end
37
37
  end
38
+
39
+ describe ".last_traceback" do
40
+ it "should make availble the Python traceback of the last error" do
41
+ traceback = RubyPython.import 'traceback'
42
+ errors = RubyPython.import 'errors'
43
+ begin
44
+ errors.nested_error
45
+ rescue RubyPython::PythonError => exc
46
+ tb = exc.traceback
47
+ list = traceback.format_tb(tb)
48
+ list.rubify[0].should =~ /1 \/ 0/
49
+ end
50
+ end
51
+ end
38
52
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubypython
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 5
9
- - 1
10
- version: 0.5.1
9
+ - 2
10
+ version: 0.5.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Steeve Morin
@@ -17,8 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-03-17 00:00:00 -04:00
21
- default_executable:
20
+ date: 2011-10-21 00:00:00 Z
22
21
  dependencies:
23
22
  - !ruby/object:Gem::Dependency
24
23
  name: ffi
@@ -53,26 +52,10 @@ dependencies:
53
52
  version: 2.1.2.3
54
53
  type: :runtime
55
54
  version_requirements: *id002
56
- - !ruby/object:Gem::Dependency
57
- name: rubyforge
58
- prerelease: false
59
- requirement: &id003 !ruby/object:Gem::Requirement
60
- none: false
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- hash: 7
65
- segments:
66
- - 2
67
- - 0
68
- - 4
69
- version: 2.0.4
70
- type: :development
71
- version_requirements: *id003
72
55
  - !ruby/object:Gem::Dependency
73
56
  name: rspec
74
57
  prerelease: false
75
- requirement: &id004 !ruby/object:Gem::Requirement
58
+ requirement: &id003 !ruby/object:Gem::Requirement
76
59
  none: false
77
60
  requirements:
78
61
  - - ~>
@@ -83,11 +66,11 @@ dependencies:
83
66
  - 0
84
67
  version: "2.0"
85
68
  type: :development
86
- version_requirements: *id004
69
+ version_requirements: *id003
87
70
  - !ruby/object:Gem::Dependency
88
71
  name: tilt
89
72
  prerelease: false
90
- requirement: &id005 !ruby/object:Gem::Requirement
73
+ requirement: &id004 !ruby/object:Gem::Requirement
91
74
  none: false
92
75
  requirements:
93
76
  - - ~>
@@ -98,23 +81,22 @@ dependencies:
98
81
  - 0
99
82
  version: "1.0"
100
83
  type: :development
101
- version_requirements: *id005
84
+ version_requirements: *id004
102
85
  - !ruby/object:Gem::Dependency
103
86
  name: hoe
104
87
  prerelease: false
105
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ requirement: &id005 !ruby/object:Gem::Requirement
106
89
  none: false
107
90
  requirements:
108
- - - ">="
91
+ - - ~>
109
92
  - !ruby/object:Gem::Version
110
- hash: 41
93
+ hash: 27
111
94
  segments:
112
95
  - 2
113
- - 9
114
- - 1
115
- version: 2.9.1
96
+ - 12
97
+ version: "2.12"
116
98
  type: :development
117
- version_requirements: *id006
99
+ version_requirements: *id005
118
100
  description: |-
119
101
  RubyPython is a bridge between the Ruby and Python interpreters. It embeds a
120
102
  running Python interpreter in the Ruby application's process using FFI and
@@ -178,6 +160,7 @@ files:
178
160
  - spec/pymainclass_spec.rb
179
161
  - spec/pyobject_spec.rb
180
162
  - spec/python_helpers/basics.py
163
+ - spec/python_helpers/errors.py
181
164
  - spec/python_helpers/objects.py
182
165
  - spec/pythonerror_spec.rb
183
166
  - spec/refcnt_spec.rb
@@ -186,7 +169,6 @@ files:
186
169
  - spec/rubypython_spec.rb
187
170
  - spec/spec_helper.rb
188
171
  - .gemtest
189
- has_rdoc: true
190
172
  homepage:
191
173
  licenses: []
192
174
 
@@ -217,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
199
  requirements:
218
200
  - Python, ~> 2.4
219
201
  rubyforge_project: rubypython
220
- rubygems_version: 1.5.2
202
+ rubygems_version: 1.8.10
221
203
  signing_key:
222
204
  specification_version: 3
223
205
  summary: RubyPython is a bridge between the Ruby and Python interpreters