pivotal-elementor 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ module Kernel
2
+ def blank_context(ivars={}, &block)
3
+ klass = Class.new do
4
+ instance_methods.each { |m| undef_method(m) unless m =~ /^(__|instance_|meta)/ }
5
+ end
6
+
7
+ klass.class_eval(&block)
8
+ instance = klass.new
9
+ ivars.each { |key, value| instance.instance_variable_set("@#{key}", value) }
10
+ instance
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ class Object
2
+ def try(sym, *args, &block)
3
+ respond_to?(sym) ? send(sym, *args, &block) : nil
4
+ end
5
+
6
+ def metaclass
7
+ class << self; self end
8
+ end
9
+
10
+ def meta_eval(&block)
11
+ metaclass.instance_eval(&block)
12
+ end
13
+
14
+ def meta_def(sym, &block)
15
+ meta_eval do
16
+ define_method(sym, &block)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ class Symbol
2
+ def to_proc
3
+ Proc.new do |target|
4
+ target.send(self)
5
+ end
6
+ end
7
+ end unless :test.respond_to?(:to_proc)
data/lib/elementor.rb ADDED
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH << File.dirname(__FILE__) + '/core_ext'
2
+ $LOAD_PATH << File.dirname(__FILE__) + '/elementor'
3
+
4
+ require 'rubygems'
5
+ require 'nokogiri'
6
+ require 'kernel'
7
+ require 'object'
8
+ require 'symbol'
9
+ require 'result'
10
+ require 'element_set'
11
+
12
+ module Elementor
13
+ def elements(opts={}, &block)
14
+ namer = Result.new(self, opts, &block)
15
+ namer.define_elements!
16
+ namer.dispatcher
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module Elementor
2
+ class ElementSet < Array
3
+ def with_text(str)
4
+ select { |item| item.text.include?(str) }
5
+ end
6
+
7
+ def inspect
8
+ map(&:text).inspect
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,46 @@
1
+ module Elementor
2
+ class Result
3
+ attr_reader :context, :opts
4
+
5
+ def initialize(context, opts={}, &block)
6
+ @opts = opts
7
+ @context = context
8
+ block.call(naming_context)
9
+ end
10
+
11
+ def naming_context
12
+ @naming_context ||= blank_context(:this => self) do
13
+ def method_missing(sym, *args)
14
+ @this.element_names[sym] = *args
15
+ end
16
+ end
17
+ end
18
+
19
+ def dispatcher
20
+ @dispatcher ||= blank_context(:this => self, :doc => doc) do
21
+ def method_missing(sym, *args, &block)
22
+ @this.try(sym, *args, &block) || @doc.try(sym, *args, &block) || super
23
+ end
24
+ end
25
+ end
26
+
27
+ def define_elements!
28
+ element_names.each do |name, selector|
29
+ meta_def(name) do |*mutators|
30
+ set = ElementSet.new(doc.search(selector).to_ary)
31
+ mutators.empty? ? set : mutators.inject(set) { |result, fn| fn[result] }
32
+ end
33
+ end
34
+ end
35
+
36
+ def element_names
37
+ @element_names ||= { }
38
+ end
39
+
40
+ private
41
+
42
+ def doc
43
+ @doc ||= Nokogiri(context.send(opts[:from] || :body)) rescue nil
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,11 @@
1
+ module Spec
2
+ module Matchers
3
+ class Have
4
+ def with_text(*args)
5
+ @args = []
6
+ @args << proc { |set| set.with_text(*args) }
7
+ self
8
+ end
9
+ end
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pivotal-elementor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Pat Nakajima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-19 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ description:
25
+ email: patnakajima@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - lib/elementor
34
+ - lib/elementor.rb
35
+ - lib/elementor/spec.rb
36
+ - lib/elementor/element_set.rb
37
+ - lib/elementor/result.rb
38
+ - lib/core_ext
39
+ - lib/core_ext/object.rb
40
+ - lib/core_ext/kernel.rb
41
+ - lib/core_ext/symbol.rb
42
+ has_rdoc: false
43
+ homepage: http://github.com/pivotal/elementor
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.2.0
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: Prettier element traversal with Nokogiri
68
+ test_files: []
69
+