xmlrpc_controller 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f70cdf8556554e04b96160d5bbaa2258d937e3e6
4
+ data.tar.gz: d5ebf702bfe7330d4e7a9fb8423ea6107f8ca39b
5
+ SHA512:
6
+ metadata.gz: 1543976a26c3d950331b81fc603e332cb791f7ad5b55bcae4b32eab9b344afaa0a97016cb9f166fef23a20382bc445b917cd7fe7588015fe45ae1aadff3bc089
7
+ data.tar.gz: 16c11385de36597aa18557df4c85ec76c0b17c9c6ebc3811870b3ba488c5df7a3c341e87e59b2d2a748d53ef974e8a360555efcf16d043a5e8e3cc9da69628c9
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xmlrpc_controller.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Nam Chu Hoai
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # XmlrpcController
2
+
3
+ Small gem to accept XMLRPC calls in your controller, written for providing Webhooks as a IFTTT trigger by pretending to be a Wordpress blog. Entirely inspired from [femto113/node-ifttt-webhook](https://github.com/femto113/node-ifttt-webhook) which is entirely inspired from [captn3m0/ifttt-webhook](https://github.com/captn3m0/ifttt-webhook)
4
+
5
+ ## How to use
6
+
7
+ ### For ITTT
8
+
9
+ ````
10
+ class RpcController < ApplicationController
11
+ include XmlrpcController
12
+ # you want to be selective with this
13
+ skip_before_filter :verify_authenticity_token
14
+
15
+ before_filter :ifttt_webhook_defaults
16
+
17
+ # override when needed, by default it will POST a request to the url as specified in the tags, body is the payload
18
+ def ifttt_new_post(title, body, categories, tags)
19
+ end
20
+
21
+ end
22
+
23
+ ````
24
+
25
+ ### Other Uses
26
+
27
+ The module will call try to call the method defined on the controller as specified in the RPC call with a Nokogiri Object as the argument.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ module XmlrpcController
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,64 @@
1
+ require "xmlrpc_controller/version"
2
+
3
+ module XmlrpcController
4
+
5
+ # the main method handling the RPC request. It parses the method name, and passes the Nokogiri XML node that represents the params
6
+ # @@xmlrpc_method_name_map contains a map to resolve for non-ruby method names (with a . for example)
7
+ def rpc
8
+ parsed_request = Nokogiri::XML.parse(request.body.read)
9
+ method_name = parsed_request.xpath('methodCall/methodName').text
10
+ method_params = parsed_request.xpath('methodCall/params')
11
+ method_name = @@xmlrpc_method_name_map[method_name] || method_name
12
+ self.send(method_name, method_params)
13
+ end
14
+
15
+ # default handling methods for IFTTT to make a simple Webhook bridge
16
+ def ifttt_defaults
17
+ @@xmlrpc_method_name_map ||= {}
18
+ @@xmlrpc_method_name_map.merge!({
19
+ "metaWeblog.getRecentPosts" => :metaWeblog_getRecentPosts,
20
+ "mt.supportedMethods" => :mt_supportedMethods,
21
+ "metaWeblog.newPost" => :metaWeblog_newPost,
22
+ "metaWeblog.getCategories" => :metaWeblog_getCategories,
23
+ "wp.newCategory" => :wp_newCategory
24
+ })
25
+ end
26
+
27
+ # actual method doing the webhook request
28
+ def ifttt_new_post(title, body, categories, tags)
29
+ # default protocol to respond to a new post is to POST a request to the url as specified in the tags, body is the payload
30
+ HTTParty.post(tags.first, body: body)
31
+ end
32
+
33
+ # convenience method to send back a xmlrpc response
34
+ def rpc_response(value)
35
+ render inline: "xml.instruct! :xml, :version=>'1.0' \n xml.methodResponse { xml.params { xml.param { #{value} }}}", type: :builder, content_type: "text/xml"
36
+ end
37
+
38
+ # utility methods to make IFTTT believe we are a wordpress blog
39
+ def mt_supportedMethods(*args)
40
+ rpc_response("xml.value { xml.array {xml.data { xml.value { xml.string 'metaWeblog.getRecentPosts' } \n xml.value { xml.string 'metaWeblog.newPost' } }}} ")
41
+ end
42
+
43
+ def metaWeblog_getRecentPosts(*args)
44
+ rpc_response("xml.value { xml.array { xml.data }}")
45
+ end
46
+
47
+ def metaWeblog_newPost(args)
48
+ new_post_params = Hash.from_xml(args.children[3].to_s)['param']['value']['struct']['member']
49
+ title = new_post_params[0]['value']['string']
50
+ body = new_post_params[1]['value']['string']
51
+ categories = (new_post_params[2]['value']['array']['data']['value'].class == Array ? new_post_params[2]['value']['array']['data']['value'].map { |e| e['string'] } : [new_post_params[2]['value']['array']['data']['value']['string']] )
52
+ tags = (new_post_params[3]['value']['array']['data']['value'].class == Array ? new_post_params[3]['value']['array']['data']['value'].map { |e| e['string'] } : [new_post_params[3]['value']['array']['data']['value']['string']] )
53
+ ifttt_new_post(title, body, categories, tags)
54
+ rpc_response("xml.value 'nothing'")
55
+ end
56
+
57
+ def metaWeblog_getCategories(args)
58
+ rpc_response("xml.value { xml.array { xml.data }}")
59
+ end
60
+
61
+ def wp_newCategory(args)
62
+ rpc_response("xml.value { xml.array { xml.data }}")
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xmlrpc_controller/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "xmlrpc_controller"
8
+ spec.version = XmlrpcController::VERSION
9
+ spec.authors = ["Nam Chu Hoai"]
10
+ spec.email = ["nambrot@googlemail.com"]
11
+ spec.summary = "Include XMLRPC into any Controller"
12
+ spec.description = "Utility methods to work with XMLRPC"
13
+ spec.homepage = "https://github.com/nambrot/xmlrpc_controller"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xmlrpc_controller
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nam Chu Hoai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Utility methods to work with XMLRPC
42
+ email:
43
+ - nambrot@googlemail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lib/xmlrpc_controller.rb
54
+ - lib/xmlrpc_controller/version.rb
55
+ - xmlrpc_controller.gemspec
56
+ homepage: https://github.com/nambrot/xmlrpc_controller
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.2.2
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Include XMLRPC into any Controller
80
+ test_files: []