pycall 1.2.0 → 1.4.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.
@@ -51,8 +51,18 @@ module PyCall
51
51
 
52
52
  def <(other)
53
53
  case other
54
+ when self
55
+ false
54
56
  when PyTypeObjectWrapper
55
57
  __pyptr__ < other.__pyptr__
58
+ when Class
59
+ false if other.ancestors.include?(self)
60
+ when Module
61
+ if ancestors.include?(other)
62
+ true
63
+ elsif other.ancestors.include?(self)
64
+ false
65
+ end
56
66
  else
57
67
  raise TypeError, "compared with non class/module"
58
68
  end
@@ -1,3 +1,9 @@
1
1
  module PyCall
2
- VERSION = "1.2.0"
2
+ VERSION = "1.4.0"
3
+
4
+ module Version
5
+ numbers, TAG = VERSION.split("-")
6
+ MAJOR, MINOR, MICRO = numbers.split(".").map(&:to_i)
7
+ STRING = VERSION
8
+ end
3
9
  end
@@ -1,5 +1,49 @@
1
1
  module PyCall
2
2
  class WrapperObjectCache
3
+
4
+ begin
5
+ ObjectSpace::WeakMap.new[42] = Object.new
6
+ rescue
7
+ WMAP_SUPPORT_INT_KEY = false
8
+ else
9
+ WMAP_SUPPORT_INT_KEY = true
10
+ end
11
+
12
+ if WMAP_SUPPORT_INT_KEY
13
+ def self.get_key(pyptr)
14
+ pyptr.__address__
15
+ end
16
+ else
17
+ class Key
18
+ @address_key_map = {}
19
+
20
+ def self.[](address)
21
+ # An instance of Key created here is parmanently cached in @address_key_map.
22
+ # This behavior is intentional.
23
+ @address_key_map[address] ||= new(address)
24
+ end
25
+
26
+ def initialize(address)
27
+ @address = address
28
+ end
29
+
30
+ attr_reader :address
31
+
32
+ def ==(other)
33
+ case other
34
+ when Key
35
+ self.address == other.address
36
+ else
37
+ super
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.get_key(pyptr)
43
+ Key[pyptr.__address__]
44
+ end
45
+ end
46
+
3
47
  def initialize(*restricted_pytypes)
4
48
  unless restricted_pytypes.empty?
5
49
  restricted_pytypes.each do |pytype|
@@ -8,9 +52,7 @@ module PyCall
8
52
  end
9
53
  end
10
54
  @restricted_pytypes = restricted_pytypes
11
- @wrapper_object_table = {}
12
- @wrapped_pyptr_table = {}
13
- @weakref_table = {}
55
+ @wrapper_object_table = ObjectSpace::WeakMap.new
14
56
  end
15
57
 
16
58
  def lookup(pyptr)
@@ -25,16 +67,14 @@ module PyCall
25
67
  end
26
68
  end
27
69
 
28
- wrapper_object_id = @wrapper_object_table[pyptr.__address__]
29
- if wrapper_object_id
30
- wrapper_object = ObjectSpace._id2ref(wrapper_object_id) rescue nil
31
- return wrapper_object if wrapper_object
70
+ key = self.class.get_key(pyptr)
71
+ wrapper_object = @wrapper_object_table[key]
72
+ unless wrapper_object
73
+ wrapper_object = yield(pyptr)
74
+ check_wrapper_object(wrapper_object)
75
+ @wrapper_object_table[key] = wrapper_object
32
76
  end
33
77
 
34
- wrapper_object = yield(pyptr)
35
- check_wrapper_object(wrapper_object)
36
- register_wrapper_object(pyptr, wrapper_object)
37
-
38
78
  wrapper_object
39
79
  end
40
80
 
@@ -43,19 +83,5 @@ module PyCall
43
83
  raise TypeError, "unexpected wrapper object (expected an object extended by PyObjectWrapper)"
44
84
  end
45
85
  end
46
-
47
- def register_wrapper_object(pyptr, wrapper_object)
48
- @wrapper_object_table[pyptr.__address__] = wrapper_object.__id__
49
- @wrapped_pyptr_table[wrapper_object.__id__] = pyptr.__address__
50
- ObjectSpace.define_finalizer(wrapper_object, &method(:unregister_wrapper_object))
51
- # TODO: weakref
52
- self
53
- end
54
-
55
- def unregister_wrapper_object(wrapper_object_id)
56
- pyptr_addr = @wrapped_pyptr_table.delete(wrapper_object_id)
57
- @wrapper_object_table.delete(pyptr_addr) if pyptr_addr
58
- self
59
- end
60
86
  end
61
87
  end
