pak 1.0.1
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.
- checksums.yaml +7 -0
- data/lib/package.rb +152 -0
- data/lib/pak.rb +1 -0
- metadata +145 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5650bca421abab4825cc8cf8db2faa1ef82b82f9
|
4
|
+
data.tar.gz: 5466d170f9a260a1bb659a4c107e5a904aa64069
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65fa288c2384b2a453519bcbcb52ad6adbace16162e32001999c15a67ab671a7b5334509cb49251125aa0a61b172c611ee205f14bc9a9420d77289e152f8d81e
|
7
|
+
data.tar.gz: 6977cc5fc53685989df757361094e2cc14d35e7abdb1fb13892f68790b7f1cfd1ae09bb78c79e2dfd3de8a832d510256b33746afe6b6636f8724b77942453d8a
|
data/lib/package.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'binding_of_caller'
|
2
|
+
|
3
|
+
class Package < Module
|
4
|
+
module KernelMethods
|
5
|
+
NS_SEP = '/'.freeze
|
6
|
+
|
7
|
+
module_function
|
8
|
+
|
9
|
+
# Return the package as a value
|
10
|
+
def import(caller_binding, namespace, as: nil, to: :method)
|
11
|
+
to ||= :value
|
12
|
+
|
13
|
+
send("import_to_#{to}", caller_binding, namespace, as: as)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Return the package as a value
|
17
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
18
|
+
def import_to_value(_binding, namespace, as: nil)
|
19
|
+
Package.new(namespace)
|
20
|
+
end
|
21
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
22
|
+
|
23
|
+
# Assign the package to a local variable in the caller's binding
|
24
|
+
# Return the package as a value
|
25
|
+
# /!\ Experimental
|
26
|
+
def import_to_local(caller_binding, namespace, as: nil)
|
27
|
+
sym = (as || ns_last(namespace)).to_sym
|
28
|
+
setter = caller_binding.eval(<<-RUBY)
|
29
|
+
#{sym} = nil
|
30
|
+
-> (v) { #{sym} = v }
|
31
|
+
RUBY
|
32
|
+
|
33
|
+
setter.call(Package.new(namespace))
|
34
|
+
end
|
35
|
+
|
36
|
+
# Define a method in the caller's context that hands out the package
|
37
|
+
# Return the package as a value
|
38
|
+
def import_to_method(caller_binding, namespace, as: nil)
|
39
|
+
sym = (as || ns_last(namespace)).to_sym
|
40
|
+
clr = caller_binding.eval('self')
|
41
|
+
setter = clr.instance_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
42
|
+
-> (v) { define_singleton_method(:#{sym}) { v }; v }
|
43
|
+
RUBY
|
44
|
+
|
45
|
+
setter.call(Package.new(namespace))
|
46
|
+
end
|
47
|
+
|
48
|
+
# Set a const to the package in the caller's context
|
49
|
+
# Return the package as a value
|
50
|
+
def import_to_const(caller_binding, namespace, as: nil)
|
51
|
+
sym = (as || ns_classify(ns_last(namespace)).to_sym)
|
52
|
+
clr = caller_binding.eval('self')
|
53
|
+
target = clr.respond_to?(:const_set) ? clr : clr.class
|
54
|
+
setter = target.instance_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
55
|
+
-> (v) { const_set(:#{sym}, v) }
|
56
|
+
RUBY
|
57
|
+
|
58
|
+
setter.call(Package.new(namespace))
|
59
|
+
end
|
60
|
+
|
61
|
+
def ns_from_filename(ns)
|
62
|
+
ns.gsub('/', NS_SEP).gsub(/\.rb$/, '')
|
63
|
+
end
|
64
|
+
|
65
|
+
def ns_to_filename(ns)
|
66
|
+
ns.gsub(NS_SEP, '/') + '.rb'
|
67
|
+
end
|
68
|
+
|
69
|
+
def ns_last(ns)
|
70
|
+
ns.split(NS_SEP).last
|
71
|
+
end
|
72
|
+
|
73
|
+
def ns_classify(namespace)
|
74
|
+
namespace.split(NS_SEP).map! do |v|
|
75
|
+
v.split('_').map!(&:capitalize).join('')
|
76
|
+
end.join('::')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class << self
|
81
|
+
def new(file)
|
82
|
+
file = KernelMethods.ns_to_filename(file)
|
83
|
+
self[file] ||= super(file)
|
84
|
+
end
|
85
|
+
|
86
|
+
def [](key)
|
87
|
+
loaded[key]
|
88
|
+
end
|
89
|
+
|
90
|
+
def []=(key, value)
|
91
|
+
loaded[key] = value
|
92
|
+
end
|
93
|
+
|
94
|
+
# rubocop:disable Naming/MemoizedInstanceVariableName
|
95
|
+
def loaded
|
96
|
+
@store ||= {}
|
97
|
+
end
|
98
|
+
# rubocop:enable Naming/MemoizedInstanceVariableName
|
99
|
+
|
100
|
+
def delete(ns)
|
101
|
+
@store.delete(ns_to_filename(ns))
|
102
|
+
end
|
103
|
+
|
104
|
+
def reload!
|
105
|
+
@store = {}
|
106
|
+
end
|
107
|
+
|
108
|
+
def path
|
109
|
+
$LOAD_PATH
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def initialize(file)
|
114
|
+
@source_file = file
|
115
|
+
@name = KernelMethods.ns_from_filename(file)
|
116
|
+
load_in_module(file)
|
117
|
+
end
|
118
|
+
|
119
|
+
attr_reader :name
|
120
|
+
alias to_s name
|
121
|
+
|
122
|
+
def load(file, wrap = false)
|
123
|
+
wrap ? super : load_in_module(File.join(dir, file))
|
124
|
+
rescue Errno::ENOENT
|
125
|
+
super
|
126
|
+
end
|
127
|
+
|
128
|
+
def inspect
|
129
|
+
format("#<#{self.class.name}(#{name}):0x%014x>", object_id)
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def load_in_module(file)
|
135
|
+
module_eval(IO.read(file),
|
136
|
+
File.expand_path(file))
|
137
|
+
rescue Errno::ENOENT
|
138
|
+
raise
|
139
|
+
end
|
140
|
+
|
141
|
+
def method_added(name)
|
142
|
+
module_function(name)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
module Kernel
|
147
|
+
def import(*args)
|
148
|
+
caller_binding = args.last.is_a?(Binding) ? args.pop : binding.of_caller(1)
|
149
|
+
args.unshift(caller_binding)
|
150
|
+
Package::KernelMethods.import(*args)
|
151
|
+
end
|
152
|
+
end
|
data/lib/pak.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'package'
|
metadata
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pak
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Loic Nageleisen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-09-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: binding_of_caller
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.59.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.59.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.8.7
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.7
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Implicit namespacing and package definition, inspired by Python, Go,
|
112
|
+
CommonJS.
|
113
|
+
email: loic.nageleisen@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- lib/package.rb
|
119
|
+
- lib/pak.rb
|
120
|
+
homepage: https://gitlab.com/lloeki/pak.git
|
121
|
+
licenses:
|
122
|
+
- MIT
|
123
|
+
metadata: {}
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options: []
|
126
|
+
require_paths:
|
127
|
+
- lib
|
128
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
requirements: []
|
139
|
+
rubyforge_project:
|
140
|
+
rubygems_version: 2.6.14.1
|
141
|
+
signing_key:
|
142
|
+
specification_version: 4
|
143
|
+
summary: Packaged namespacing for Ruby
|
144
|
+
test_files: []
|
145
|
+
has_rdoc:
|