tidy_ffi 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/LICENSE +21 -0
- data/Manifest +15 -0
- data/README +23 -0
- data/Rakefile +18 -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 +35 -0
- metadata +94 -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,18 @@
|
|
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
|
+
p.project = 'tidy-ffi'
|
11
|
+
end
|
12
|
+
rescue LoadError => boom
|
13
|
+
puts "You are missing a dependency required for meta-operations on this gem."
|
14
|
+
puts "#{boom.to_s.capitalize}."
|
15
|
+
|
16
|
+
desc 'No effect.'
|
17
|
+
task :default do; end
|
18
|
+
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,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{tidy_ffi}
|
5
|
+
s.version = "0.0.2"
|
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-15}
|
10
|
+
s.description = %q{Tidy library interface via FFI}
|
11
|
+
s.email = %q{}
|
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
|
+
else
|
30
|
+
s.add_dependency(%q<ffi>, [">= 0", "= 0.2.0"])
|
31
|
+
end
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<ffi>, [">= 0", "= 0.2.0"])
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tidy_ffi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eugene Pimenov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-15 00:00:00 +03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ffi
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
- - "="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.2.0
|
27
|
+
version:
|
28
|
+
description: Tidy library interface via FFI
|
29
|
+
email: ""
|
30
|
+
executables: []
|
31
|
+
|
32
|
+
extensions: []
|
33
|
+
|
34
|
+
extra_rdoc_files:
|
35
|
+
- CHANGELOG
|
36
|
+
- LICENSE
|
37
|
+
- README
|
38
|
+
- lib/tidy_ffi/interface.rb
|
39
|
+
- lib/tidy_ffi/lib_tidy.rb
|
40
|
+
- lib/tidy_ffi/options_container.rb
|
41
|
+
- lib/tidy_ffi/tidy.rb
|
42
|
+
- lib/tidy_ffi/tidy_ffi_extensions.rb
|
43
|
+
- lib/tidy_ffi.rb
|
44
|
+
files:
|
45
|
+
- CHANGELOG
|
46
|
+
- LICENSE
|
47
|
+
- Manifest
|
48
|
+
- README
|
49
|
+
- Rakefile
|
50
|
+
- lib/tidy_ffi/interface.rb
|
51
|
+
- lib/tidy_ffi/lib_tidy.rb
|
52
|
+
- lib/tidy_ffi/options_container.rb
|
53
|
+
- lib/tidy_ffi/tidy.rb
|
54
|
+
- lib/tidy_ffi/tidy_ffi_extensions.rb
|
55
|
+
- lib/tidy_ffi.rb
|
56
|
+
- test/test_helper.rb
|
57
|
+
- test/test_options.rb
|
58
|
+
- test/test_simple.rb
|
59
|
+
- tidy_ffi.gemspec
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/libc/tidy_ffi
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options:
|
64
|
+
- --line-numbers
|
65
|
+
- --inline-source
|
66
|
+
- --title
|
67
|
+
- Tidy_ffi
|
68
|
+
- --main
|
69
|
+
- README
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
version:
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "1.2"
|
83
|
+
version:
|
84
|
+
requirements: []
|
85
|
+
|
86
|
+
rubyforge_project: tidy-ffi
|
87
|
+
rubygems_version: 1.3.1
|
88
|
+
signing_key:
|
89
|
+
specification_version: 2
|
90
|
+
summary: Tidy library interface via FFI
|
91
|
+
test_files:
|
92
|
+
- test/test_helper.rb
|
93
|
+
- test/test_options.rb
|
94
|
+
- test/test_simple.rb
|