data/pycall.gemspec CHANGED
@@ -5,7 +5,13 @@ require 'pycall/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "pycall"
8
- spec.version = PyCall::VERSION
8
+ version_components = [
9
+ PyCall::Version::MAJOR.to_s,
10
+ PyCall::Version::MINOR.to_s,
11
+ PyCall::Version::MICRO.to_s,
12
+ PyCall::Version::TAG,
13
+ ]
14
+ spec.version = version_components.compact.join(".")
9
15
  spec.authors = ["Kenta Murata"]
10
16
  spec.email = ["mrkn@mrkn.jp"]
11
17
 
@@ -30,7 +36,7 @@ Gem::Specification.new do |spec|
30
36
  spec.require_paths = ["lib"]
31
37
  spec.extensions = ["ext/pycall/extconf.rb"]
32
38
 
33
- spec.add_development_dependency "bundler", ">= 1.17.2"
39
+ spec.add_development_dependency "bundler"
34
40
  spec.add_development_dependency "rake"
35
41
  spec.add_development_dependency "rake-compiler"
36
42
  spec.add_development_dependency "rake-compiler-dock"
@@ -38,4 +44,5 @@ Gem::Specification.new do |spec|
38
44
  spec.add_development_dependency "launchy"
39
45
  spec.add_development_dependency "pry"
40
46
  spec.add_development_dependency "pry-byebug"
47
+ spec.add_development_dependency "test-unit"
41
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pycall
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenta Murata
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-19 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.17.2
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.17.2
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: test-unit
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: pycall
126
140
  email:
127
141
  - mrkn@mrkn.jp
@@ -130,15 +144,15 @@ extensions:
130
144
  - ext/pycall/extconf.rb
131
145
  extra_rdoc_files: []
132
146
  files:
147
+ - ".github/workflows/ci.yml"
148
+ - ".github/workflows/windows.yml"
133
149
  - ".gitignore"
134
150
  - ".rspec"
135
- - ".travis.yml"
136
151
  - CHANGES.md
137
152
  - Gemfile
138
153
  - LICENSE.txt
139
154
  - README.md
140
155
  - Rakefile
141
- - appveyor.yml
142
156
  - bin/console
143
157
  - bin/guard
144
158
  - bin/rspec
@@ -157,6 +171,7 @@ files:
157
171
  - examples/notebooks/classifier_comparison.ipynb
158
172
  - examples/notebooks/forest_importances.ipynb
159
173
  - examples/notebooks/iruby_integration.ipynb
174
+ - examples/notebooks/leaflet.ipynb
160
175
  - examples/notebooks/lorenz_attractor.ipynb
161
176
  - examples/notebooks/polar_axes.ipynb
162
177
  - examples/notebooks/sum_benchmarking.ipynb
@@ -171,6 +186,7 @@ files:
171
186
  - ext/pycall/pycall_internal.h
172
187
  - ext/pycall/range.c
173
188
  - ext/pycall/ruby_wrapper.c
189
+ - ext/pycall/thread.c
174
190
  - images/pycallrb_logo.png
175
191
  - images/pycallrb_logo_200.png
176
192
  - lib/pycall.rb
@@ -219,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
235
  - !ruby/object:Gem::Version
220
236
  version: '0'
221
237
  requirements: []
222
- rubygems_version: 3.0.2
238
+ rubygems_version: 3.2.3
223
239
  signing_key:
224
240
  specification_version: 4
225
241
  summary: pycall
