libc-tidy_ffi 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 +2 -0
- data/LICENSE +21 -0
- data/Manifest +15 -0
- data/README +23 -0
- data/Rakefile +17 -0
- data/lib/tidy_ffi/interface.rb +83 -0
- data/lib/tidy_ffi/lib_tidy.rb +43 -0
- data/lib/tidy_ffi/options_container.rb +70 -0
- data/lib/tidy_ffi/tidy.rb +57 -0
- data/lib/tidy_ffi/tidy_ffi_extensions.rb +26 -0
- data/lib/tidy_ffi.rb +11 -0
- data/test/test_helper.rb +12 -0
- data/test/test_options.rb +123 -0
- data/test/test_simple.rb +22 -0
- data/tidy_ffi.gemspec +44 -0
- metadata +120 -0
data/CHANGELOG
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2009 Eugene Pimenov
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/Manifest
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
LICENSE
|
3
|
+
Manifest
|
4
|
+
README
|
5
|
+
Rakefile
|
6
|
+
lib/tidy_ffi/interface.rb
|
7
|
+
lib/tidy_ffi/lib_tidy.rb
|
8
|
+
lib/tidy_ffi/options_container.rb
|
9
|
+
lib/tidy_ffi/tidy.rb
|
10
|
+
lib/tidy_ffi/tidy_ffi_extensions.rb
|
11
|
+
lib/tidy_ffi.rb
|
12
|
+
test/test_helper.rb
|
13
|
+
test/test_options.rb
|
14
|
+
test/test_simple.rb
|
15
|
+
tidy_ffi.gemspec
|
data/README
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
= Tidy FFI
|
2
|
+
|
3
|
+
== Purpose
|
4
|
+
|
5
|
+
I wanna clean and simple tidy library. For example:
|
6
|
+
TidyFFI::Tidy.new('a string').clean
|
7
|
+
|
8
|
+
For now it can't do anything else than clean :)
|
9
|
+
|
10
|
+
== Options
|
11
|
+
|
12
|
+
You can use different ways to set up options. These examples are produces the same output:
|
13
|
+
|
14
|
+
TidyFFI::Tidy.default_options.show_body_only = true
|
15
|
+
TidyFFI::Tidy.new('test').clean
|
16
|
+
|
17
|
+
TidyFFI::Tidy.with_options(:show_body_only => true).new('test').clean
|
18
|
+
|
19
|
+
tidy = TidyFFI::Tidy.new('test')
|
20
|
+
tidy.options.show_body_only = true
|
21
|
+
tidy.clean
|
22
|
+
|
23
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
begin
|
3
|
+
require 'echoe'
|
4
|
+
Echoe.new('tidy_ffi') do |p|
|
5
|
+
p.author = 'Eugene Pimenov'
|
6
|
+
p.summary = 'Tidy library interface via FFI'
|
7
|
+
p.url = 'http://github.com/libc/tidy_ffi'
|
8
|
+
p.runtime_dependencies = ['ffi >= 0.2.0']
|
9
|
+
p.development_dependencies = ['rr', 'matchy', 'context']
|
10
|
+
end
|
11
|
+
rescue LoadError => boom
|
12
|
+
puts "You are missing a dependency required for meta-operations on this gem."
|
13
|
+
puts "#{boom.to_s.capitalize}."
|
14
|
+
|
15
|
+
desc 'No effect.'
|
16
|
+
task :default do; end
|
17
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Low level interface to libtidy.
|
2
|
+
class TidyFFI::Interface
|
3
|
+
LibTidy = TidyFFI::LibTidy
|
4
|
+
|
5
|
+
# Returns a TidyFFI::Interface with initialized interface.
|
6
|
+
def self.with_doc
|
7
|
+
doc = LibTidy.tidyCreate
|
8
|
+
nd = new(doc)
|
9
|
+
nd.with_redirected_error_buffer { yield nd }
|
10
|
+
ensure
|
11
|
+
LibTidy.tidyRelease(doc)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(doc) #:nodoc:
|
15
|
+
@doc = doc
|
16
|
+
end
|
17
|
+
|
18
|
+
# Apply options
|
19
|
+
def apply_options(options)
|
20
|
+
options.each do |key, value|
|
21
|
+
k = key.to_s.gsub('_', '-')
|
22
|
+
|
23
|
+
option = LibTidy.tidyGetOptionByName(@doc, k)
|
24
|
+
raise ArgumentError, "don't know about option #{key}" if option.null?
|
25
|
+
id = LibTidy.tidyOptGetId(option)
|
26
|
+
raise ArgumentError, "can't setup option #{key} to #{value}" if LibTidy.tidyOptSetValue(@doc, id, value.to_s) == 0
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Sets string to tidy
|
31
|
+
def string=(str)
|
32
|
+
LibTidy.tidyParseString(@doc, str)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Cleans string
|
36
|
+
def clean
|
37
|
+
@output = nil
|
38
|
+
LibTidy.tidyCleanAndRepair(@doc)
|
39
|
+
end
|
40
|
+
alias :clean_and_repair :clean
|
41
|
+
alias :repair :clean
|
42
|
+
|
43
|
+
# Returns output from tidy library
|
44
|
+
def output
|
45
|
+
@output ||= begin
|
46
|
+
with_buffer_pointer do |buf|
|
47
|
+
LibTidy.tidySaveBuffer(@doc, buf)
|
48
|
+
buf[:bp]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Redirects error buffer
|
54
|
+
def with_redirected_error_buffer
|
55
|
+
with_buffer_pointer do |buf|
|
56
|
+
@error_buffer = buf
|
57
|
+
LibTidy.tidySetErrorBuffer(@doc, buf)
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
ensure
|
61
|
+
@error_buffer = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
# Yields block with new buffer
|
65
|
+
def with_buffer_pointer
|
66
|
+
buf = tidy_buf_object.new
|
67
|
+
yield buf
|
68
|
+
ensure
|
69
|
+
LibTidy.tidyBufFree(buf)
|
70
|
+
end
|
71
|
+
|
72
|
+
def tidy_buf_object
|
73
|
+
@tidy_buf_object ||= begin
|
74
|
+
release_date = Date.parse(LibTidy.tidyReleaseDate) rescue nil
|
75
|
+
if release_date && (release_date > Date.parse("Dec 29 2006"))
|
76
|
+
TidyFFI::LibTidy::TidyBufWithAllocator
|
77
|
+
else
|
78
|
+
TidyFFI::LibTidy::TidyBuf
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
private :tidy_buf_object
|
83
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Very low level interface to tidy
|
2
|
+
|
3
|
+
# This file must be lazy loaded!
|
4
|
+
class TidyFFI::LibTidy #:nodoc:
|
5
|
+
extend FFI::Library
|
6
|
+
ffi_lib TidyFFI.library_path
|
7
|
+
|
8
|
+
attach_function :tidyReleaseDate, [], :string
|
9
|
+
|
10
|
+
attach_function :tidyCreate, [], :pointer
|
11
|
+
attach_function :tidyRelease, [:pointer], :void
|
12
|
+
|
13
|
+
attach_function :tidyCleanAndRepair, [:pointer], :int
|
14
|
+
attach_function :tidyRunDiagnostics, [:pointer], :int
|
15
|
+
|
16
|
+
attach_function :tidyParseString, [:pointer, :string], :int
|
17
|
+
|
18
|
+
attach_function :tidySaveBuffer, [:pointer, :pointer], :int
|
19
|
+
|
20
|
+
attach_function :tidySetErrorBuffer, [:pointer, :pointer], :int
|
21
|
+
|
22
|
+
attach_function :tidyBufFree, [:pointer], :void
|
23
|
+
|
24
|
+
attach_function :tidyGetOptionByName, [:pointer, :string], :pointer
|
25
|
+
attach_function :tidyOptGetId, [:pointer], :int
|
26
|
+
attach_function :tidyOptSetValue, [:pointer, :int, :string], :int
|
27
|
+
end
|
28
|
+
|
29
|
+
class TidyFFI::LibTidy::TidyBuf < FFI::Struct #:nodoc:
|
30
|
+
layout :bp, :string,
|
31
|
+
:size, :uint,
|
32
|
+
:allocated, :uint,
|
33
|
+
:next, :uint
|
34
|
+
end
|
35
|
+
|
36
|
+
class TidyFFI::LibTidy::TidyBufWithAllocator < FFI::Struct #:nodoc:
|
37
|
+
layout :allocator, :pointer,
|
38
|
+
:bp, :string,
|
39
|
+
:size, :uint,
|
40
|
+
:allocated, :uint,
|
41
|
+
:next, :uint
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class TidyFFI::OptionsContainer #:nodoc:
|
2
|
+
def initialize(ops = nil)
|
3
|
+
if ops
|
4
|
+
@options = ops.to_hash!
|
5
|
+
else
|
6
|
+
@options = {}
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_hash!
|
11
|
+
@options.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
def merge_with_options(options)
|
15
|
+
options.each do |key, val|
|
16
|
+
key = key.intern unless Symbol === key
|
17
|
+
@options[key] = val
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def ==(obj)
|
22
|
+
if obj.is_a?(Hash)
|
23
|
+
@options == obj
|
24
|
+
elsif obj.is_a?(OptionsContainer)
|
25
|
+
obj == @options
|
26
|
+
else
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def clear!
|
32
|
+
@options = {}
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(method, *args)
|
37
|
+
if method.to_s =~ /=$/
|
38
|
+
@options[method.to_s.sub(/=$/, '').intern] = args.first
|
39
|
+
else
|
40
|
+
@options[method]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Proxy #:nodoc:
|
45
|
+
attr_reader :options
|
46
|
+
|
47
|
+
define_method :new do |*args|
|
48
|
+
@obj.new(args.first, options.to_hash!.merge(args[1] || {}))
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize(obj, options1, options2)
|
52
|
+
@obj = obj
|
53
|
+
@options = TidyFFI::OptionsContainer.new(options1)
|
54
|
+
@options.merge_with_options(options2)
|
55
|
+
end
|
56
|
+
|
57
|
+
def with_options(options)
|
58
|
+
Proxy.new(@obj, @options, options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def clear!
|
62
|
+
@options.clear!
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def method_missing(meth, *args)
|
67
|
+
@obj.send(meth, *args)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Clean and simple interface to Tidy
|
2
|
+
class TidyFFI::Tidy
|
3
|
+
OptionsContainer = TidyFFI::OptionsContainer
|
4
|
+
# Initialized object. str is a string to tidy, options is ignored for now :)
|
5
|
+
def initialize(str, options = {})
|
6
|
+
@string = str
|
7
|
+
@options = OptionsContainer.new(self.class.default_options)
|
8
|
+
self.options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns cleaned string
|
12
|
+
def clean
|
13
|
+
@clean ||= TidyFFI::Interface.with_doc do |doc|
|
14
|
+
doc.apply_options(@options.to_hash!)
|
15
|
+
doc.string = @string
|
16
|
+
doc.clean
|
17
|
+
doc.output
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Assigns options for tidy.
|
22
|
+
# It merges options, not deletes old ones.
|
23
|
+
# tidy.options= {:wrap_asp => true}
|
24
|
+
# tidy.options= {:show_body_only => true}
|
25
|
+
# Will send to tidy both options.
|
26
|
+
def options=(options)
|
27
|
+
@options.merge_with_options(options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Proxy for options. Supports set and get
|
31
|
+
#
|
32
|
+
# tidy.options.show_body_only #=> nil
|
33
|
+
# tidy.options.show_body_only = true
|
34
|
+
# tidy.options.show_body_only #=> true
|
35
|
+
def options
|
36
|
+
@options
|
37
|
+
end
|
38
|
+
|
39
|
+
class <<self
|
40
|
+
# Default options for tidy. Works just like options method
|
41
|
+
def default_options
|
42
|
+
@default_options ||= OptionsContainer.new
|
43
|
+
end
|
44
|
+
|
45
|
+
# Default options for tidy. Works just like options= method
|
46
|
+
def default_options=(options)
|
47
|
+
@default_options.merge_with_options(options)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a proxy class with options.
|
51
|
+
# Example:
|
52
|
+
# TidyFFI::Tidy.with_options(:show_body_only => true).with_options(:wrap_asp => true).new('test)
|
53
|
+
def with_options(options)
|
54
|
+
OptionsContainer::Proxy.new(self, @default_options, options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module TidyFFI::TidyFFIExtensions #:nodoc:
|
2
|
+
# Sets path to libtidy.{dylib,so}
|
3
|
+
def library_path=(path)
|
4
|
+
@libtidy_path = path
|
5
|
+
end
|
6
|
+
|
7
|
+
# Returns path to libtidy.{dylib,so}
|
8
|
+
def library_path
|
9
|
+
@libtidy_path ||= find_tidy
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_tidy
|
13
|
+
fnames = ['libtidy.dylib', 'libtidy.so']
|
14
|
+
pathes = []
|
15
|
+
pathes += ENV['LD_LIBRARY_PATH'].split(':') if ENV['LD_LIBRARY_PATH']
|
16
|
+
pathes += ENV['DYLD_LIBRARY_PATH'].split(':') if ENV['DYLD_LIBRARY_PATH']
|
17
|
+
pathes += ENV['PATH'].split(':').reject { |a| a['sbin'] }.map { |a| a.sub('/bin', '/lib') } if ENV['PATH']
|
18
|
+
pathes = ['/usr/lib', '/usr/local/lib'] if pathes.size == 0
|
19
|
+
for path in pathes.uniq
|
20
|
+
fnames.each { |fname| return File.join(path, fname) if File.exists?(File.join(path, fname)) }
|
21
|
+
end
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
private :find_tidy
|
25
|
+
end
|
26
|
+
TidyFFI.extend TidyFFI::TidyFFIExtensions
|
data/lib/tidy_ffi.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ffi'
|
3
|
+
|
4
|
+
module TidyFFI
|
5
|
+
self.autoload :LibTidy, 'tidy_ffi/lib_tidy'
|
6
|
+
self.autoload :Interface, 'tidy_ffi/interface'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'tidy_ffi/options_container'
|
10
|
+
require 'tidy_ffi/tidy'
|
11
|
+
require 'tidy_ffi/tidy_ffi_extensions'
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class TestOptions < Test::Unit::TestCase
|
4
|
+
T = TidyFFI::Tidy
|
5
|
+
context "public interface" do
|
6
|
+
[:default_options, :default_options=, :with_options].each do |method|
|
7
|
+
it "responds to #{method}" do
|
8
|
+
T.respond_to?(method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context "default_options method" do
|
14
|
+
before :each do
|
15
|
+
T.default_options.clear!
|
16
|
+
end
|
17
|
+
|
18
|
+
context "equals version" do
|
19
|
+
it "passes arguments to default_options.merge_with_options" do
|
20
|
+
T.default_options.expects(:merge_with_options)
|
21
|
+
T.default_options = {:test => 1, :test2 => 2}
|
22
|
+
end
|
23
|
+
|
24
|
+
it "merges options with existing" do
|
25
|
+
T.default_options = {:test => 1, :test2 => 2}
|
26
|
+
T.default_options = {:test3 => 3, :test2 => 42}
|
27
|
+
T.default_options.should == {:test => 1, :test2 => 42, :test3 => 3}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "has clear! method to clear anything" do
|
32
|
+
T.default_options.test = 1
|
33
|
+
T.default_options.clear!
|
34
|
+
T.default_options.test.should == nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "saves options" do
|
38
|
+
T.default_options.option = 1
|
39
|
+
T.default_options.option.should == 1
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets optons after creation" do
|
43
|
+
T.new('test').options.option.should == nil
|
44
|
+
T.default_options.option = 1
|
45
|
+
T.new('test').options.option.should == 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "options method" do
|
50
|
+
before :each do
|
51
|
+
T.default_options.clear!
|
52
|
+
@t = T.new('test')
|
53
|
+
end
|
54
|
+
|
55
|
+
context "equal version" do
|
56
|
+
before :each do
|
57
|
+
@t.options.clear!
|
58
|
+
end
|
59
|
+
|
60
|
+
it "passes arguments to options.merge_with_options" do
|
61
|
+
@t.options.expects(:merge_with_options)
|
62
|
+
@t.options = {:test => 1, :test2 => 2}
|
63
|
+
end
|
64
|
+
|
65
|
+
it "merges options with existing" do
|
66
|
+
@t.options = {:test => 1, :test2 => 2}
|
67
|
+
@t.options = {:test3 => 3, :test2 => 42}
|
68
|
+
@t.options.should == {:test => 1, :test2 => 42, :test3 => 3}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "clear! method" do
|
73
|
+
it "clears options' options" do
|
74
|
+
@t.options.test = 1
|
75
|
+
@t.options.clear!
|
76
|
+
@t.options.test.should == nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it "clears default_options's options" do
|
80
|
+
T.default_options.test = 1
|
81
|
+
@t = T.new('test')
|
82
|
+
@t.options.clear!
|
83
|
+
@t.options.test.should == nil
|
84
|
+
end
|
85
|
+
|
86
|
+
it "clears with_options's options" do
|
87
|
+
@t = T.with_options(:test => 1).new('test')
|
88
|
+
@t.options.clear!
|
89
|
+
@t.options.test.should == nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
it "saves options" do
|
94
|
+
@t.options.option = 1
|
95
|
+
@t.options.option.should == 1
|
96
|
+
end
|
97
|
+
|
98
|
+
it "passes options to libtidy" do
|
99
|
+
@t.options.show_body_only = 1
|
100
|
+
@t.clean.should == "test\n"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "with_options proxy class" do
|
105
|
+
it "has options method" do
|
106
|
+
T.with_options(:test => 1).options.test.should == 1
|
107
|
+
end
|
108
|
+
|
109
|
+
it "has clear! method" do
|
110
|
+
T.with_options(:test => 1).clear!.options.test.should == nil
|
111
|
+
end
|
112
|
+
|
113
|
+
it "chain methods" do
|
114
|
+
proxy = T.with_options(:test => 1).with_options(:test2 => 2)
|
115
|
+
proxy.options.test.should == 1
|
116
|
+
proxy.options.test2.should == 2
|
117
|
+
end
|
118
|
+
|
119
|
+
it "passes options to object" do
|
120
|
+
T.with_options(:test => 1).new('test').options.test.should == 1
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/test/test_simple.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class TestSimple < Test::Unit::TestCase
|
4
|
+
T = TidyFFI::Tidy
|
5
|
+
context "TidyFFI::Tidy" do
|
6
|
+
context "public interface" do
|
7
|
+
[[:initialize, -2],
|
8
|
+
[:clean, 0]].each do |method, arity|
|
9
|
+
it "method #{method} has arity #{arity}" do
|
10
|
+
T.instance_method(method).arity.should == arity
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "simple cleanup" do
|
16
|
+
it "clean up text" do
|
17
|
+
T.new("test").clean.should =~ %r{<body>\s+test\s+</body>}
|
18
|
+
T.new("test").clean.should =~ %r{<meta name="generator" content=.+?Tidy.+?>}m
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/tidy_ffi.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tidy_ffi}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Eugene Pimenov"]
|
9
|
+
s.date = %q{2009-02-12}
|
10
|
+
s.description = %q{Tidy library interface via FFI}
|
11
|
+
s.email = %q{libc@me.com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/tidy_ffi/interface.rb", "lib/tidy_ffi/lib_tidy.rb", "lib/tidy_ffi/options_container.rb", "lib/tidy_ffi/tidy.rb", "lib/tidy_ffi/tidy_ffi_extensions.rb", "lib/tidy_ffi.rb"]
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/tidy_ffi/interface.rb", "lib/tidy_ffi/lib_tidy.rb", "lib/tidy_ffi/options_container.rb", "lib/tidy_ffi/tidy.rb", "lib/tidy_ffi/tidy_ffi_extensions.rb", "lib/tidy_ffi.rb", "test/test_helper.rb", "test/test_options.rb", "test/test_simple.rb", "tidy_ffi.gemspec"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/libc/tidy_ffi}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tidy_ffi", "--main", "README"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{tidy_ffi}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Tidy library interface via FFI}
|
21
|
+
s.test_files = ["test/test_helper.rb", "test/test_options.rb", "test/test_simple.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<ffi>, [">= 0", "= 0.2.0"])
|
29
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<matchy>, [">= 0"])
|
31
|
+
s.add_development_dependency(%q<context>, [">= 0"])
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<ffi>, [">= 0", "= 0.2.0"])
|
34
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
35
|
+
s.add_dependency(%q<matchy>, [">= 0"])
|
36
|
+
s.add_dependency(%q<context>, [">= 0"])
|
37
|
+
end
|
38
|
+
else
|
39
|
+
s.add_dependency(%q<ffi>, [">= 0", "= 0.2.0"])
|
40
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
41
|
+
s.add_dependency(%q<matchy>, [">= 0"])
|
42
|
+
s.add_dependency(%q<context>, [">= 0"])
|
43
|
+
end
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: libc-tidy_ffi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eugene Pimenov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-12 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ffi
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
- - "="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.2.0
|
26
|
+
version:
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rr
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
version:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: matchy
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: context
|
47
|
+
version_requirement:
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
53
|
+
version:
|
54
|
+
description: Tidy library interface via FFI
|
55
|
+
email: libc@me.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files:
|
61
|
+
- CHANGELOG
|
62
|
+
- LICENSE
|
63
|
+
- README
|
64
|
+
- lib/tidy_ffi/interface.rb
|
65
|
+
- lib/tidy_ffi/lib_tidy.rb
|
66
|
+
- lib/tidy_ffi/options_container.rb
|
67
|
+
- lib/tidy_ffi/tidy.rb
|
68
|
+
- lib/tidy_ffi/tidy_ffi_extensions.rb
|
69
|
+
- lib/tidy_ffi.rb
|
70
|
+
files:
|
71
|
+
- CHANGELOG
|
72
|
+
- LICENSE
|
73
|
+
- Manifest
|
74
|
+
- README
|
75
|
+
- Rakefile
|
76
|
+
- lib/tidy_ffi/interface.rb
|
77
|
+
- lib/tidy_ffi/lib_tidy.rb
|
78
|
+
- lib/tidy_ffi/options_container.rb
|
79
|
+
- lib/tidy_ffi/tidy.rb
|
80
|
+
- lib/tidy_ffi/tidy_ffi_extensions.rb
|
81
|
+
- lib/tidy_ffi.rb
|
82
|
+
- test/test_helper.rb
|
83
|
+
- test/test_options.rb
|
84
|
+
- test/test_simple.rb
|
85
|
+
- tidy_ffi.gemspec
|
86
|
+
has_rdoc: true
|
87
|
+
homepage: http://github.com/libc/tidy_ffi
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options:
|
90
|
+
- --line-numbers
|
91
|
+
- --inline-source
|
92
|
+
- --title
|
93
|
+
- Tidy_ffi
|
94
|
+
- --main
|
95
|
+
- README
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: "0"
|
103
|
+
version:
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: "1.2"
|
109
|
+
version:
|
110
|
+
requirements: []
|
111
|
+
|
112
|
+
rubyforge_project: tidy_ffi
|
113
|
+
rubygems_version: 1.2.0
|
114
|
+
signing_key:
|
115
|
+
specification_version: 2
|
116
|
+
summary: Tidy library interface via FFI
|
117
|
+
test_files:
|
118
|
+
- test/test_helper.rb
|
119
|
+
- test/test_options.rb
|
120
|
+
- test/test_simple.rb
|