opengraph_transporter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,136 @@
1
+ module OpengraphTransporter
2
+ class Scraper
3
+
4
+ MAX_FB_LOGIN_ATTEMPTS = 3
5
+ MAX_TRANSLATION_PAGE_LIMIT = 30
6
+
7
+ class << self
8
+
9
+ def ingest_app_translations(app_id, locale)
10
+ @agent = Mechanize.new
11
+ # Defaulting to en_US native locale
12
+ source_app_uri = "https://www.facebook.com/translations/admin/browse.php?search&sloc=en_US&aloc=#{locale}&app=#{app_id}"
13
+ @agent.get(source_app_uri)
14
+ login_attempt = 1
15
+ login(login_attempt) do |continue|
16
+ if continue
17
+ puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> login current_url >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
18
+ puts @agent.page.uri.to_s
19
+ puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
20
+ translations_page_index = 0
21
+ translations_arr = Array.new
22
+ GracefulQuit.enable
23
+ recurse_translations(translations_page_index, translations_arr) do |complete_translation_arr, idx|
24
+ logout
25
+ return complete_translation_arr
26
+ end
27
+ else
28
+ return []
29
+ end
30
+ end
31
+ end
32
+
33
+ def update_display_names!(translations_arr, src_display_name, dst_display_name)
34
+ say(".....swapping app translation tokens")
35
+ translation_src_name = "{" << src_display_name << "}"
36
+ translation_dst_name = "{" << dst_display_name << "}"
37
+ translations_arr.each_with_index do |el, index|
38
+
39
+ if el['native'] =~ /(#{Regexp.escape(translation_src_name)})/i
40
+ app_name = "#{$1}".strip
41
+ unless app_name.eql?("application")
42
+ el['native'].gsub!(/(#{Regexp.escape(translation_src_name)})/i , "#{translation_dst_name}")
43
+ el['translation'].gsub!(/(#{Regexp.escape(translation_src_name)})/i, "#{translation_dst_name}")
44
+ end
45
+ end
46
+ end
47
+
48
+ return translations_arr
49
+ end
50
+
51
+ private
52
+
53
+ def recurse_translations(translations_page_index, translations_arr, &block)
54
+ GracefulQuit.check do
55
+ logout
56
+ end
57
+ next_button = @agent.page.link_with(:text => "Next")
58
+ say(".....processing translations page: " << (translations_page_index + 1).to_s)
59
+ bundle_translations(translations_arr, translations_page_index)
60
+ translations_page_index += 1
61
+
62
+ if next_button.nil? || translations_page_index > MAX_TRANSLATION_PAGE_LIMIT
63
+ say(".....completed application translations ingest.")
64
+ block.call(translations_arr, translations_page_index) if block_given?
65
+ else
66
+ next_button.click
67
+ recurse_translations(translations_page_index, translations_arr, &block) if block_given?
68
+ end
69
+ end
70
+
71
+ def bundle_translations(translations_arr, translations_page_index)
72
+ form = @agent.page
73
+ form.search('*').select{|e| e[:class] =~ /all_variations/}.each_with_index { |item, index|
74
+ native = item.search('*').select{|f| f[:class] =~ /native/}.first.text
75
+ translation = item.search('*').select{|f| f[:class] =~ /s_trans/}.first.text
76
+ say("#{native} : #{translation}")
77
+
78
+ unless native.empty?
79
+ native_hash = item.attributes['id'].text.sub("variants:","")
80
+ translations_arr.push({:native_hash => native_hash, :native => native, :translation => translation})
81
+ end
82
+ }
83
+ end
84
+
85
+ def login(login_attempt, &block)
86
+
87
+ if login_attempt <= MAX_FB_LOGIN_ATTEMPTS
88
+ get_user_credentials
89
+ say("\n.....logging in to Facebook")
90
+ form = @agent.page.forms.first
91
+ form.email = Base.user[:fb_username]
92
+ form.pass = Base.user[:fb_password]
93
+ @agent.submit(form, form.buttons.first)
94
+
95
+ if @agent.page.uri.to_s =~ /login_attempt/
96
+ # FB Login error
97
+ choose do |menu|
98
+ menu.prompt = "Facebook Login failed..... attempt #{login_attempt}. Would you like to try again? "
99
+ menu.choice(:Yes) {
100
+ login_attempt += 1
101
+ login(login_attempt, &block) if block_given?
102
+ }
103
+ menu.choices(:No) {
104
+ say("...exiting Exporter!")
105
+ block.call(false) if block_given?
106
+ }
107
+ end
108
+ else
109
+ block.call(true) if block_given?
110
+ end
111
+ else
112
+ block.call(false) if block_given?
113
+ end
114
+ end
115
+
116
+ def logout
117
+ say(".....logging out of Facebook \n")
118
+ puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> logout current_url >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
119
+ puts @agent.page.uri.to_s
120
+ puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
121
+ form = @agent.page.form_with(:id => 'logout_form')
122
+ @agent.submit(form, form.buttons.first)
123
+ end
124
+
125
+ def get_user_credentials
126
+ Base.user[:fb_username] = ask("Facebook Username: ", lambda { |u| u.to_s.strip } ) do |q|
127
+ q.validate = lambda { |p| (p =~ /^.+@.+$/) != nil }
128
+ q.responses[:not_valid] = "Please enter a valid email address."
129
+ end
130
+ Base.user[:fb_password] = ask("Password: ") { |q| q.echo = "*" }
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+ end
@@ -0,0 +1,3 @@
1
+ module OpengraphTransporter
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'addressable/uri'
4
+ require 'httpclient'
5
+ require 'highline/import'
6
+ require 'json'
7
+ require 'watir'
8
+ require 'watir-webdriver'
9
+ require 'nokogiri'
10
+ require 'mechanize'
11
+ require 'console_splash'
12
+
13
+ module OpengraphTransporter
14
+ class Error < Exception; end
15
+ end
16
+
17
+ require 'opengraph_transporter/version'
18
+ require 'opengraph_transporter/base'
19
+ require 'opengraph_transporter/browser'
20
+ require 'opengraph_transporter/common'
21
+ require 'opengraph_transporter/scraper'
22
+ require 'opengraph_transporter/gracefulquit'
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'opengraph_transporter/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'opengraph_transporter'
8
+ gem.version = OpengraphTransporter::VERSION
9
+ gem.authors = ['Barry Quigley']
10
+ gem.email = ['barryquigley@yahoo.com']
11
+ gem.description = %q{Open Graph Translations Exporter.}
12
+ gem.summary = %q{Transporter provides a quick way of exporting Facebook Open Graph Translations between applications.}
13
+ gem.homepage = ''
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = ['opengraph_transporter']
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ['lib']
19
+
20
+
21
+ gem.add_dependency 'watir', ['~> 4.0.2']
22
+ gem.add_dependency 'watir-webdriver', ['~> 0.6.4']
23
+ gem.add_dependency 'nokogiri', ['~> 1.6.0']
24
+ gem.add_dependency 'mechanize', ['~> 2.7.1']
25
+ gem.add_dependency 'httpclient', ['~> 2.3.3']
26
+ gem.add_dependency 'json', ['~> 1.8.0']
27
+ gem.add_dependency 'addressable', ['~> 2.2.6']
28
+ gem.add_dependency 'httpclient', ['~> 2.3.3']
29
+ gem.add_dependency 'highline', ['~> 1.6.13']
30
+ gem.add_dependency 'console_splash', ['~> 2.0.1']
31
+ end
data/test/.DS_Store ADDED
Binary file
Binary file
@@ -0,0 +1,8 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe OpengraphTransporter do
4
+ it "must be defined" do
5
+ OpengraphTransporter::VERSION.wont_be_nil
6
+ end
7
+
8
+ end
@@ -0,0 +1,3 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/pride'
3
+ require File.expand_path('../../lib/opengraph_transporter.rb', __FILE__)
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opengraph_transporter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Barry Quigley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: watir
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: watir-webdriver
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.6.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: mechanize
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.7.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 2.7.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: httpclient
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 2.3.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 2.3.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.8.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.8.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: addressable
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 2.2.6
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 2.2.6
111
+ - !ruby/object:Gem::Dependency
112
+ name: httpclient
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 2.3.3
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 2.3.3
125
+ - !ruby/object:Gem::Dependency
126
+ name: highline
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 1.6.13
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 1.6.13
139
+ - !ruby/object:Gem::Dependency
140
+ name: console_splash
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 2.0.1
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 2.0.1
153
+ description: Open Graph Translations Exporter.
154
+ email:
155
+ - barryquigley@yahoo.com
156
+ executables:
157
+ - opengraph_transporter
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - .gitignore
162
+ - Gemfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - bin/opengraph_transporter
167
+ - lib/.DS_Store
168
+ - lib/opengraph_transporter.rb
169
+ - lib/opengraph_transporter/.DS_Store
170
+ - lib/opengraph_transporter/base.rb
171
+ - lib/opengraph_transporter/browser.rb
172
+ - lib/opengraph_transporter/common.rb
173
+ - lib/opengraph_transporter/gracefulquit.rb
174
+ - lib/opengraph_transporter/resources/FacebookLocales.xml
175
+ - lib/opengraph_transporter/scraper.rb
176
+ - lib/opengraph_transporter/version.rb
177
+ - opengraph_transporter.gemspec
178
+ - test/.DS_Store
179
+ - test/lib/.DS_Store
180
+ - test/lib/opengraph_transporter/version_test.rb
181
+ - test/test_helper.rb
182
+ homepage: ''
183
+ licenses: []
184
+ metadata: {}
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - '>='
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.0.3
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: Transporter provides a quick way of exporting Facebook Open Graph Translations
205
+ between applications.
206
+ test_files:
207
+ - test/.DS_Store
208
+ - test/lib/.DS_Store
209
+ - test/lib/opengraph_transporter/version_test.rb
210
+ - test/test_helper.rb