data/.travis.yml DELETED
@@ -1,56 +0,0 @@
1
- language: ruby
2
-
3
- os: linux
4
-
5
- dist: trusty
6
- sudo: required
7
-
8
- rvm:
9
- - ruby-head
10
- - 2.5.0
11
- - 2.4.3
12
- - 2.3.5
13
-
14
- env:
15
- global:
16
- - PYCALL_DEBUG_FIND_LIBPYTHON=1
17
- matrix:
18
- - PYENV_VERSION=2.7.13
19
- - PYENV_VERSION=3.6.2
20
- - PYENV_VERSION=system LIBPYTHON=versions/3.6.2/lib/libpython3.6m.so
21
- - PYENV_VERSION=miniconda2-4.1.11
22
- - PYENV_VERSION=miniconda3-4.3.11
23
-
24
- matrix:
25
- include:
26
- - os: osx
27
- osx_image: xcode9
28
- compiler: clang
29
- rvm: 2.4.1
30
- env: PYENV_VERSION=3.6.2
31
- - os: osx
32
- osx_image: xcode9
33
- compiler: clang
34
- rvm: 2.4.1
35
- env: PYENV_VERSION=system LIBPYTHON=versions/3.6.2/lib/libpython3.6m.so
36
- - os: osx
37
- osx_image: xcode9
38
- compiler: clang
39
- rvm: 2.4.1
40
- env: PYENV_VERSION=miniconda3-4.3.11
41
- allow_failures:
42
- - os: osx
43
-
44
- before_install:
45
- - gem update --system
46
- - gem update bundler
47
- - export PATH="$(pyenv root)/bin:$PATH"
48
- - eval "$(pyenv init -)"
49
-
50
- install:
51
- - ci/travis_install.sh
52
-
53
- before_script:
54
- - . ci/travis_before_script.sh
55
- - bundle exec rake clobber compile
56
- - python lib/pycall/python/investigator.py
data/appveyor.yml DELETED
@@ -1,104 +0,0 @@
1
- ---
2
- environment:
3
- matrix:
4
- # Ruby 2.4 (32bit)
5
- - ruby_version: "24"
6
- PYTHONDIR: "C:\\Python27"
7
- PYTHON: "C:\\Python27\\python.exe"
8
-
9
- - ruby_version: "24"
10
- PYTHONDIR: "C:\\Python34"
11
- PYTHON: "C:\\Python34\\python.exe"
12
-
13
- - ruby_version: "24"
14
- PYTHONDIR: "C:\\Python35"
15
- PYTHON: "C:\\Python35\\python.exe"
16
-
17
- - ruby_version: "24"
18
- PYTHONDIR: "C:\\Python36"
19
- PYTHON: "C:\\Python36\\python.exe"
20
-
21
- # Ruby 2.4 (64bit)
22
- - ruby_version: "24-x64"
23
- PYTHONDIR: "C:\\Python27-x64"
24
- PYTHON: "C:\\Python27-x64\\python.exe"
25
-
26
- - ruby_version: "24-x64"
27
- PYTHONDIR: "C:\\Python34-x64"
28
- PYTHON: "C:\\Python34-x64\\python.exe"
29
-
30
- - ruby_version: "24-x64"
31
- PYTHONDIR: "C:\\Python35-x64"
32
- PYTHON: "C:\\Python35-x64\\python.exe"
33
-
34
- - ruby_version: "24-x64"
35
- PYTHONDIR: "C:\\Python36-x64"
36
- PYTHON: "C:\\Python36-x64\\python.exe"
37
-
38
- # Ruby 2.3 (32bit)
39
- - ruby_version: "23"
40
- PYTHONDIR: "C:\\Python27"
41
- PYTHON: "C:\\Python27\\python.exe"
42
-
43
- - ruby_version: "23"
44
- PYTHONDIR: "C:\\Python34"
45
- PYTHON: "C:\\Python34\\python.exe"
46
-
47
- - ruby_version: "23"
48
- PYTHONDIR: "C:\\Python35"
49
- PYTHON: "C:\\Python35\\python.exe"
50
-
51
- - ruby_version: "23"
52
- PYTHONDIR: "C:\\Python36"
53
- PYTHON: "C:\\Python36\\python.exe"
54
-
55
- # Ruby 2.3 (64bit)
56
- - ruby_version: "23-x64"
57
- PYTHONDIR: "C:\\Python27-x64"
58
- PYTHON: "C:\\Python27-x64\\python.exe"
59
-
60
- - ruby_version: "23-x64"
61
- PYTHONDIR: "C:\\Python34-x64"
62
- PYTHON: "C:\\Python34-x64\\python.exe"
63
-
64
- - ruby_version: "23-x64"
65
- PYTHONDIR: "C:\\Python35-x64"
66
- PYTHON: "C:\\Python35-x64\\python.exe"
67
-
68
- - ruby_version: "23-x64"
69
- PYTHONDIR: "C:\\Python36-x64"
70
- PYTHON: "C:\\Python36-x64\\python.exe"
71
-
72
- branches:
73
- only:
74
- - master
75
- - /release-.*/
76
-
77
- notifications:
78
- - provider: Email
79
- on_build_success: false
80
- on_build_failure: false
81
- on_build_status_changed: false
82
-
83
- deploy: off
84
- build: off
85
-
86
- install:
87
- - "SET PATH=%PYTHONDIR%;%PYTHONDIR%\\Scripts;%PATH%"
88
- - "SET PATH=C:\\Ruby%ruby_version%\\bin;%PATH%"
89
- - "bundle install"
90
- - "pip install numpy"
91
-
92
- before_test:
93
- - "bundle exec rake -rdevkit clobber compile"
94
- - ECHO "=== python investigator.py ==="
95
- - "python lib\\pycall\\python\\investigator.py"
96
-
97
- test_script:
98
- - "SET PYCALL_DEBUG_FIND_LIBPYTHON=1"
99
- - rake
100
-
101
- matrix:
102
- allow_failures:
103
- - PYTHONDIR: "C:\\Python27"
104
- - PYTHONDIR: "C:\\Python27-x64"