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 ADDED
@@ -0,0 +1,2 @@
1
+ v0.0.1. Options support.
2
+ v0.0.0. Initial release.
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'
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+
3
+ require 'tidy_ffi'
4
+
5
+ require 'rubygems'
6
+ require 'rr'
7
+ require 'matchy'
8
+ require 'context'
9
+
10
+ class Test::Unit::TestCase
11
+ alias method_name name unless instance_methods.include?('method_name')
12
+ end
@@ -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
@@ -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