pivotal-elementor 0.0.2

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.
@@ -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
+