impostor 0.2.1 → 1.0.0
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/.gemtest +0 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +47 -0
- data/History.txt +8 -0
- data/Manifest.txt +87 -55
- data/README.txt +11 -11
- data/Rakefile +16 -20
- data/lib/impostor/auth.rb +103 -0
- data/lib/impostor/config.rb +171 -0
- data/lib/impostor/errors.rb +67 -0
- data/lib/impostor/phpbb2.rb +202 -0
- data/lib/impostor/phpbb3.rb +199 -0
- data/lib/impostor/post.rb +111 -0
- data/lib/impostor/topic.rb +115 -0
- data/lib/impostor/wwf79.rb +186 -0
- data/lib/impostor/wwf80.rb +190 -0
- data/lib/impostor.rb +108 -5
- data/spec/auth_spec.rb +148 -0
- data/spec/base_spec_helper.rb +12 -0
- data/{test/test_helper.rb → spec/caged_net_http.rb} +8 -17
- data/spec/config_spec.rb +136 -0
- data/spec/fixtures/junk.html +1 -0
- data/{test → spec}/fixtures/phpbb2-get-new_topic-form-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb2-get-viewtopic-for-new-topic-good-response.html +11 -11
- data/{test → spec}/fixtures/phpbb2-get-viewtopic-for-new-topic-malformed-response.html +0 -0
- data/{test → spec}/fixtures/phpbb2-index.html +0 -0
- data/{test → spec}/fixtures/phpbb2-logged-in.html +0 -0
- data/{test → spec}/fixtures/phpbb2-login.html +0 -0
- data/{test → spec}/fixtures/phpbb2-not-logged-in.html +0 -0
- data/{test → spec}/fixtures/phpbb2-post-new_topic-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb2-post-reply-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb2-post-reply-throttled-response.html +0 -0
- data/{test → spec}/fixtures/phpbb2-too-many-posts.html +0 -0
- data/{test → spec}/fixtures/phpbb3-get-new-topic-form-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb3-get-reply-form-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb3-logged-in.html +0 -0
- data/{test → spec}/fixtures/phpbb3-login.html +0 -0
- data/{test → spec}/fixtures/phpbb3-not-logged-in.html +0 -0
- data/{test → spec}/fixtures/phpbb3-post-new_topic-good-response.html +0 -0
- data/{test → spec}/fixtures/phpbb3-post-reply-good-response.html +0 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-be-overlimit-creating-topic.yml +1308 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-create-topic.yml +923 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-login.yml +360 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-not-create-new-topic.yml +497 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-not-login.yml +287 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-not-post.yml +497 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-overlimit-error-post.yml +1140 -0
- data/spec/fixtures/vcr_cassettes/phpbb2-should-post.yml +751 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-be-overlimit-creating-topic.yml +995 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-create-topic.yml +675 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-login.yml +245 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-not-create-new-topic.yml +350 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-not-login.yml +253 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-not-post.yml +350 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-overlimit-error-post.yml +1046 -0
- data/spec/fixtures/vcr_cassettes/phpbb3-should-post.yml +605 -0
- data/{test → spec}/fixtures/wwf79-forum_posts.html +0 -0
- data/{test → spec}/fixtures/wwf79-general-new-topic-error.html +0 -0
- data/{test → spec}/fixtures/wwf79-general-posting-error.html +0 -0
- data/{test → spec}/fixtures/wwf79-good-post-forum_posts.html +1 -1
- data/{test → spec}/fixtures/wwf79-index.html +0 -0
- data/{test → spec}/fixtures/wwf79-logged-in.html +0 -0
- data/{test → spec}/fixtures/wwf79-login.html +0 -0
- data/{test → spec}/fixtures/wwf79-new-topic-forum_posts-response.html +0 -0
- data/{test → spec}/fixtures/wwf79-new-topic-post_message_form.html +0 -0
- data/{test → spec}/fixtures/wwf79-not-logged-in.html +0 -0
- data/{test → spec}/fixtures/wwf79-too-many-posts.html +0 -0
- data/{test → spec}/fixtures/wwf79-too-many-topics.html +0 -0
- data/{test → spec}/fixtures/wwf80-general-posting-error.html +0 -0
- data/{test → spec}/fixtures/wwf80-get-new_topic-form-good-response.html +0 -0
- data/{test → spec}/fixtures/wwf80-get-viewtopic-for-new-topic-good-response.html +0 -0
- data/{test → spec}/fixtures/wwf80-index.html +0 -0
- data/{test → spec}/fixtures/wwf80-logged-in.html +0 -0
- data/{test → spec}/fixtures/wwf80-login.html +0 -0
- data/{test → spec}/fixtures/wwf80-new_reply_form.html +0 -0
- data/{test → spec}/fixtures/wwf80-not-logged-in.html +0 -0
- data/{test → spec}/fixtures/wwf80-post-new_topic-good-response.html +1 -1
- data/{test → spec}/fixtures/wwf80-post-reply-good-response.html +0 -0
- data/{test → spec}/fixtures/wwf80-too-many-posts.html +0 -0
- data/spec/impostor_spec_helper.rb +162 -0
- data/spec/integration/phpbb2_spec.rb +111 -0
- data/spec/integration/phpbb3_spec.rb +109 -0
- data/spec/integration_spec_helper.rb +7 -0
- data/spec/phpbb2_spec.rb +346 -0
- data/spec/phpbb3_spec.rb +332 -0
- data/spec/post_spec.rb +134 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/test_impostor.rb +12 -0
- data/spec/topic_spec.rb +143 -0
- data/spec/wwf79_spec.rb +342 -0
- data/spec/wwf80_spec.rb +339 -0
- metadata +156 -87
- data/lib/www/impostor/phpbb2.rb +0 -258
- data/lib/www/impostor/phpbb3.rb +0 -236
- data/lib/www/impostor/wwf79.rb +0 -254
- data/lib/www/impostor/wwf80.rb +0 -264
- data/lib/www/impostor.rb +0 -269
- data/test/test_github.rb +0 -12
- data/test/test_www_impostor.rb +0 -165
- data/test/test_www_impostor_phpbb2.rb +0 -536
- data/test/test_www_impostor_phpbb3.rb +0 -483
- data/test/test_www_impostor_wwf79.rb +0 -535
- data/test/test_www_impostor_wwf80.rb +0 -535
- data/vendor/plugins/impostor/lib/autotest/discover.rb +0 -3
- data/vendor/plugins/impostor/lib/autotest/impostor.rb +0 -49
data/.gemtest
ADDED
|
File without changes
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.rvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
rvm gemset use impostor
|
data/Gemfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
|
|
3
|
+
source :gemcutter
|
|
4
|
+
|
|
5
|
+
gem "hoe", ">=2.8.0"
|
|
6
|
+
gem "mechanize", ">=1.0.0"
|
|
7
|
+
gem "nokogiri", ">=1.4.4"
|
|
8
|
+
|
|
9
|
+
group :development, :test do
|
|
10
|
+
gem "mongrel", ">=1.1.5"
|
|
11
|
+
gem "rspec", ">= 2.3.0"
|
|
12
|
+
gem "redgreen", ">=1.2.2"
|
|
13
|
+
gem "vcr", ">=1.5.1"
|
|
14
|
+
gem "webmock", ">=1.6.2"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# vim: syntax=ruby
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: http://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
addressable (2.2.4)
|
|
5
|
+
cgi_multipart_eof_fix (2.5.0)
|
|
6
|
+
crack (0.1.8)
|
|
7
|
+
daemons (1.1.0)
|
|
8
|
+
diff-lcs (1.1.2)
|
|
9
|
+
fastthread (1.0.7)
|
|
10
|
+
gem_plugin (0.2.3)
|
|
11
|
+
hoe (2.9.0)
|
|
12
|
+
rake (>= 0.8.7)
|
|
13
|
+
mechanize (1.0.0)
|
|
14
|
+
nokogiri (>= 1.2.1)
|
|
15
|
+
mongrel (1.1.5)
|
|
16
|
+
cgi_multipart_eof_fix (>= 2.4)
|
|
17
|
+
daemons (>= 1.0.3)
|
|
18
|
+
fastthread (>= 1.0.1)
|
|
19
|
+
gem_plugin (>= 0.2.3)
|
|
20
|
+
nokogiri (1.4.4)
|
|
21
|
+
rake (0.8.7)
|
|
22
|
+
redgreen (1.2.2)
|
|
23
|
+
rspec (2.4.0)
|
|
24
|
+
rspec-core (~> 2.4.0)
|
|
25
|
+
rspec-expectations (~> 2.4.0)
|
|
26
|
+
rspec-mocks (~> 2.4.0)
|
|
27
|
+
rspec-core (2.4.0)
|
|
28
|
+
rspec-expectations (2.4.0)
|
|
29
|
+
diff-lcs (~> 1.1.2)
|
|
30
|
+
rspec-mocks (2.4.0)
|
|
31
|
+
vcr (1.5.1)
|
|
32
|
+
webmock (1.6.2)
|
|
33
|
+
addressable (>= 2.2.2)
|
|
34
|
+
crack (>= 0.1.7)
|
|
35
|
+
|
|
36
|
+
PLATFORMS
|
|
37
|
+
ruby
|
|
38
|
+
|
|
39
|
+
DEPENDENCIES
|
|
40
|
+
hoe (>= 2.8.0)
|
|
41
|
+
mechanize (>= 1.0.0)
|
|
42
|
+
mongrel (>= 1.1.5)
|
|
43
|
+
nokogiri (>= 1.4.4)
|
|
44
|
+
redgreen (>= 1.2.2)
|
|
45
|
+
rspec (>= 2.3.0)
|
|
46
|
+
vcr (>= 1.5.1)
|
|
47
|
+
webmock (>= 1.6.2)
|
data/History.txt
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
### 1.0.0 / 2011-02-XX (move over bacon there's something leaner)
|
|
2
|
+
|
|
3
|
+
* 2 major enhancements
|
|
4
|
+
* refactored to a modularized architecture with base classes Config, Auth,
|
|
5
|
+
Post, and Topic using mixins to specify behavior specific to each forum by
|
|
6
|
+
implementing defined template methods from the base classes
|
|
7
|
+
* rspec and vcr used for specifying unit and integration behavior
|
|
8
|
+
|
|
1
9
|
### 0.2.1 / 2008-09-24 (to screen scrape is to love the internets)
|
|
2
10
|
|
|
3
11
|
* 1 minor enhancement:
|
data/Manifest.txt
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
.gitignore
|
|
2
|
+
.rspec
|
|
3
|
+
.rvmrc
|
|
4
|
+
Gemfile
|
|
5
|
+
Gemfile.lock
|
|
2
6
|
History.txt
|
|
3
7
|
Manifest.txt
|
|
4
8
|
README.txt
|
|
@@ -6,58 +10,86 @@ Rakefile
|
|
|
6
10
|
dev_tools/github.rb
|
|
7
11
|
impostor.gemspec
|
|
8
12
|
lib/impostor.rb
|
|
9
|
-
lib/
|
|
10
|
-
lib/
|
|
11
|
-
lib/
|
|
12
|
-
lib/
|
|
13
|
-
lib/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
13
|
+
lib/impostor/auth.rb
|
|
14
|
+
lib/impostor/config.rb
|
|
15
|
+
lib/impostor/errors.rb
|
|
16
|
+
lib/impostor/phpbb2.rb
|
|
17
|
+
lib/impostor/phpbb3.rb
|
|
18
|
+
lib/impostor/post.rb
|
|
19
|
+
lib/impostor/topic.rb
|
|
20
|
+
lib/impostor/wwf79.rb
|
|
21
|
+
lib/impostor/wwf80.rb
|
|
22
|
+
spec/auth_spec.rb
|
|
23
|
+
spec/base_spec_helper.rb
|
|
24
|
+
spec/caged_net_http.rb
|
|
25
|
+
spec/config_spec.rb
|
|
26
|
+
spec/fixtures/junk.html
|
|
27
|
+
spec/fixtures/phpbb2-get-new_topic-form-good-response.html
|
|
28
|
+
spec/fixtures/phpbb2-get-viewtopic-for-new-topic-good-response.html
|
|
29
|
+
spec/fixtures/phpbb2-get-viewtopic-for-new-topic-malformed-response.html
|
|
30
|
+
spec/fixtures/phpbb2-index.html
|
|
31
|
+
spec/fixtures/phpbb2-logged-in.html
|
|
32
|
+
spec/fixtures/phpbb2-login.html
|
|
33
|
+
spec/fixtures/phpbb2-not-logged-in.html
|
|
34
|
+
spec/fixtures/phpbb2-post-new_topic-good-response.html
|
|
35
|
+
spec/fixtures/phpbb2-post-reply-good-response.html
|
|
36
|
+
spec/fixtures/phpbb2-post-reply-throttled-response.html
|
|
37
|
+
spec/fixtures/phpbb2-too-many-posts.html
|
|
38
|
+
spec/fixtures/phpbb3-get-new-topic-form-good-response.html
|
|
39
|
+
spec/fixtures/phpbb3-get-reply-form-good-response.html
|
|
40
|
+
spec/fixtures/phpbb3-logged-in.html
|
|
41
|
+
spec/fixtures/phpbb3-login.html
|
|
42
|
+
spec/fixtures/phpbb3-not-logged-in.html
|
|
43
|
+
spec/fixtures/phpbb3-post-new_topic-good-response.html
|
|
44
|
+
spec/fixtures/phpbb3-post-reply-good-response.html
|
|
45
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-be-overlimit-creating-topic.yml
|
|
46
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-create-topic.yml
|
|
47
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-login.yml
|
|
48
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-not-create-new-topic.yml
|
|
49
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-not-login.yml
|
|
50
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-not-post.yml
|
|
51
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-overlimit-error-post.yml
|
|
52
|
+
spec/fixtures/vcr_cassettes/phpbb2-should-post.yml
|
|
53
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-be-overlimit-creating-topic.yml
|
|
54
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-create-topic.yml
|
|
55
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-login.yml
|
|
56
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-not-create-new-topic.yml
|
|
57
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-not-login.yml
|
|
58
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-not-post.yml
|
|
59
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-overlimit-error-post.yml
|
|
60
|
+
spec/fixtures/vcr_cassettes/phpbb3-should-post.yml
|
|
61
|
+
spec/fixtures/wwf79-forum_posts.html
|
|
62
|
+
spec/fixtures/wwf79-general-new-topic-error.html
|
|
63
|
+
spec/fixtures/wwf79-general-posting-error.html
|
|
64
|
+
spec/fixtures/wwf79-good-post-forum_posts.html
|
|
65
|
+
spec/fixtures/wwf79-index.html
|
|
66
|
+
spec/fixtures/wwf79-logged-in.html
|
|
67
|
+
spec/fixtures/wwf79-login.html
|
|
68
|
+
spec/fixtures/wwf79-new-topic-forum_posts-response.html
|
|
69
|
+
spec/fixtures/wwf79-new-topic-post_message_form.html
|
|
70
|
+
spec/fixtures/wwf79-not-logged-in.html
|
|
71
|
+
spec/fixtures/wwf79-too-many-posts.html
|
|
72
|
+
spec/fixtures/wwf79-too-many-topics.html
|
|
73
|
+
spec/fixtures/wwf80-general-posting-error.html
|
|
74
|
+
spec/fixtures/wwf80-get-new_topic-form-good-response.html
|
|
75
|
+
spec/fixtures/wwf80-get-viewtopic-for-new-topic-good-response.html
|
|
76
|
+
spec/fixtures/wwf80-index.html
|
|
77
|
+
spec/fixtures/wwf80-logged-in.html
|
|
78
|
+
spec/fixtures/wwf80-login.html
|
|
79
|
+
spec/fixtures/wwf80-new_reply_form.html
|
|
80
|
+
spec/fixtures/wwf80-not-logged-in.html
|
|
81
|
+
spec/fixtures/wwf80-post-new_topic-good-response.html
|
|
82
|
+
spec/fixtures/wwf80-post-reply-good-response.html
|
|
83
|
+
spec/fixtures/wwf80-too-many-posts.html
|
|
84
|
+
spec/impostor_spec_helper.rb
|
|
85
|
+
spec/integration/phpbb2_spec.rb
|
|
86
|
+
spec/integration/phpbb3_spec.rb
|
|
87
|
+
spec/integration_spec_helper.rb
|
|
88
|
+
spec/phpbb2_spec.rb
|
|
89
|
+
spec/phpbb3_spec.rb
|
|
90
|
+
spec/post_spec.rb
|
|
91
|
+
spec/spec_helper.rb
|
|
92
|
+
spec/test_impostor.rb
|
|
93
|
+
spec/topic_spec.rb
|
|
94
|
+
spec/wwf79_spec.rb
|
|
95
|
+
spec/wwf80_spec.rb
|
data/README.txt
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
impostor
|
|
2
2
|
by Mike Mondragon
|
|
3
|
+
https://github.com/monde/impostor
|
|
3
4
|
http://impostor.rubyforge.org/
|
|
4
5
|
|
|
5
6
|
== DESCRIPTION:
|
|
6
|
-
|
|
7
|
+
|
|
7
8
|
imPOSTor posts messages to forums
|
|
8
9
|
|
|
9
10
|
== FEATURES/PROBLEMS:
|
|
@@ -12,45 +13,44 @@ Makes automated posts to the following forum applications:
|
|
|
12
13
|
|
|
13
14
|
* Web Wiz Forums (WWF) 7.9
|
|
14
15
|
* Web Wiz Forums (WWF) 8.0
|
|
15
|
-
* PHP Bullitin Board (phpBB) 2.
|
|
16
|
+
* PHP Bullitin Board (phpBB) 2.2
|
|
16
17
|
* PHP Bullitin Board (phpBB) 3.0
|
|
17
18
|
|
|
18
19
|
== SYNOPSIS:
|
|
19
20
|
|
|
20
21
|
# config yaml has options specific to wwf79, phpbb2, etc.
|
|
21
|
-
# Read the impostor docs for configuration options for the kind of forum to
|
|
22
|
+
# Read the impostor docs for configuration options for the kind of forum to
|
|
22
23
|
# be accessed.
|
|
23
24
|
# config can be keyed by symbols or strings
|
|
24
25
|
config = YAML::load_file('conf/impostor.yml')
|
|
25
|
-
|
|
26
|
+
impostor = Impostor.new(config)
|
|
26
27
|
message = %q{hello world is to application
|
|
27
28
|
programmers as tea pots are to graphics programmers}
|
|
28
29
|
# your application stores forum and topic ids
|
|
29
|
-
|
|
30
|
+
impostor.post(forum=5,topic=10,message)
|
|
30
31
|
# make a new topic
|
|
31
32
|
subject = "about programmers..."
|
|
32
|
-
|
|
33
|
-
post.logout
|
|
33
|
+
impostor.new_topic(forum=7,subject,message)
|
|
34
34
|
|
|
35
35
|
== REQUIREMENTS:
|
|
36
36
|
|
|
37
|
+
* hoe
|
|
37
38
|
* mechanize
|
|
38
|
-
*
|
|
39
|
+
* nokogiri
|
|
39
40
|
|
|
40
41
|
== SOURCE
|
|
41
42
|
|
|
42
43
|
git clone git://github.com/monde/impostor.git
|
|
43
|
-
svn co svn://rubyforge.org/var/svn/impostor/trunk impostor
|
|
44
44
|
|
|
45
45
|
== INSTALL:
|
|
46
46
|
|
|
47
|
-
*
|
|
47
|
+
* gem install impostor
|
|
48
48
|
|
|
49
49
|
== LICENSE:
|
|
50
50
|
|
|
51
51
|
(The MIT License)
|
|
52
52
|
|
|
53
|
-
Copyright (c) 2008 Mike Mondragon
|
|
53
|
+
Copyright (c) 2008-2011 Mike Mondragon
|
|
54
54
|
|
|
55
55
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
56
56
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
|
@@ -1,40 +1,36 @@
|
|
|
1
1
|
# -*- ruby -*-
|
|
2
2
|
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'hoe'
|
|
5
3
|
begin
|
|
6
|
-
require '
|
|
4
|
+
require 'hoe'
|
|
7
5
|
rescue LoadError
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
require 'hoe'
|
|
8
8
|
end
|
|
9
|
-
require '
|
|
9
|
+
require 'rspec/core/rake_task'
|
|
10
|
+
|
|
10
11
|
$LOAD_PATH.unshift 'lib'
|
|
11
12
|
require 'impostor'
|
|
12
13
|
|
|
13
|
-
Hoe.
|
|
14
|
+
Hoe.plugin :bundler, :git
|
|
15
|
+
Hoe.spec('impostor') do |p|
|
|
16
|
+
p.version = Impostor::VERSION
|
|
14
17
|
p.rubyforge_name = 'impostor'
|
|
15
18
|
p.author = 'Mike Mondragon'
|
|
16
19
|
p.email = 'mikemondragon@gmail.com'
|
|
17
20
|
p.summary = 'imPOSTor posts messages to non-RESTful forums and blogs'
|
|
18
21
|
p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
|
|
19
|
-
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[
|
|
22
|
+
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/).map{ |line| line.strip }[2]
|
|
23
|
+
p.readme_file = "README.txt"
|
|
24
|
+
p.history_file = "History.txt"
|
|
20
25
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
|
21
|
-
p.extra_deps << ['
|
|
22
|
-
p.extra_deps << ['mechanize', '>= 0.
|
|
26
|
+
p.extra_deps << ['nokogiri', '>= 1.4.4']
|
|
27
|
+
p.extra_deps << ['mechanize', '>= 1.0.0']
|
|
23
28
|
p.clean_globs << 'coverage'
|
|
29
|
+
p.testlib = :rspec
|
|
24
30
|
end
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
Rcov::RcovTask.new do |t|
|
|
28
|
-
t.test_files = FileList['test/test_www_impostor*.rb']
|
|
29
|
-
t.verbose = true
|
|
30
|
-
end
|
|
31
|
-
rescue NameError
|
|
32
|
-
end
|
|
32
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
t.libs << "test"
|
|
36
|
-
t.test_files = FileList['test/test_www_impostor*.rb']
|
|
37
|
-
t.verbose = true
|
|
38
|
-
end
|
|
34
|
+
task :default => :spec
|
|
39
35
|
|
|
40
36
|
# vim: syntax=Ruby
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
class Impostor::Auth
|
|
2
|
+
|
|
3
|
+
attr_reader :config
|
|
4
|
+
attr_reader :authenticated
|
|
5
|
+
alias :authenticated? :authenticated
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Auth is initialized with the config of the impostor
|
|
9
|
+
|
|
10
|
+
def initialize(config)
|
|
11
|
+
@config = config
|
|
12
|
+
self.extend eval("Impostor::#{config.type.to_s.capitalize}::Auth")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Login to the impostor's forum. #login is comprised of the following
|
|
17
|
+
# template methods to allow implementation for specific forum applications:
|
|
18
|
+
#
|
|
19
|
+
# * fetch_login_page
|
|
20
|
+
# * logged_in?(page)
|
|
21
|
+
# * get_login_form(page)
|
|
22
|
+
# * set_username_and_password(form)
|
|
23
|
+
# * post_login(form)
|
|
24
|
+
|
|
25
|
+
def login
|
|
26
|
+
return true if self.authenticated?
|
|
27
|
+
|
|
28
|
+
page = self.fetch_login_page
|
|
29
|
+
return true if self.logged_in?(page)
|
|
30
|
+
|
|
31
|
+
form = self.get_login_form(page)
|
|
32
|
+
self.set_username_and_password(form)
|
|
33
|
+
page = self.post_login(form)
|
|
34
|
+
|
|
35
|
+
@authenticated = self.logged_in?(page)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def login_with_raises
|
|
39
|
+
return true if self.login
|
|
40
|
+
|
|
41
|
+
raise Impostor::LoginError.new("not logged in")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# logot of the impostor's forum
|
|
46
|
+
|
|
47
|
+
def logout
|
|
48
|
+
return false unless self.authenticated?
|
|
49
|
+
|
|
50
|
+
self.config.save_topics
|
|
51
|
+
self.config.save_cookie_jar
|
|
52
|
+
|
|
53
|
+
@authenticated = false
|
|
54
|
+
|
|
55
|
+
not self.authenticated?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# given the state of the page, are we logged in to the forum?
|
|
60
|
+
|
|
61
|
+
def logged_in?(page)
|
|
62
|
+
raise Impostor::MissingTemplateMethodError.new("logged_in? must be implemented")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# get the page for logging in
|
|
67
|
+
|
|
68
|
+
def fetch_login_page
|
|
69
|
+
begin
|
|
70
|
+
self.config.agent.get(self.config.login_page)
|
|
71
|
+
rescue StandardError => err
|
|
72
|
+
raise Impostor::LoginError.new(err)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# returns the login form from the login page
|
|
78
|
+
|
|
79
|
+
def get_login_form(page)
|
|
80
|
+
raise Impostor::MissingTemplateMethodError.new("get_login_form must be implemented")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# Sets the user name and pass word on the loing form.
|
|
85
|
+
|
|
86
|
+
def set_username_and_password(form)
|
|
87
|
+
raise Impostor::MissingTemplateMethodError.new("set_username_and_password must be implemented")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
##
|
|
91
|
+
# does the work of posting the login form
|
|
92
|
+
|
|
93
|
+
def post_login(form)
|
|
94
|
+
begin
|
|
95
|
+
config.sleep_before_post
|
|
96
|
+
page = form.submit
|
|
97
|
+
rescue StandardError => err
|
|
98
|
+
raise Impostor::LoginError.new(err)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
end
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
class Impostor::Config
|
|
2
|
+
|
|
3
|
+
attr_reader :agent
|
|
4
|
+
attr_reader :topics
|
|
5
|
+
|
|
6
|
+
def initialize(config)
|
|
7
|
+
@config = config
|
|
8
|
+
validate_keys(:type, :username, :password, :app_root, :login_page)
|
|
9
|
+
setup_agent
|
|
10
|
+
load_topics
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Validates expected keys are in the config
|
|
15
|
+
|
|
16
|
+
def validate_keys(*keys)
|
|
17
|
+
keys.each do |key|
|
|
18
|
+
val = self.config(key)
|
|
19
|
+
raise Impostor::ConfigError.new("Missing key '#{key}' in configuration") unless val
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Access the current config and key it without regard for symbols or strings
|
|
25
|
+
|
|
26
|
+
def config(key)
|
|
27
|
+
@config[key.to_sym] || @config[key.to_s]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# Sets up the mechanize agent initialized with cookie jar file specified by
|
|
32
|
+
# the :cookie_jar configuration parameter if it exists
|
|
33
|
+
|
|
34
|
+
def setup_agent
|
|
35
|
+
@agent = Mechanize.new do |mechanize|
|
|
36
|
+
if logger = self.config(:logger)
|
|
37
|
+
if File.exist?(logger.to_s)
|
|
38
|
+
mechanize.log = Logger.new(logger.to_s)
|
|
39
|
+
elsif logger == "STDOUT"
|
|
40
|
+
mechanize.log = Logger.new(STDOUT)
|
|
41
|
+
else
|
|
42
|
+
mechanize.log = logger
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
@agent.user_agent_alias = self.user_agent if self.user_agent
|
|
47
|
+
# jar is a yaml file
|
|
48
|
+
@agent.cookie_jar.load(cookie_jar) if cookie_jar && File.exist?(cookie_jar)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# Load the topics that the impostor already knows about
|
|
53
|
+
|
|
54
|
+
def load_topics
|
|
55
|
+
cache = self.topics_cache || ""
|
|
56
|
+
if File::exist?(cache)
|
|
57
|
+
@topics = YAML::load_file(cache)
|
|
58
|
+
else
|
|
59
|
+
@topics = Hash.new
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# Add subject to topics hash
|
|
65
|
+
|
|
66
|
+
def add_subject(forum, topic, name)
|
|
67
|
+
forum = forum.to_s
|
|
68
|
+
topic = topic.to_s
|
|
69
|
+
if self.topics[forum].nil?
|
|
70
|
+
self.topics[forum] = {topic, name}
|
|
71
|
+
else
|
|
72
|
+
self.topics[forum][topic] = name
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# Get the topic name (subject) based on forum and topic ids
|
|
78
|
+
|
|
79
|
+
def get_subject(forum, topic)
|
|
80
|
+
forum = forum.to_s
|
|
81
|
+
topic = topic.to_s
|
|
82
|
+
self.topics[forum] ? self.topics[forum][topic] : nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
##
|
|
86
|
+
# Save the topics
|
|
87
|
+
|
|
88
|
+
def save_topics
|
|
89
|
+
cache = self.topics_cache || ""
|
|
90
|
+
if File::exist?(cache)
|
|
91
|
+
File.open(cache, 'w') do |out|
|
|
92
|
+
YAML.dump(self.topics, out)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
##
|
|
98
|
+
# Save the cookie jar
|
|
99
|
+
|
|
100
|
+
def save_cookie_jar
|
|
101
|
+
self.agent.cookie_jar.save_as(self.cookie_jar) if self.cookie_jar
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
# Gets the application root of the application such as
|
|
106
|
+
# http://example.com/phpbb or http://example.com/forums
|
|
107
|
+
|
|
108
|
+
def app_root
|
|
109
|
+
self.config(:app_root)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Get the topics cache
|
|
114
|
+
|
|
115
|
+
def topics_cache
|
|
116
|
+
self.config(:topics_cache)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# Get the login page for the application
|
|
121
|
+
|
|
122
|
+
def login_page
|
|
123
|
+
URI.join(app_root, self.config(:login_page))
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# Get the username for the application
|
|
128
|
+
|
|
129
|
+
def username
|
|
130
|
+
self.config(:username)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
##
|
|
134
|
+
# Get the password for the application
|
|
135
|
+
|
|
136
|
+
def password
|
|
137
|
+
self.config(:password)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# A Mechanize user agent name, see the mechanize documentation
|
|
142
|
+
# 'Linux Mozilla', 'Mac Safari', 'Windows IE 7', etc.
|
|
143
|
+
|
|
144
|
+
def user_agent
|
|
145
|
+
self.config(:user_agent) || 'Mechanize'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
##
|
|
149
|
+
# is a yaml file for Mechanize::CookieJar
|
|
150
|
+
|
|
151
|
+
def cookie_jar
|
|
152
|
+
self.config(:cookie_jar)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
##
|
|
156
|
+
# The impostor type, as specified in the config
|
|
157
|
+
|
|
158
|
+
def type
|
|
159
|
+
self.config(:type)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
##
|
|
163
|
+
# Some forums require a bit of delay before posting to not have the post be
|
|
164
|
+
# considered coming from a bot.
|
|
165
|
+
|
|
166
|
+
def sleep_before_post
|
|
167
|
+
sleep self.config(:sleep_before_post).to_i
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
end
|
|
171
|
+
|