google_text 0.0.2 → 0.0.3
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/.gitignore +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/HISTORY.md +4 -0
- data/README.md +6 -1
- data/Rakefile +3 -20
- data/google_text.gemspec +32 -0
- data/lib/google_text/client.rb +3 -3
- data/lib/google_text/configuration.rb +1 -1
- data/lib/google_text/parsers/base.rb +55 -0
- data/lib/google_text/parsers/dashboard.rb +16 -0
- data/lib/google_text/parsers/inbox.rb +75 -0
- data/lib/google_text/parsers/login.rb +20 -0
- data/lib/google_text/version.rb +1 -1
- data/lib/google_text.rb +9 -2
- data/spec/data/dashboard_url.html +494 -0
- data/spec/data/login_url.html +906 -0
- data/spec/data/recent_messages.html +588 -0
- data/spec/google-text/client_spec.rb +6 -9
- data/spec/google-text/parsers/dashboard_spec.rb +14 -0
- data/spec/google-text/parsers/inbox_spec.rb +14 -0
- data/spec/google-text/parsers/login_spec.rb +14 -0
- data/spec/spec_helper.rb +14 -2
- metadata +100 -88
- data/VERSION +0 -1
- data/lib/google_text/parser.rb +0 -107
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rspec'
|
4
|
+
require 'fakeweb'
|
5
|
+
|
1
6
|
require File.expand_path(File.dirname(__FILE__) + "/../lib/google_text")
|
2
7
|
|
3
|
-
|
4
|
-
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color_enabled = true
|
10
|
+
config.formatter = 'documentation'
|
11
|
+
config.mock_with :rspec
|
12
|
+
|
13
|
+
config.before(:each) do
|
14
|
+
FakeWeb.allow_net_connect = false
|
15
|
+
end
|
16
|
+
|
5
17
|
end
|
metadata
CHANGED
@@ -1,130 +1,142 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_text
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Sebastian Friedrich
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
- 7
|
30
|
-
- 6
|
31
|
-
version: 0.7.6
|
12
|
+
date: 2011-09-23 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: json
|
16
|
+
requirement: &70186820751120 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: nokogiri
|
36
23
|
prerelease: false
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
24
|
+
version_requirements: *70186820751120
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: nokogiri
|
27
|
+
requirement: &70186820747380 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
44
33
|
type: :runtime
|
45
|
-
version_requirements: *id002
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: json
|
48
34
|
prerelease: false
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
35
|
+
version_requirements: *70186820747380
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: curb
|
38
|
+
requirement: &70186820746460 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.7.6
|
56
44
|
type: :runtime
|
57
|
-
|
58
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70186820746460
|
47
|
+
- !ruby/object:Gem::Dependency
|
59
48
|
name: rspec
|
49
|
+
requirement: &70186820745880 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
60
56
|
prerelease: false
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
57
|
+
version_requirements: *70186820745880
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: fakeweb
|
60
|
+
requirement: &70186820745300 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
68
66
|
type: :development
|
69
|
-
|
70
|
-
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70186820745300
|
69
|
+
description: GoogleText is a SMS client library for sending and receiving free SMS
|
70
|
+
through Google Voice. Alas, Google Voice does not yet have an API, so GoogleText
|
71
|
+
uses Curl and Nokogiri to scrape and post using Google Voice web URLs.
|
71
72
|
email: sebastian@feldpost.com
|
72
73
|
executables: []
|
73
|
-
|
74
74
|
extensions: []
|
75
|
-
|
76
75
|
extra_rdoc_files: []
|
77
|
-
|
78
|
-
|
79
|
-
- README.md
|
80
|
-
- Rakefile
|
81
|
-
- LICENSE
|
76
|
+
files:
|
77
|
+
- .gitignore
|
82
78
|
- CONTRIBUTORS
|
79
|
+
- Gemfile
|
80
|
+
- Gemfile.lock
|
83
81
|
- HISTORY.md
|
84
|
-
-
|
82
|
+
- LICENSE
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- google_text.gemspec
|
86
|
+
- lib/google_text.rb
|
85
87
|
- lib/google_text/account.rb
|
86
88
|
- lib/google_text/client.rb
|
87
89
|
- lib/google_text/configuration.rb
|
88
90
|
- lib/google_text/message.rb
|
89
|
-
- lib/google_text/
|
91
|
+
- lib/google_text/parsers/base.rb
|
92
|
+
- lib/google_text/parsers/dashboard.rb
|
93
|
+
- lib/google_text/parsers/inbox.rb
|
94
|
+
- lib/google_text/parsers/login.rb
|
90
95
|
- lib/google_text/session.rb
|
91
96
|
- lib/google_text/version.rb
|
92
|
-
-
|
97
|
+
- spec/data/dashboard_url.html
|
98
|
+
- spec/data/login_url.html
|
99
|
+
- spec/data/recent_messages.html
|
93
100
|
- spec/google-text/client_spec.rb
|
94
101
|
- spec/google-text/configuration_spec.rb
|
95
102
|
- spec/google-text/message_spec.rb
|
103
|
+
- spec/google-text/parsers/dashboard_spec.rb
|
104
|
+
- spec/google-text/parsers/inbox_spec.rb
|
105
|
+
- spec/google-text/parsers/login_spec.rb
|
96
106
|
- spec/spec_helper.rb
|
97
|
-
has_rdoc: true
|
98
107
|
homepage: http://github.com/feldpost/google_text
|
99
108
|
licenses: []
|
100
|
-
|
101
109
|
post_install_message:
|
102
110
|
rdoc_options: []
|
103
|
-
|
104
|
-
require_paths:
|
111
|
+
require_paths:
|
105
112
|
- lib
|
106
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
requirements:
|
115
|
-
- -
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
-
- 0
|
119
|
-
version: "0"
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
120
125
|
requirements: []
|
121
|
-
|
122
126
|
rubyforge_project: google_text
|
123
|
-
rubygems_version: 1.
|
127
|
+
rubygems_version: 1.8.10
|
124
128
|
signing_key:
|
125
129
|
specification_version: 3
|
126
|
-
summary: GoogleText is a SMS client library for sending and receiving free SMS through
|
127
|
-
|
130
|
+
summary: GoogleText is a SMS client library for sending and receiving free SMS through
|
131
|
+
Google Voice.
|
132
|
+
test_files:
|
133
|
+
- spec/data/dashboard_url.html
|
134
|
+
- spec/data/login_url.html
|
135
|
+
- spec/data/recent_messages.html
|
128
136
|
- spec/google-text/client_spec.rb
|
129
137
|
- spec/google-text/configuration_spec.rb
|
130
138
|
- spec/google-text/message_spec.rb
|
139
|
+
- spec/google-text/parsers/dashboard_spec.rb
|
140
|
+
- spec/google-text/parsers/inbox_spec.rb
|
141
|
+
- spec/google-text/parsers/login_spec.rb
|
142
|
+
- spec/spec_helper.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.2
|
data/lib/google_text/parser.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
module GoogleText
|
2
|
-
class Parser
|
3
|
-
attr_accessor :messages
|
4
|
-
|
5
|
-
CSS_SELECTORS = {
|
6
|
-
:session_id => 'form#gc-search-form',
|
7
|
-
:xsrf_token => 'div.loginBox table#gaia_table input',
|
8
|
-
:message_row => 'div.gc-message-sms-row',
|
9
|
-
:message_from => 'span.gc-message-sms-from',
|
10
|
-
:message_time => 'span.gc-message-sms-time',
|
11
|
-
:message_text => 'span.gc-message-sms-text'
|
12
|
-
}
|
13
|
-
|
14
|
-
def session_id_from(string)
|
15
|
-
section = html_for parse_document(string), CSS_SELECTORS[:session_id]
|
16
|
-
section.match(/value="(.+)"/)[1]
|
17
|
-
end
|
18
|
-
|
19
|
-
def xsrf_token_from(string)
|
20
|
-
token = nil
|
21
|
-
html_for parse_fragment(string), CSS_SELECTORS[:xsrf_token] do |input|
|
22
|
-
if input.to_s =~ /GALX/
|
23
|
-
token = input.to_s.scan(/value\="(.+?)"/).flatten.pop
|
24
|
-
end
|
25
|
-
end
|
26
|
-
return token
|
27
|
-
end
|
28
|
-
|
29
|
-
def messages_from(string)
|
30
|
-
@messages = []
|
31
|
-
document = Nokogiri::XML.parse string
|
32
|
-
html_fragment = parse_fragment document.to_html
|
33
|
-
string = document.css('json').first.to_s.scan(/CDATA\[(.+)\]\]/).flatten
|
34
|
-
inbox = JSON.parse(string.first)
|
35
|
-
parse_messages(inbox['messages'], html_fragment)
|
36
|
-
return @messages
|
37
|
-
end
|
38
|
-
|
39
|
-
protected
|
40
|
-
|
41
|
-
def html_for(string,selector)
|
42
|
-
selected = string.css(selector)
|
43
|
-
if block_given?
|
44
|
-
selected.each do |item|
|
45
|
-
yield(item)
|
46
|
-
end
|
47
|
-
else
|
48
|
-
selected.inner_html
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def parse_document(string)
|
53
|
-
Nokogiri::HTML::Document.parse(string)
|
54
|
-
end
|
55
|
-
|
56
|
-
def parse_fragment(string)
|
57
|
-
Nokogiri::HTML::DocumentFragment.parse(string)
|
58
|
-
end
|
59
|
-
|
60
|
-
def parse_messages(json_messages, page_fragment)
|
61
|
-
build_messages(json_messages)
|
62
|
-
read_message_details(page_fragment)
|
63
|
-
return @messages
|
64
|
-
end
|
65
|
-
|
66
|
-
def build_messages(json_messages)
|
67
|
-
json_messages.each do |json_message|
|
68
|
-
if json_message[1]['type'].to_i == 2
|
69
|
-
next
|
70
|
-
else
|
71
|
-
@messages << parse_message(json_message)
|
72
|
-
end
|
73
|
-
@messages.sort_by {|message| message.start_time}
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def read_message_details(page_fragment)
|
78
|
-
@messages.each do |message|
|
79
|
-
html_for page_fragment, CSS_SELECTORS[:message_row] do |row|
|
80
|
-
if html_for(row,CSS_SELECTORS[:message_from]).strip! =~ /Me:/
|
81
|
-
next
|
82
|
-
elsif html_for(row, CSS_SELECTORS[:message_time]) =~ Regexp.new(message.display_start_time)
|
83
|
-
message.to = 'Me'
|
84
|
-
message.from = html_for(row, CSS_SELECTORS[:message_from]).strip!.gsub!(':', '')
|
85
|
-
message.text = html_for row, CSS_SELECTORS[:message_text]
|
86
|
-
else
|
87
|
-
next
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def parse_message(json_array)
|
94
|
-
message = Message.new
|
95
|
-
message.id = json_array[0]
|
96
|
-
message.start_time = json_array[1]['startTime'].to_i
|
97
|
-
message.read_status = json_array[1]['isRead']
|
98
|
-
message.display_start_time = json_array[1]['displayStartTime']
|
99
|
-
message.relative_start_time = json_array[1]['relativeStartTime']
|
100
|
-
message.display_number = json_array[1]['displayNumber']
|
101
|
-
message.display_start_date_time = json_array[1]['displayStartDateTime']
|
102
|
-
message.labels = json_array[1]['labels']
|
103
|
-
return message
|
104
|
-
end
|
105
|
-
|
106
|
-
end
|
107
|
-
end
|