mollom_rest_api 0.1.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.
- checksums.yaml +15 -0
- data/.gitignore +22 -0
- data/.travis.yml +4 -0
- data/Gemfile +18 -0
- data/Guardfile +4 -0
- data/LICENSE +21 -0
- data/README.md +86 -0
- data/Rakefile +6 -0
- data/lib/mollom_rest_api/exceptions.rb +12 -0
- data/lib/mollom_rest_api/interface.rb +81 -0
- data/lib/mollom_rest_api/v1/blacklist.rb +29 -0
- data/lib/mollom_rest_api/v1/captcha.rb +11 -0
- data/lib/mollom_rest_api/v1/content.rb +12 -0
- data/lib/mollom_rest_api/v1/feedback.rb +14 -0
- data/lib/mollom_rest_api/v1/site.rb +23 -0
- data/lib/mollom_rest_api/v1/whitelist.rb +29 -0
- data/lib/mollom_rest_api/v1.rb +3 -0
- data/lib/mollom_rest_api/version.rb +3 -0
- data/lib/mollom_rest_api/versioned_api.rb +51 -0
- data/lib/mollom_rest_api.rb +31 -0
- data/log/.gitkeep +0 -0
- data/mollom_rest_api.gemspec +21 -0
- data/spec/fixtures/cassette_library/blacklist/create.yml +43 -0
- data/spec/fixtures/cassette_library/blacklist/delete.yml +43 -0
- data/spec/fixtures/cassette_library/blacklist/list.yml +39 -0
- data/spec/fixtures/cassette_library/blacklist/read.yml +41 -0
- data/spec/fixtures/cassette_library/blacklist/update.yml +43 -0
- data/spec/fixtures/cassette_library/captcha/create/default_request.yml +45 -0
- data/spec/fixtures/cassette_library/captcha/create/invalid_type.yml +45 -0
- data/spec/fixtures/cassette_library/captcha/create/valid_request.yml +45 -0
- data/spec/fixtures/cassette_library/captcha/verify/invalid_captcha_id.yml +45 -0
- data/spec/fixtures/cassette_library/captcha/verify/invalid_solution.yml +46 -0
- data/spec/fixtures/cassette_library/captcha/verify/valid_solution.yml +46 -0
- data/spec/fixtures/cassette_library/content/create.yml +46 -0
- data/spec/fixtures/cassette_library/content/update/invalid_content_id.yml +45 -0
- data/spec/fixtures/cassette_library/content/update/valid_request.yml +45 -0
- data/spec/fixtures/cassette_library/feedback/add/captcha_request.yml +45 -0
- data/spec/fixtures/cassette_library/feedback/add/content_request.yml +45 -0
- data/spec/fixtures/cassette_library/interface/some_api/a_post_action.yml +32 -0
- data/spec/fixtures/cassette_library/interface/some_api/an_overriden_get_action.yml +26 -0
- data/spec/fixtures/cassette_library/interface/some_api/an_overriden_post_action.yml +32 -0
- data/spec/fixtures/cassette_library/interface/some_api/delete.yml +26 -0
- data/spec/fixtures/cassette_library/interface/some_api/list.yml +26 -0
- data/spec/fixtures/cassette_library/invalid_request.yml +59 -0
- data/spec/fixtures/cassette_library/site/create.yml +45 -0
- data/spec/fixtures/cassette_library/site/delete.yml +45 -0
- data/spec/fixtures/cassette_library/site/list.yml +75 -0
- data/spec/fixtures/cassette_library/site/read.yml +41 -0
- data/spec/fixtures/cassette_library/site/update.yml +43 -0
- data/spec/fixtures/cassette_library/whitelist/create.yml +43 -0
- data/spec/fixtures/cassette_library/whitelist/delete.yml +43 -0
- data/spec/fixtures/cassette_library/whitelist/list.yml +41 -0
- data/spec/fixtures/cassette_library/whitelist/read.yml +39 -0
- data/spec/fixtures/cassette_library/whitelist/update.yml +43 -0
- data/spec/fixtures/v_test_01.rb +27 -0
- data/spec/mollom_rest_api/exceptions_spec.rb +25 -0
- data/spec/mollom_rest_api/interface_spec.rb +43 -0
- data/spec/mollom_rest_api/v1/blacklist_spec.rb +64 -0
- data/spec/mollom_rest_api/v1/captcha_spec.rb +63 -0
- data/spec/mollom_rest_api/v1/content_spec.rb +41 -0
- data/spec/mollom_rest_api/v1/feedback_spec.rb +37 -0
- data/spec/mollom_rest_api/v1/site_spec.rb +63 -0
- data/spec/mollom_rest_api/v1/whitelist_spec.rb +64 -0
- data/spec/mollom_rest_api/v1_spec.rb +9 -0
- data/spec/mollom_rest_api/version_spec.rb +5 -0
- data/spec/mollom_rest_api/versioned_api_spec.rb +26 -0
- data/spec/mollom_rest_api_spec.rb +30 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/macros/alternate_syntax_macro.rb +38 -0
- data/spec/support/shared_examples/api_error_handling.rb +33 -0
- data/spec/support/vcr.rb +37 -0
- metadata +192 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
MWZiNDM0Mjg5ZGIyMmZhMTdmYWI4OWY3YTg0NWE4Mjk5OWNlZmI5Zg==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
MjUxNGVkZDljYTU1ZDYyZWQyY2I0MTU3ZTU0Y2I4MWZmYWFiNmRjZA==
|
|
7
|
+
SHA512:
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
ZDE2NGFjNmM1ZWZhOGQyNWIwYjk5MzRmNDkxNGU1OGRmM2Q3NTUxNDVlNzk5
|
|
10
|
+
MzkyYWEyNDYyNWYzMTQ4ZDQ5YmFjMWZmZWY1NzFiYzc3NmZiODZkMWQ3MWE3
|
|
11
|
+
NjI5ZWExMjllODY0MGM1MjJhNTBjM2RkYzliNDhkMjVhZjA2MzE=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
OWZmMzU1YWI0YzgyODk3NjMyODhjZDE0MWE2NDA4MTc2NTRlYWUwN2QwZGE1
|
|
14
|
+
YTBmZGIxNzNjYjczNGIzNzcwNDZkMzlhZTM2ZTY4YTIzNGU2ZDZkZWQ2YWJk
|
|
15
|
+
OWVjZDY4Y2JjMjc0ZTNkMmE4ODk2ZGI3MzE5NGY5MTMzNTY4YWQ=
|
data/.gitignore
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
*.gem
|
|
2
|
+
*.rbc
|
|
3
|
+
.bundle
|
|
4
|
+
.config
|
|
5
|
+
.yardoc
|
|
6
|
+
Gemfile.lock
|
|
7
|
+
InstalledFiles
|
|
8
|
+
_yardoc
|
|
9
|
+
coverage
|
|
10
|
+
doc/
|
|
11
|
+
lib/bundler/man
|
|
12
|
+
pkg
|
|
13
|
+
rdoc
|
|
14
|
+
spec/reports
|
|
15
|
+
test/tmp
|
|
16
|
+
test/version_tmp
|
|
17
|
+
tmp
|
|
18
|
+
.idea
|
|
19
|
+
.ruby-version
|
|
20
|
+
.ruby-gemset
|
|
21
|
+
.sass-cache
|
|
22
|
+
log/test.log
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
source 'http://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gemspec
|
|
4
|
+
|
|
5
|
+
gem 'coveralls', require: false
|
|
6
|
+
|
|
7
|
+
group :development do
|
|
8
|
+
gem 'guard'
|
|
9
|
+
gem 'guard-rspec'
|
|
10
|
+
gem 'terminal-notifier-guard'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
group :test do
|
|
14
|
+
gem 'rake'
|
|
15
|
+
gem 'rspec'
|
|
16
|
+
gem 'webmock'
|
|
17
|
+
gem 'vcr'
|
|
18
|
+
end
|
data/Guardfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014 Krystian Czesak
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
[](https://travis-ci.org/Krystosterone/mollom_rest_api)
|
|
2
|
+
[](https://coveralls.io/r/Krystosterone/mollom_rest_api?branch=master)
|
|
3
|
+
|
|
4
|
+
# Mollom Rest API
|
|
5
|
+
|
|
6
|
+
mollom_rest_api is a ruby wrapper, using oauth authentication, for the [Mollom](https://mollom.com) Rest API.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
Add to your Gemfile:
|
|
11
|
+
|
|
12
|
+
gem 'mollom_rest_api'
|
|
13
|
+
|
|
14
|
+
or install from Rubygems:
|
|
15
|
+
|
|
16
|
+
gem install mollom_rest_api
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
Before using the gem, you must first configure it as such:
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
MollomRestApi.url = 'http://rest.mollom.com' # Do not include the API version number
|
|
24
|
+
MollomRestApi.public_key = 'my_public_key'
|
|
25
|
+
MollomRestApi.private_key = 'my_private_key'
|
|
26
|
+
MollomRestApi.oauth_options = {proxy: 'http://proxy.com:8888'} # some additional oauth options
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
You can get your public key and private key using Mollom's [site manager](https://mollom.com/user/130051/site-manager), after signing in.
|
|
30
|
+
|
|
31
|
+
### Calling endpoints
|
|
32
|
+
The gem implementation replicates the [Mollom's API Documentation](https://mollom.com/api) as much as possible.
|
|
33
|
+
|
|
34
|
+
#### Example of API call
|
|
35
|
+
|
|
36
|
+
Here is an example of how to verify a captcha using the gem.
|
|
37
|
+
|
|
38
|
+
As per Mollom's Documentation on [verifying a captcha](https://mollom.com/api#captcha):
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Syntax: POST http://rest.mollom.com/v1/captcha
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- Path parameters
|
|
45
|
+
- **captchaId: The ID of the CAPTCHA resource.**
|
|
46
|
+
- Request parameters
|
|
47
|
+
- **solution:**
|
|
48
|
+
- **The answer provided by the author.**
|
|
49
|
+
- authorName: (optional)
|
|
50
|
+
- The name of the content author.
|
|
51
|
+
- authorUrl: (optional)
|
|
52
|
+
- The homepage/website URL of the content author.
|
|
53
|
+
- authorMail: (optional)
|
|
54
|
+
- The e-mail address of the content author.
|
|
55
|
+
- authorIp: (optional)
|
|
56
|
+
- The IP address of the content author.
|
|
57
|
+
- authorId: (optional)
|
|
58
|
+
- The local user ID of the content author on the client site.
|
|
59
|
+
- authorOpenid: (multiple, optional)
|
|
60
|
+
- One or more Open IDs of the content author.
|
|
61
|
+
- rateLimit: (optional, default = 15)
|
|
62
|
+
- Seconds that must have passed by for the same author to post again.
|
|
63
|
+
- honeypot: (optional)
|
|
64
|
+
- Client-side honeypot value, if non-empty.
|
|
65
|
+
|
|
66
|
+
As such, `captchaId` and `solution` must both be specified for the endpoint call to succeed. All other parameters are optional, and can be passed to the call using a hash.
|
|
67
|
+
|
|
68
|
+
Using the gem, we call this endpoint using:
|
|
69
|
+
|
|
70
|
+
```ruby
|
|
71
|
+
MollomRestApi::V1::Captcha.verify("captchaId", "solution", {authorName: "Bob", ...})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
or using the alternative syntax:
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
MollomRestApi::V1::verify_captcha("captchaId", "solution", {authorName: "Bob", ...})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Running Tests
|
|
81
|
+
|
|
82
|
+
`bundle exec rspec spec` - Running specs (all web interactions are mocked with VCR cassettes)
|
|
83
|
+
|
|
84
|
+
### Contributors
|
|
85
|
+
+ [royjs](https://github.com/royjs)
|
|
86
|
+
+ [krystosterone](https://github.com/krystosterone)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
class MollomRestApi::Interface
|
|
2
|
+
REQUEST_HEADERS = {'Accept' => 'application/json'}
|
|
3
|
+
MANDATORY_CONFIGURATIONS = %w(url public_key private_key)
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
protected
|
|
7
|
+
|
|
8
|
+
def results_key
|
|
9
|
+
path_from_class_name
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def path
|
|
13
|
+
path_from_class_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def version
|
|
17
|
+
version_from_class_name
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def post(request_parameters = {}, path_parameters = [])
|
|
21
|
+
request(:post, request_parameters, path_parameters)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def get(request_parameters = {}, path_parameters = [])
|
|
25
|
+
request(:get, request_parameters, path_parameters)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def request(http_method, request_parameters, path_parameters)
|
|
31
|
+
ensure_configuration_is_valid!
|
|
32
|
+
|
|
33
|
+
request_arguments = request_arguments(http_method, path, path_parameters, request_parameters, version)
|
|
34
|
+
response = MollomRestApi.oauth_access_token.request(http_method, *request_arguments)
|
|
35
|
+
|
|
36
|
+
throw_api_exception_using(response) unless response.code == '200'
|
|
37
|
+
|
|
38
|
+
computed_results_key = method_that_called_the_api_operation == 'list' ? 'list' : results_key
|
|
39
|
+
JSON.parse(response.body)[computed_results_key]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def ensure_configuration_is_valid!
|
|
43
|
+
MANDATORY_CONFIGURATIONS.each do |config|
|
|
44
|
+
raise MollomRestApi::MissingConfig.new("Missing #{config}.") if MollomRestApi.send(config).nil?
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def request_arguments(http_method, path, path_parameters, request_parameters, version)
|
|
49
|
+
url = url(path_parameters, version, path)
|
|
50
|
+
|
|
51
|
+
if http_method == :get
|
|
52
|
+
["#{url}?#{request_parameters.to_query}", REQUEST_HEADERS]
|
|
53
|
+
elsif http_method == :post
|
|
54
|
+
[url, request_parameters, REQUEST_HEADERS]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def url(path_parameters, version, path)
|
|
59
|
+
path_parameters << 'delete' if method_that_called_the_api_operation == 'delete'
|
|
60
|
+
url_path = [path, path_parameters].flatten.compact.join('/')
|
|
61
|
+
"#{MollomRestApi.url}/#{version}/#{url_path}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def method_that_called_the_api_operation
|
|
65
|
+
index = caller.index { |callstack| callstack[/`([^']*)'/, 1] == 'request' }
|
|
66
|
+
caller[index + 2][/`([^']*)'/, 1]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def version_from_class_name
|
|
70
|
+
self.name.split('::')[-2].downcase
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def path_from_class_name
|
|
74
|
+
self.name.split('::').last.underscore
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def throw_api_exception_using(response)
|
|
78
|
+
raise MollomRestApi::ApiException.new(response.body, response.code.to_i)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class MollomRestApi::V1::Blacklist < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(public_key, value, request_parameters = {})
|
|
4
|
+
post(request_parameters.reverse_merge(value: value), [public_key])
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def update(public_key, blacklist_entry_id, request_parameters = {})
|
|
8
|
+
post(request_parameters, [public_key, blacklist_entry_id])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def delete(public_key, blacklist_entry_id)
|
|
12
|
+
post({}, [public_key, blacklist_entry_id])
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def list(public_key, request_parameters = {})
|
|
16
|
+
get(request_parameters, [public_key])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def read(public_key, blacklist_entry_id)
|
|
20
|
+
get({}, [public_key, blacklist_entry_id])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
|
|
25
|
+
def results_key
|
|
26
|
+
'entry'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class MollomRestApi::V1::Captcha < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(type = 'image', request_parameters = {})
|
|
4
|
+
post(request_parameters.reverse_merge(type: type))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def verify(captcha_id, solution, request_parameters = {})
|
|
8
|
+
post(request_parameters.reverse_merge(solution: solution), captcha_id)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class MollomRestApi::V1::Content < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(request_parameters = {})
|
|
4
|
+
post(request_parameters)
|
|
5
|
+
end
|
|
6
|
+
alias_method :check, :create
|
|
7
|
+
|
|
8
|
+
def update(content_id, request_parameters = {})
|
|
9
|
+
post(request_parameters, [content_id])
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class MollomRestApi::V1::Feedback < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(reason, request_parameters = {})
|
|
4
|
+
raise_missing_parameter_error unless request_parameters.include?(:contentId) ^ request_parameters.include?(:captchaId)
|
|
5
|
+
post(request_parameters.reverse_merge(reason: reason))
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def raise_missing_parameter_error
|
|
11
|
+
raise ArgumentError.new("Specify one of two parameters: contentId or captchaId.")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class MollomRestApi::V1::Site < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(url, email, request_parameters = {})
|
|
4
|
+
post(request_parameters.reverse_merge(url: url, email: email))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def update(public_key, request_parameters = {})
|
|
8
|
+
post(request_parameters, [public_key])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def list(request_parameters = {})
|
|
12
|
+
get(request_parameters)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def read(public_key)
|
|
16
|
+
get({}, [public_key])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def delete(public_key)
|
|
20
|
+
post({}, [public_key])
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class MollomRestApi::V1::Whitelist < MollomRestApi::Interface
|
|
2
|
+
class << self
|
|
3
|
+
def create(public_key, value, context, request_parameters = {})
|
|
4
|
+
post(request_parameters.reverse_merge(value: value, context: context), [public_key])
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def update(public_key, whitelist_entry_id, request_parameters = {})
|
|
8
|
+
post(request_parameters, [public_key, whitelist_entry_id])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def delete(public_key, whitelist_entry_id)
|
|
12
|
+
post({}, [public_key, whitelist_entry_id])
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def list(public_key, request_parameters = {})
|
|
16
|
+
get(request_parameters, [public_key])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def read(public_key, whitelist_entry_id)
|
|
20
|
+
get({}, [public_key, whitelist_entry_id])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
|
|
25
|
+
def results_key
|
|
26
|
+
'entry'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module MollomRestApi
|
|
2
|
+
class VersionedApi
|
|
3
|
+
class << self
|
|
4
|
+
def method_missing(method_name, *arguments, &block)
|
|
5
|
+
if handles_api_call?(method_name)
|
|
6
|
+
target_class = extract_class_from(method_name)
|
|
7
|
+
target_method = extract_method_from(method_name)
|
|
8
|
+
target_class.send(target_method, *arguments)
|
|
9
|
+
else
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def respond_to?(method_name, include_private = false)
|
|
15
|
+
if handles_api_call?(method_name)
|
|
16
|
+
true
|
|
17
|
+
else
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def handles_api_call?(method_name)
|
|
25
|
+
target_class = extract_class_from(method_name)
|
|
26
|
+
return false if target_class.nil?
|
|
27
|
+
|
|
28
|
+
target_method = extract_method_from(method_name)
|
|
29
|
+
|
|
30
|
+
receiver_public_methods_of(target_class).include?(target_method.to_sym)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def receiver_public_methods_of(klass)
|
|
34
|
+
klass.public_methods(false) & klass.methods(false)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def extract_class_from(method_name)
|
|
38
|
+
interface_name = method_name.to_s.split('_').last
|
|
39
|
+
class_name = interface_name.camelize
|
|
40
|
+
return unless self.const_defined?(class_name)
|
|
41
|
+
|
|
42
|
+
target_class_name = "#{self.name}::#{class_name}"
|
|
43
|
+
target_class_name.constantize
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def extract_method_from(method_name)
|
|
47
|
+
method_name.to_s.split('_').first
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'oauth'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'active_support/all'
|
|
4
|
+
|
|
5
|
+
module MollomRestApi
|
|
6
|
+
require 'mollom_rest_api/version'
|
|
7
|
+
require 'mollom_rest_api/exceptions'
|
|
8
|
+
require 'mollom_rest_api/interface'
|
|
9
|
+
require 'mollom_rest_api/versioned_api'
|
|
10
|
+
require 'mollom_rest_api/v1'
|
|
11
|
+
require 'mollom_rest_api/v1/content'
|
|
12
|
+
require 'mollom_rest_api/v1/captcha'
|
|
13
|
+
require 'mollom_rest_api/v1/feedback'
|
|
14
|
+
require 'mollom_rest_api/v1/site'
|
|
15
|
+
require 'mollom_rest_api/v1/blacklist'
|
|
16
|
+
require 'mollom_rest_api/v1/whitelist'
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
attr_accessor :url, :public_key, :private_key, :oauth_options
|
|
20
|
+
|
|
21
|
+
def oauth_access_token
|
|
22
|
+
@oauth_access_token ||= OAuth::AccessToken.new(oauth_consumer)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def oauth_consumer
|
|
28
|
+
OAuth::Consumer.new(public_key, private_key, @oauth_options || {})
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/log/.gitkeep
ADDED
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
+
require 'mollom_rest_api/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "mollom_rest_api"
|
|
7
|
+
spec.version = MollomRestApi::VERSION
|
|
8
|
+
spec.authors = ["Jean-Sébastien Roy", "Krystian Czesak"]
|
|
9
|
+
spec.email = ["mollom.gem@gmail.com"]
|
|
10
|
+
spec.description = %q{A ruby wrapper for the Mollom Rest API.}
|
|
11
|
+
spec.summary = %q{A ruby wrapper for the Mollom Rest API.}
|
|
12
|
+
spec.homepage = ""
|
|
13
|
+
spec.license = ""
|
|
14
|
+
|
|
15
|
+
spec.files = `git ls-files`.split($/)
|
|
16
|
+
spec.test_files = spec.files.grep(%r{^(spec|features)/})
|
|
17
|
+
spec.require_paths = ["lib"]
|
|
18
|
+
|
|
19
|
+
spec.add_dependency 'oauth'
|
|
20
|
+
spec.add_dependency 'activesupport'
|
|
21
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
http_interactions:
|
|
3
|
+
- request:
|
|
4
|
+
method: post
|
|
5
|
+
uri: http://dev.mollom.com/v1/blacklist/1lgj17lzuezlu1bn9ry4k3qz4k8nr42n
|
|
6
|
+
body:
|
|
7
|
+
encoding: US-ASCII
|
|
8
|
+
string: context=allFields&value=text
|
|
9
|
+
headers:
|
|
10
|
+
Accept:
|
|
11
|
+
- application/json
|
|
12
|
+
User-Agent:
|
|
13
|
+
- OAuth gem v0.4.7
|
|
14
|
+
Content-Length:
|
|
15
|
+
- '0'
|
|
16
|
+
Content-Type:
|
|
17
|
+
- application/x-www-form-urlencoded
|
|
18
|
+
Authorization:
|
|
19
|
+
- OAuth oauth_consumer_key="b06465615b3a8800ef79ca947b1addca", oauth_nonce="CP19Jf3MxtPxat0k5E4CARZ6PQJIZ8wsLkikBtbk",
|
|
20
|
+
oauth_signature="B0Cp%2FbPpz9ZaniKQ0Cbx5Z5WIuw%3D", oauth_signature_method="HMAC-SHA1",
|
|
21
|
+
oauth_timestamp="1409677740", oauth_version="1.0"
|
|
22
|
+
response:
|
|
23
|
+
status:
|
|
24
|
+
code: 200
|
|
25
|
+
message: OK
|
|
26
|
+
headers:
|
|
27
|
+
X-Powered-By:
|
|
28
|
+
- Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Oracle
|
|
29
|
+
Corporation/1.7)
|
|
30
|
+
Server:
|
|
31
|
+
- GlassFish Server Open Source Edition 3.1.2.2
|
|
32
|
+
Content-Type:
|
|
33
|
+
- application/json
|
|
34
|
+
Date:
|
|
35
|
+
- Tue, 02 Sep 2014 17:09:45 GMT
|
|
36
|
+
Connection:
|
|
37
|
+
- close
|
|
38
|
+
body:
|
|
39
|
+
encoding: US-ASCII
|
|
40
|
+
string: ! '{"code":"200","entry":{"context":"allFields","created":"1409677772829","id":"41a0e033-3d6a-465b-87d5-1ef60476da62","match":"contains","note":"","reason":"unwanted","status":"1","value":"text"}}'
|
|
41
|
+
http_version:
|
|
42
|
+
recorded_at: Tue, 02 Sep 2014 17:09:00 GMT
|
|
43
|
+
recorded_with: VCR 2.9.2
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
http_interactions:
|
|
3
|
+
- request:
|
|
4
|
+
method: post
|
|
5
|
+
uri: http://dev.mollom.com/v1/blacklist/1lgj17lzuezlu1bn9ry4k3qz4k8nr42n/42a51362-bab6-4256-8e28-60d5df568250/delete
|
|
6
|
+
body:
|
|
7
|
+
encoding: US-ASCII
|
|
8
|
+
string: ''
|
|
9
|
+
headers:
|
|
10
|
+
Accept:
|
|
11
|
+
- application/json
|
|
12
|
+
User-Agent:
|
|
13
|
+
- OAuth gem v0.4.7
|
|
14
|
+
Content-Length:
|
|
15
|
+
- '0'
|
|
16
|
+
Content-Type:
|
|
17
|
+
- application/x-www-form-urlencoded
|
|
18
|
+
Authorization:
|
|
19
|
+
- OAuth oauth_consumer_key="b06465615b3a8800ef79ca947b1addca", oauth_nonce="YRrT2k8Ld5HxTavGNav7MvTFo5se6fUC9syL2UvwPUM",
|
|
20
|
+
oauth_signature="v%2BCn79%2F6kiO6FTnGDklgaygcA8M%3D", oauth_signature_method="HMAC-SHA1",
|
|
21
|
+
oauth_timestamp="1410368605", oauth_version="1.0"
|
|
22
|
+
response:
|
|
23
|
+
status:
|
|
24
|
+
code: 200
|
|
25
|
+
message: OK
|
|
26
|
+
headers:
|
|
27
|
+
X-Powered-By:
|
|
28
|
+
- Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Oracle
|
|
29
|
+
Corporation/1.7)
|
|
30
|
+
Server:
|
|
31
|
+
- GlassFish Server Open Source Edition 3.1.2.2
|
|
32
|
+
Content-Type:
|
|
33
|
+
- application/json
|
|
34
|
+
Date:
|
|
35
|
+
- Wed, 10 Sep 2014 17:04:16 GMT
|
|
36
|
+
Connection:
|
|
37
|
+
- close
|
|
38
|
+
body:
|
|
39
|
+
encoding: US-ASCII
|
|
40
|
+
string: ! '{"code":"200"}'
|
|
41
|
+
http_version:
|
|
42
|
+
recorded_at: Wed, 10 Sep 2014 17:03:25 GMT
|
|
43
|
+
recorded_with: VCR 2.9.2
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
http_interactions:
|
|
3
|
+
- request:
|
|
4
|
+
method: get
|
|
5
|
+
uri: http://dev.mollom.com/v1/blacklist/1lgj17lzuezlu1bn9ry4k3qz4k8nr42n?count=5
|
|
6
|
+
body:
|
|
7
|
+
encoding: US-ASCII
|
|
8
|
+
string: ''
|
|
9
|
+
headers:
|
|
10
|
+
Accept:
|
|
11
|
+
- application/json
|
|
12
|
+
User-Agent:
|
|
13
|
+
- OAuth gem v0.4.7
|
|
14
|
+
Authorization:
|
|
15
|
+
- OAuth oauth_consumer_key="b06465615b3a8800ef79ca947b1addca", oauth_nonce="bxGeBFEd7ZBEwW7C9zHKPgIAs0dJ1thMdBUSpuoco4",
|
|
16
|
+
oauth_signature="UiA35v%2FZIgyxCD2L1i%2B5MG7VxsE%3D", oauth_signature_method="HMAC-SHA1",
|
|
17
|
+
oauth_timestamp="1410374054", oauth_version="1.0"
|
|
18
|
+
response:
|
|
19
|
+
status:
|
|
20
|
+
code: 200
|
|
21
|
+
message: OK
|
|
22
|
+
headers:
|
|
23
|
+
X-Powered-By:
|
|
24
|
+
- Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Oracle
|
|
25
|
+
Corporation/1.7)
|
|
26
|
+
Server:
|
|
27
|
+
- GlassFish Server Open Source Edition 3.1.2.2
|
|
28
|
+
Content-Type:
|
|
29
|
+
- application/json
|
|
30
|
+
Date:
|
|
31
|
+
- Wed, 10 Sep 2014 18:35:04 GMT
|
|
32
|
+
Connection:
|
|
33
|
+
- close
|
|
34
|
+
body:
|
|
35
|
+
encoding: US-ASCII
|
|
36
|
+
string: ! '{"code":"200","list":{"entry":[{"context":"allFields","created":"1410369319158","id":"eafc878d-94f7-462d-bb67-49d5170a9a71","match":"contains","note":"","reason":"unwanted","status":"1","value":"patate-chaude"},{"context":"allFields","created":"1410369319342","id":"975805c8-ee06-4750-8cda-ec5626712c50","match":"contains","note":"","reason":"unwanted","status":"1","value":"system_32"}]},"listOffset":"0","listCount":"2","listTotal":"2"}'
|
|
37
|
+
http_version:
|
|
38
|
+
recorded_at: Wed, 10 Sep 2014 18:34:14 GMT
|
|
39
|
+
recorded_with: VCR 2.9.2
|