phantom_menace 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.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'phantomjs'
4
+
5
+ p "=> Server running at 8080"
6
+ file = File.expand_path(File.dirname(__FILE__)) + '/phantom_menace.coffee'
7
+ Phantomjs.run file
@@ -0,0 +1,148 @@
1
+ USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) ' +
2
+ 'AppleWebKit/A.B (KHTML, like Gecko) Chrome/X.Y.Z.W Safari/A.B.'
3
+
4
+ class Page
5
+ constructor: ->
6
+ @_loaded = false
7
+ @_page = require('webpage').create()
8
+
9
+ open: (url) ->
10
+ @_page.open url
11
+
12
+ isLoaded: ->
13
+ @_loaded
14
+
15
+ class Browser
16
+ constructor: ->
17
+ # This is the response container
18
+ # Always clean this up.
19
+ @command = ''
20
+ @resp = null
21
+
22
+ @history = []
23
+ @state = 'default'
24
+ this._initPage()
25
+
26
+ click: (left, top) ->
27
+ @page.sendEvent left, top
28
+
29
+ find: (selector) ->
30
+ console.log 'Finding it'
31
+
32
+ ret = @page.evaluate ->
33
+ elements = []
34
+ jQuery('a').each (i, obj) ->
35
+ attrs = {}
36
+ attrs[attr.name] = attr.value for attr in obj.attributes
37
+
38
+ elements.push
39
+ attrs: attrs
40
+ text: jQuery(obj).text()
41
+ pos: jQuery(obj).offset()
42
+ elements
43
+
44
+ @resp =
45
+ success: true
46
+ ret: ret
47
+
48
+ @state = 'default'
49
+
50
+
51
+ findAll: ->
52
+ console.log 'Finding all'
53
+
54
+ goforward: ->
55
+ console.log 'Going forward a page'
56
+
57
+ goto: (url) ->
58
+ @page.open decodeURIComponent(url)
59
+
60
+ goback: ->
61
+ this.goto @history.pop
62
+
63
+ getResp: ->
64
+ @resp
65
+
66
+ reload: ->
67
+ this.goto @history[@history.length - 1]
68
+
69
+ render: ->
70
+ @page.render()
71
+
72
+ content: ->
73
+ @page.content
74
+
75
+ reset: ->
76
+ @page.release()
77
+ this._initPage()
78
+
79
+ runCommand: (command, args...) ->
80
+ @state = 'loading'
81
+ @command = command
82
+ this[command].apply(this, args)
83
+
84
+ _initPage: ->
85
+ @page = require('webpage').create()
86
+ @page.settings.userAgent = USER_AGENT
87
+ @page.onLoadStarted = this._onLoadStarted
88
+ @page.onLoadFinished = this._onLoadFinished
89
+ @page.onConsoleMessage = this._onConsoleMessage
90
+
91
+ _onLoadStarted: =>
92
+ console.log 'Started loading'
93
+ @state = 'loading'
94
+
95
+ _onLoadFinished: (status) =>
96
+ console.log 'Finished loading'
97
+ @page.injectJs 'jquery.js'
98
+
99
+ @page.evaluate ->
100
+ console.log JSON.stringify($('a').eq(0).offset())
101
+
102
+ if @command is 'goto'
103
+ @resp =
104
+ success: true
105
+ command: "goto"
106
+
107
+ @state = 'default'
108
+
109
+ _onConsoleMessage: (msg) =>
110
+ console.log 'MSG: ' + msg
111
+
112
+ class Server
113
+ constructor: ->
114
+ @browser = new Browser()
115
+ @server = require('webserver').create()
116
+
117
+ run: ->
118
+ @server.listen 8080, this._handleRequest
119
+
120
+ _handleRequest: (req, res) =>
121
+ params = req.post
122
+
123
+ if @browser[params.command]
124
+ @browser.runCommand(params.command, params.data)
125
+ this._runLoop(req, res)
126
+ else
127
+ res.statusCode = 200
128
+ res.write JSON.stringify({
129
+ success: false
130
+ message: "Command not found"
131
+ })
132
+ res.close()
133
+
134
+ _runLoop: (req, res) =>
135
+ setTimeout =>
136
+ console.log 'THE STATE: ' + @browser.state
137
+
138
+ if @browser.state is 'loading'
139
+ this._runLoop(req, res)
140
+ else if @browser.state is 'default'
141
+ res.statusCode = 200
142
+ res.write JSON.stringify(@browser.getResp())
143
+ res.close()
144
+ , 1000
145
+
146
+ server = new Server()
147
+ server.run()
148
+ console.log '=> Server running at 8080'
@@ -0,0 +1,8 @@
1
+ require "phantom_menace"
2
+
3
+ browser = PhantomMenace::Browser.new
4
+ browser.goto("http://bigbadgoose.com")
5
+ links = browser.find_all_links
6
+ links.map do |link|
7
+ p link.attributes["href"]
8
+ end
@@ -0,0 +1,7 @@
1
+ require "phantom_menace/version"
2
+ require "phantom_menace/element"
3
+ require "phantom_menace/browser"
4
+
5
+ module PhantomMenace
6
+ URL = "http://localhost:8080/"
7
+ end
@@ -0,0 +1,31 @@
1
+ require "net/http"
2
+ require "uri"
3
+ require "json"
4
+
5
+ module PhantomMenace
6
+ class Browser
7
+ def goto(url)
8
+ options = {
9
+ command: "goto",
10
+ data: url
11
+ }
12
+ post(options)
13
+ end
14
+
15
+ def find_all_links
16
+ options = {
17
+ command: "find"
18
+ }
19
+ post(options)["ret"].map do |node|
20
+ PhantomMenace::Element.new(node)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def post(options)
27
+ req = Net::HTTP.post_form(URI.parse(URL), options)
28
+ JSON.parse(req.body)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module PhantomMenace
2
+ class Element
3
+ attr_reader :attributes
4
+ attr_reader :position
5
+ attr_reader :text
6
+
7
+ def initialize(options)
8
+ @attributes = options["attrs"]
9
+ @position = options["position"]
10
+ @text = options["text"]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module PhantomMenace
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/phantom_menace/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["William Estoque"]
6
+ gem.email = ["william.estoque@gmail.com"]
7
+ gem.description = %q{Ruby Wrapper for Phantomjs with a Browser API}
8
+ gem.summary = %q{Phantomjs based browser with a ruby wrapper}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "phantom_menace"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = PhantomMenace::VERSION
17
+
18
+ gem.add_development_dependency "rspec"
19
+ gem.add_development_dependency "rake"
20
+ gem.add_development_dependency "phantomjs.rb"
21
+ end
@@ -0,0 +1,22 @@
1
+ require 'phantom_menace'
2
+
3
+ describe PhantomMenace::Browser do
4
+ before do
5
+ @browser = PhantomMenace::Browser.new
6
+ end
7
+
8
+ describe "#goto" do
9
+ it "responds with success if page opens successfully" do
10
+ resp = @browser.goto "http://google.com"
11
+ resp["success"].should == true
12
+ end
13
+ end
14
+
15
+ describe "#find_all_links" do
16
+ it "responds with the links in the page" do
17
+ @browser.goto "http://google.com"
18
+ resp = @browser.find_all_links
19
+ resp.length.should_not be(0)
20
+ end
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: phantom_menace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - William Estoque
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: phantomjs.rb
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Ruby Wrapper for Phantomjs with a Browser API
63
+ email:
64
+ - william.estoque@gmail.com
65
+ executables:
66
+ - jquery.js
67
+ - phantom_menace
68
+ - phantom_menace.coffee
69
+ extensions: []
70
+ extra_rdoc_files: []
71
+ files:
72
+ - .gitignore
73
+ - Gemfile
74
+ - LICENSE
75
+ - README.md
76
+ - Rakefile
77
+ - bin/jquery.js
78
+ - bin/phantom_menace
79
+ - bin/phantom_menace.coffee
80
+ - examples/simple.rb
81
+ - lib/phantom_menace.rb
82
+ - lib/phantom_menace/browser.rb
83
+ - lib/phantom_menace/element.rb
84
+ - lib/phantom_menace/version.rb
85
+ - phantom_menace.gemspec
86
+ - spec/browser_spec.rb
87
+ homepage: ''
88
+ licenses: []
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: -1323133816147866598
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: -1323133816147866598
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 1.8.24
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: Phantomjs based browser with a ruby wrapper
117
+ test_files:
118
+ - spec/browser_spec.rb