function_importer 0.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.
- data/ChangeLog +11 -0
- data/README +62 -0
- data/Rakefile +53 -0
- data/lib/function_importer.rb +86 -0
- data/spec/function_exporter_spec.rb +43 -0
- data/spec/spec_helper.rb +5 -0
- data/tasks/basic_config.rake +27 -0
- data/tasks/basic_tasks.rake +144 -0
- metadata +83 -0
data/ChangeLog
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
commit 1e41d415433a45ecac051021ac62fd88345c428c
|
2
|
+
Author: Keiji, Yoshimi <walf443@gmail.com>
|
3
|
+
Date: Sat Mar 28 20:00:10 2009 +0900
|
4
|
+
|
5
|
+
added ChangeLog file.
|
6
|
+
|
7
|
+
commit f365f447c2c9342400da03db57e012811a229900
|
8
|
+
Author: Keiji, Yoshimi <walf443@gmail.com>
|
9
|
+
Date: Sat Mar 28 19:44:15 2009 +0900
|
10
|
+
|
11
|
+
initial import.
|
data/README
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
= function_importer
|
2
|
+
writing explicitly need function for a module. and support rename.
|
3
|
+
|
4
|
+
== Example
|
5
|
+
require 'rubygems'
|
6
|
+
require 'function_importer'
|
7
|
+
module Utils
|
8
|
+
extend FunctionExporter
|
9
|
+
|
10
|
+
def escape str
|
11
|
+
"escaped_#{str}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module Foo
|
16
|
+
Utils.export self, :escape
|
17
|
+
|
18
|
+
def run
|
19
|
+
p(escape('str')) #=> "escaped_str"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# you can rename methods when argument is Hash.
|
24
|
+
module Bar
|
25
|
+
Utils.export self, :escape => :my_escape
|
26
|
+
|
27
|
+
def run
|
28
|
+
p(my_escape('str')) #=> "escaped_str"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# or syntax suger.
|
33
|
+
module Baz
|
34
|
+
extend FunctionImporter
|
35
|
+
import_function Utils, :escape
|
36
|
+
|
37
|
+
def run
|
38
|
+
p(escape('str')) #=> "escaped_str"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# apply to class method.
|
43
|
+
module Baz
|
44
|
+
extend FunctionImporter
|
45
|
+
import_module_function Utils, :escape
|
46
|
+
|
47
|
+
def self.run
|
48
|
+
p(escape('str')) #=> "escaped_str"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
== Descripotin
|
53
|
+
restrict importing methods and rename methods when include module.
|
54
|
+
|
55
|
+
== SEE ALSO
|
56
|
+
+module-import+: I'm not like this module interface. (For example, pollute Kernel#import ).
|
57
|
+
|
58
|
+
== Copyright
|
59
|
+
|
60
|
+
Author:: Keiji, Yoshimi <walf443 at gmail.com>
|
61
|
+
License:: you can redistribute it and/or modify it under the same terms as Ruby itself.
|
62
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'rake/packagetask'
|
6
|
+
require 'rake/gempackagetask'
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
require 'rake/contrib/rubyforgepublisher'
|
9
|
+
require 'rake/contrib/sshpublisher'
|
10
|
+
require 'fileutils'
|
11
|
+
include FileUtils
|
12
|
+
|
13
|
+
load File.join(File.dirname(__FILE__), 'tasks', 'basic_config.rake')
|
14
|
+
|
15
|
+
NAME = "function_importer"
|
16
|
+
DESCRIPTION = <<-"END_DESCRIPTION"
|
17
|
+
restrict importing methods and rename methods when include module.
|
18
|
+
END_DESCRIPTION
|
19
|
+
BIN_FILES = %w( )
|
20
|
+
VERS = "0.0.1"
|
21
|
+
|
22
|
+
EXTRA_RDOC_FILES = []
|
23
|
+
HECKLE_ROOT_MODULES = ["Classx"]
|
24
|
+
|
25
|
+
SPEC = Gem::Specification.new do |s|
|
26
|
+
s.name = NAME
|
27
|
+
s.version = VERS
|
28
|
+
s.platform = Gem::Platform::RUBY
|
29
|
+
s.has_rdoc = true
|
30
|
+
s.extra_rdoc_files = DEFAULT_EXTRA_RDOC_FILES + EXTRA_RDOC_FILES
|
31
|
+
s.rdoc_options += RDOC_OPTS + ['--title', "#{NAME} documentation", ]
|
32
|
+
s.summary = DESCRIPTION
|
33
|
+
s.description = DESCRIPTION
|
34
|
+
s.author = AUTHOR
|
35
|
+
s.email = EMAIL
|
36
|
+
s.homepage = HOMEPATH
|
37
|
+
s.executables = BIN_FILES
|
38
|
+
s.rubyforge_project = RUBYFORGE_PROJECT
|
39
|
+
s.bindir = "bin"
|
40
|
+
s.require_path = "lib"
|
41
|
+
s.autorequire = ""
|
42
|
+
s.test_files = Dir["spec/*_spec.rb"]
|
43
|
+
|
44
|
+
if Gem::RubyGemsVersion >= "1.2"
|
45
|
+
s.add_development_dependency('rspec', '>=1.1.4')
|
46
|
+
end
|
47
|
+
#s.required_ruby_version = '>= 1.8.2'
|
48
|
+
|
49
|
+
s.files = PKG_FILES + EXTRA_RDOC_FILES
|
50
|
+
s.extensions = EXTENSIONS
|
51
|
+
end
|
52
|
+
|
53
|
+
import File.join(File.dirname(__FILE__), 'tasks', 'basic_tasks.rake')
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# add module a method to export function.
|
2
|
+
module FunctionExporter
|
3
|
+
# Example:
|
4
|
+
# module Utils
|
5
|
+
# extend FunctionExporter
|
6
|
+
#
|
7
|
+
# def escape str
|
8
|
+
# "escaped_#{str}"
|
9
|
+
# end
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# module Foo
|
13
|
+
# Utils.export self, :escape
|
14
|
+
#
|
15
|
+
# def run
|
16
|
+
# p(escape('str')) #=> "escaped_str"
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # you can rename method when argument is Hash.
|
21
|
+
# module Bar
|
22
|
+
# Utils.export self, :escape => :my_escape
|
23
|
+
#
|
24
|
+
# def run
|
25
|
+
# p(my_escape('str')) #=> "escaped_str"
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
def export context, *args
|
30
|
+
parent_mod = create_export_module(*args)
|
31
|
+
context.module_eval do
|
32
|
+
include parent_mod
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_export_module *args
|
37
|
+
parent_mod = self.dup
|
38
|
+
|
39
|
+
method_of = {};
|
40
|
+
case args.first
|
41
|
+
when Hash
|
42
|
+
args.first.each do |key, val|
|
43
|
+
method_of[key.to_s] = val
|
44
|
+
end
|
45
|
+
else
|
46
|
+
args.each do |i|
|
47
|
+
method_of[i.to_s] = true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
no_need_methods = []
|
52
|
+
parent_mod.instance_methods.each do |meth|
|
53
|
+
unless method_of[meth.to_s]
|
54
|
+
no_need_methods.push meth
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
parent_mod.module_eval do
|
59
|
+
# renate method.
|
60
|
+
method_of.each do |key, val|
|
61
|
+
next if val.kind_of? TrueClass
|
62
|
+
alias_method val, key
|
63
|
+
undef_method key
|
64
|
+
end
|
65
|
+
no_need_methods.each do |meth|
|
66
|
+
undef_method meth
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
parent_mod
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# syntax suger for import function.
|
75
|
+
module FunctionImporter
|
76
|
+
|
77
|
+
def import_function mod, *funcs
|
78
|
+
include(mod.create_export_module(*funcs))
|
79
|
+
end
|
80
|
+
|
81
|
+
def import_module_function mod, *funcs
|
82
|
+
extend(mod.create_export_module(*funcs))
|
83
|
+
end
|
84
|
+
|
85
|
+
private :import_function, :import_module_function
|
86
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe FunctionExporter do
|
4
|
+
before :all do
|
5
|
+
@module = Module.new
|
6
|
+
@module.module_eval do
|
7
|
+
extend FunctionExporter
|
8
|
+
|
9
|
+
define_method :escape do |str|
|
10
|
+
"escaped_#{str}"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'export a function' do
|
17
|
+
before do
|
18
|
+
@export_mod = @module.create_export_module :escape
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should return Module' do
|
22
|
+
@export_mod.should be_kind_of(Module)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should have #escape as public' do
|
26
|
+
@export_mod.public_instance_methods.any? {|i| i.to_s == 'escape' }.should be_true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'export a function with rename' do
|
31
|
+
before do
|
32
|
+
@export_mod = @module.create_export_module :escape => :my_escape
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should not have #escape' do
|
36
|
+
@export_mod.instance_methods.all? {|i| i.to_s != 'escape' }.should be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should have #my_escape as public' do
|
40
|
+
@export_mod.instance_methods.any? {|i| i.to_s == 'my_escape' }.should be_true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
AUTHOR = "Keiji, Yoshimi"
|
2
|
+
EMAIL = "walf443 at gmail.com"
|
3
|
+
RUBYFORGE_PROJECT = "akasakarb"
|
4
|
+
RUBYFORGE_PROJECT_ID = 4314
|
5
|
+
HOMEPATH = "http://walf443.github.com/function_importer/"
|
6
|
+
RDOC_OPTS = [
|
7
|
+
"--charset", "utf-8",
|
8
|
+
"--opname", "index.html",
|
9
|
+
"--line-numbers",
|
10
|
+
"--main", "README",
|
11
|
+
"--inline-source",
|
12
|
+
"--accessor", "has=rw",
|
13
|
+
'--exclude', '^(example|extras)/'
|
14
|
+
]
|
15
|
+
DEFAULT_EXTRA_RDOC_FILES = ['README', 'ChangeLog']
|
16
|
+
PKG_FILES = [ 'Rakefile' ] +
|
17
|
+
DEFAULT_EXTRA_RDOC_FILES +
|
18
|
+
Dir.glob('{bin,lib,test,spec,doc,bench,example,tasks,script,generator,templates,extras,website}/**/*') +
|
19
|
+
Dir.glob('ext/**/*.{h,c,rb}') +
|
20
|
+
Dir.glob('examples/**/*.rb') +
|
21
|
+
Dir.glob('tools/*.rb')
|
22
|
+
|
23
|
+
[ %r{^doc/.+\.pdf}, %r{^doc/.+\.key} ].each do |ignore|
|
24
|
+
PKG_FILES.delete_if {|file| file =~ ignore }
|
25
|
+
end
|
26
|
+
|
27
|
+
EXTENSIONS = FileList['ext/**/extconf.rb'].to_a
|
@@ -0,0 +1,144 @@
|
|
1
|
+
|
2
|
+
REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
|
3
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
4
|
+
|
5
|
+
Rake::GemPackageTask.new(SPEC) do |p|
|
6
|
+
p.need_tar = true
|
7
|
+
p.gem_spec = SPEC
|
8
|
+
end
|
9
|
+
|
10
|
+
task :default => [:spec]
|
11
|
+
task :test => [:spec]
|
12
|
+
task :package => [:clean]
|
13
|
+
|
14
|
+
require 'spec/rake/spectask'
|
15
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
16
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
17
|
+
t.spec_opts = ['--options', 'spec/spec.opts']
|
18
|
+
t.warning = true
|
19
|
+
# t.rcov = true
|
20
|
+
t.rcov_dir = 'doc/output/coverage'
|
21
|
+
t.rcov_opts = ['--exclude', 'spec,\.autotest,/Library/']
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Heckle each module and class in turn"
|
25
|
+
task :heckle => :spec do
|
26
|
+
root_modules = HECKLE_ROOT_MODULES
|
27
|
+
spec_files = FileList['spec/**/*_spec.rb']
|
28
|
+
|
29
|
+
current_module, current_method = nil, nil
|
30
|
+
heckle_caught_modules = Hash.new { |hash, key| hash[key] = [] }
|
31
|
+
unhandled_mutations = 0
|
32
|
+
|
33
|
+
root_modules.each do |root_module|
|
34
|
+
IO.popen("heckle #{root_module} -t #{spec_files}") do |pipe|
|
35
|
+
while line = pipe.gets
|
36
|
+
line = line.chomp
|
37
|
+
|
38
|
+
if line =~ /^\*\*\* ((?:\w+(?:::)?)+)#(\w+)/
|
39
|
+
current_module, current_method = $1, $2
|
40
|
+
elsif line == "The following mutations didn't cause test failures:"
|
41
|
+
heckle_caught_modules[current_module] << current_method
|
42
|
+
elsif line == "+++ mutation"
|
43
|
+
unhandled_mutations += 1
|
44
|
+
end
|
45
|
+
|
46
|
+
puts line
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
if unhandled_mutations > 0
|
52
|
+
error_message_lines = ["*************\n"]
|
53
|
+
|
54
|
+
error_message_lines <<
|
55
|
+
"Heckle found #{unhandled_mutations} " +
|
56
|
+
"mutation#{"s" unless unhandled_mutations == 1} " +
|
57
|
+
"that didn't cause spec violations\n"
|
58
|
+
|
59
|
+
heckle_caught_modules.each do |mod, methods|
|
60
|
+
error_message_lines <<
|
61
|
+
"#{mod} contains the following poorly-specified methods:"
|
62
|
+
methods.each do |m|
|
63
|
+
error_message_lines << " - #{m}"
|
64
|
+
end
|
65
|
+
error_message_lines << ""
|
66
|
+
end
|
67
|
+
|
68
|
+
error_message_lines <<
|
69
|
+
"Get your act together and come back " +
|
70
|
+
"when your specs are doing their job!"
|
71
|
+
|
72
|
+
puts "*************"
|
73
|
+
raise error_message_lines.join("\n")
|
74
|
+
else
|
75
|
+
puts "Well done! Your code withstood a heckling."
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
require 'spec/rake/verify_rcov'
|
80
|
+
RCov::VerifyTask.new(:rcov => :spec) do |t|
|
81
|
+
t.index_html = "doc/output/coverage/index.html"
|
82
|
+
t.threshold = 100
|
83
|
+
end
|
84
|
+
|
85
|
+
task :install do
|
86
|
+
name = "#{NAME}-#{VERS}.gem"
|
87
|
+
sh %{rake package}
|
88
|
+
sh %{sudo gem install pkg/#{name}}
|
89
|
+
end
|
90
|
+
|
91
|
+
task :uninstall => [:clean] do
|
92
|
+
sh %{sudo gem uninstall #{NAME}}
|
93
|
+
end
|
94
|
+
|
95
|
+
begin
|
96
|
+
allison_path = `allison --path`.chomp
|
97
|
+
Rake::RDocTask.new do |rdoc|
|
98
|
+
rdoc.rdoc_dir = 'html'
|
99
|
+
rdoc.options += RDOC_OPTS
|
100
|
+
rdoc.template = allison_path
|
101
|
+
if ENV['DOC_FILES']
|
102
|
+
rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
|
103
|
+
else
|
104
|
+
rdoc.rdoc_files.include('README', 'ChangeLog')
|
105
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
106
|
+
rdoc.rdoc_files.include('ext/**/*.c')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
rescue Exception => e
|
110
|
+
warn e
|
111
|
+
warn "skipping rdoc task"
|
112
|
+
ensure
|
113
|
+
end
|
114
|
+
|
115
|
+
desc "Publish to RubyForge"
|
116
|
+
task :rubyforge => [:rdoc, :package] do
|
117
|
+
require 'rubyforge'
|
118
|
+
Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'yoshimi').upload
|
119
|
+
end
|
120
|
+
|
121
|
+
desc 'Package and upload the release to rubyforge.'
|
122
|
+
task :release => [:clean, :package] do |t|
|
123
|
+
require 'rubyforge'
|
124
|
+
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
|
125
|
+
abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
|
126
|
+
pkg = "pkg/#{NAME}-#{VERS}"
|
127
|
+
|
128
|
+
rf = RubyForge.new
|
129
|
+
puts "Logging in"
|
130
|
+
rf.login
|
131
|
+
|
132
|
+
c = rf.userconfig
|
133
|
+
# c["release_notes"] = description if description
|
134
|
+
# c["release_changes"] = changes if changes
|
135
|
+
c["preformatted"] = true
|
136
|
+
|
137
|
+
files = [
|
138
|
+
"#{pkg}.tgz",
|
139
|
+
"#{pkg}.gem"
|
140
|
+
].compact
|
141
|
+
|
142
|
+
puts "Releasing #{NAME} v. #{VERS}"
|
143
|
+
rf.add_release RUBYFORGE_PROJECT_ID, RUBYFORGE_PACKAGE_ID, VERS, *files
|
144
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: function_importer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Keiji, Yoshimi
|
8
|
+
autorequire: ""
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-28 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.4
|
24
|
+
version:
|
25
|
+
description: restrict importing methods and rename methods when include module.
|
26
|
+
email: walf443 at gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README
|
33
|
+
- ChangeLog
|
34
|
+
files:
|
35
|
+
- Rakefile
|
36
|
+
- README
|
37
|
+
- ChangeLog
|
38
|
+
- lib/function_importer.rb
|
39
|
+
- spec/function_exporter_spec.rb
|
40
|
+
- spec/spec_helper.rb
|
41
|
+
- tasks/basic_config.rake
|
42
|
+
- tasks/basic_tasks.rake
|
43
|
+
has_rdoc: true
|
44
|
+
homepage: http://walf443.github.com/function_importer/
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options:
|
47
|
+
- --charset
|
48
|
+
- utf-8
|
49
|
+
- --opname
|
50
|
+
- index.html
|
51
|
+
- --line-numbers
|
52
|
+
- --main
|
53
|
+
- README
|
54
|
+
- --inline-source
|
55
|
+
- --accessor
|
56
|
+
- has=rw
|
57
|
+
- --exclude
|
58
|
+
- ^(example|extras)/
|
59
|
+
- --title
|
60
|
+
- function_importer documentation
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
version:
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
rubyforge_project: akasakarb
|
78
|
+
rubygems_version: 1.3.1
|
79
|
+
signing_key:
|
80
|
+
specification_version: 2
|
81
|
+
summary: restrict importing methods and rename methods when include module.
|
82
|
+
test_files:
|
83
|
+
- spec/function_exporter_spec.rb
|