pdm 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/pdm.rb CHANGED
@@ -4,7 +4,7 @@ module Pdm
4
4
 
5
5
  def default_options
6
6
  {
7
- :url => "http://api.pipedevmail.com/jobs",
7
+ :endpoint => "http://api.pipedevmail.com",
8
8
  }
9
9
  end
10
10
  module_function :default_options
@@ -0,0 +1,63 @@
1
+ module Pdm
2
+
3
+ class ApiRequest
4
+
5
+ require "cgi"
6
+ require "uri"
7
+ require "net/http/post/multipart"
8
+ require "pdm/json"
9
+
10
+
11
+ attr_accessor :endpoint, :api_key
12
+
13
+ def initialize(endpoint, api_key)
14
+ self.endpoint = endpoint
15
+ self.api_key = api_key
16
+ end
17
+
18
+
19
+ def decorate_params(params)
20
+ params = params.dup
21
+ params["api_key"] = self.api_key
22
+ params
23
+ end
24
+
25
+ def uri_from_path(path)
26
+ URI.join(self.endpoint, path.to_s)
27
+ end
28
+
29
+ def make_query_string(path, params)
30
+ params = params.collect { |k,v| "#{k}=#{CGI.escape(v.to_s)}" }
31
+ params = params.join("&")
32
+ [path, params].join("?")
33
+ end
34
+
35
+ def request(path, params = {})
36
+ uri = uri_from_path(path)
37
+ params = decorate_params(params)
38
+ Net::HTTP.start(uri.host, uri.port) do |http|
39
+ req = yield(uri, params)
40
+ http.request(req)
41
+ end
42
+ end
43
+
44
+ def get(path, params = {})
45
+ request(path, params) do |uri, params|
46
+ query_string = make_query_string(uri.path, params)
47
+ Net::HTTP::Get.new(query_string)
48
+ end
49
+ end
50
+
51
+ def multipart_post(path, params)
52
+ request(path, params) do |uri, params|
53
+ Net::HTTP::Post::Multipart.new(uri.path, params)
54
+ end
55
+ end
56
+
57
+ def multipart_put(path, params)
58
+ request(path, params) do |uri, params|
59
+ Net::HTTP::Put::Multipart.new(uri.path, params)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,9 @@
1
+ require "mail/message"
2
+
3
+ module Mail
4
+ class Message
5
+
6
+ attr_accessor :template_html
7
+ attr_accessor :template_assigns
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module Pdm
2
+
3
+ require "pdm/api_request"
4
+
5
+ module History
6
+
7
+ class << self
8
+
9
+ def recent_jobs(options = {})
10
+ options = Pdm.default_options.merge(options)
11
+ api_request = Pdm::ApiRequest.new(options[:endpoint], options[:api_key])
12
+ res = api_request.get(:recent_jobs)
13
+ Pdm::Json.decode(res.body)
14
+ end
15
+ end
16
+ end
17
+ end
data/lib/pdm/json.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Pdm
2
+
3
+ module Json
4
+
5
+ require "yajl" # For now.
6
+
7
+ class << self
8
+
9
+ def encode(what)
10
+ Yajl::Encoder.encode(what)
11
+ end
12
+
13
+ def decode(what)
14
+ Yajl::Parser.parse(what)
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/pdm/mail.rb CHANGED
@@ -1,35 +1,17 @@
1
1
  module Pdm
2
+
3
+ require "pdm/resource"
2
4
 
3
- class Mail
5
+ class Mail < Pdm::Resource
4
6
 
5
- require "uri"
6
- require "net/http/post/multipart"
7
- require "pdm/error"
8
-
9
- attr_accessor :guid, :mail, :options
7
+ attr_accessor :guid, :mail
10
8
 
11
9
  def initialize(mail, options = {})
12
10
  self.mail = mail
13
- self.options = Pdm.default_options.merge(options)
14
- check_opts
15
- end
16
-
17
- def check_opts
18
- required_opt_proc = lambda do |value|
19
- !(value.nil? || value.empty?)
20
- end
21
-
22
- [
23
- [:url, required_opt_proc],
24
- [:api_key, required_opt_proc],
25
- ].each do |key, proc|
26
- raise ArgumentError.new(":api_key is a required option") unless
27
- proc.call(options[key])
28
- end
29
- rescue => e
30
- Error.extend_and_raise(e)
11
+ super(options)
31
12
  end
32
13
 
14
+
33
15
  def get_body_parts(mail)
34
16
  parts = mail.body.parts
35
17
  plain_part = parts.detect { |p| p.content_type == "text/plain" }
@@ -42,30 +24,46 @@ module Pdm
42
24
  [plain_part, html_part]
43
25
  end
44
26
 
45
- def build_params(mail)
46
- plain_part, html_part = get_body_parts(mail)
27
+ def basic_params(mail)
47
28
  {
48
29
  "job[from]" => mail.from.first,
49
30
  "job[reply_to]" => mail.reply_to,
50
31
  "job[subject]" => mail.subject,
32
+ "job[recipients][][email]" => mail.to.first,
33
+ }
34
+ end
35
+
36
+ def body_params(mail)
37
+ plain_part, html_part = get_body_parts(mail)
38
+ {
51
39
  "job[plain]" => plain_part,
52
40
  "job[html]" => html_part,
53
- "job[recipients][][email]" => mail.to.first,
54
- :api_key => options[:api_key],
55
41
  }
56
42
  end
57
43
 
58
- def create_and_send_job(url, params)
59
- url = URI.parse(url)
60
- req = Net::HTTP::Post::Multipart.new(url.path, params)
61
- Net::HTTP.start(url.host, url.port) do |http|
62
- http.request(req)
44
+ def template_params(mail)
45
+ return {} if mail.template_html.nil?
46
+ {
47
+ "job[template_html]" => mail.template_html,
48
+ "job[template_assigns]" => mail.template_assigns,
49
+ }
50
+ end
51
+
52
+ def create_and_send_job_params(mail)
53
+ params = basic_params(mail)
54
+ params.merge!(body_params(mail))
55
+ params.merge!(template_params(mail))
56
+ end
57
+
58
+ def create_and_send_job(mail)
59
+ params = create_and_send_job_params(mail)
60
+ with_exceptions do
61
+ api_request.multipart_post(:jobs, params)
63
62
  end
64
63
  end
65
64
 
66
65
  def deliver
67
- params = build_params(mail)
68
- res = create_and_send_job(options[:url], params)
66
+ res = create_and_send_job(mail)
69
67
 
70
68
  case res
71
69
  when Net::HTTPSuccess
@@ -73,8 +71,6 @@ module Pdm
73
71
  end
74
72
 
75
73
  return res
76
- rescue Timeout::Error, StandardError => e
77
- Error.extend_and_raise(e)
78
74
  end
79
75
  end
80
76
  end
@@ -0,0 +1,39 @@
1
+ module Pdm
2
+
3
+ class Resource
4
+
5
+ require "pdm/api_request"
6
+ require "pdm/error"
7
+
8
+ attr_accessor :options
9
+
10
+ def initialize(options = {})
11
+ self.options = Pdm.default_options.merge(options)
12
+ check_opts
13
+ end
14
+
15
+ def with_exceptions
16
+ yield
17
+ rescue Timeout::Error, StandardError => e
18
+ Error.extend_and_raise(e)
19
+ end
20
+
21
+ def check_opts
22
+ required_opt_proc = lambda do |value|
23
+ !(value.nil? || value.empty?)
24
+ end
25
+
26
+ [
27
+ [:endpoint, required_opt_proc],
28
+ [:api_key, required_opt_proc],
29
+ ].each do |key, proc|
30
+ raise ArgumentError.new(":api_key is a required option") unless
31
+ proc.call(options[key])
32
+ end
33
+ end
34
+
35
+ def api_request
36
+ Pdm::ApiRequest.new(options[:endpoint], options[:api_key])
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,72 @@
1
+ module Pdm
2
+
3
+ require "pdm/resource"
4
+
5
+ class Template < Pdm::Resource
6
+
7
+ class << self
8
+
9
+ def exists?(name)
10
+ Template.new(name).exists?
11
+ end
12
+ end
13
+
14
+
15
+ attr_accessor :name, :description, :html
16
+
17
+ def initialize(name, description = nil, html = nil, options = {})
18
+ self.name = name
19
+ self.description = description
20
+ self.html = html
21
+ super(options)
22
+ end
23
+
24
+
25
+ def show_params
26
+ {
27
+ "template[name]" => self.name,
28
+ }
29
+ end
30
+
31
+ def show
32
+ params = show_params
33
+ with_exceptions do
34
+ api_request.get(:templates, params)
35
+ end
36
+ end
37
+
38
+ def exists?
39
+ params = show_params
40
+ res = with_exceptions do
41
+ api_request.get(:templates, params)
42
+ end
43
+ res.is_a?(Net::HTTPSuccess)
44
+ end
45
+
46
+ def create_params
47
+ {
48
+ "template[name]" => self.name,
49
+ "template[description]" => self.description,
50
+ "template[html]" => self.html,
51
+ }
52
+ end
53
+
54
+ def create
55
+ params = create_params
56
+ with_exceptions do
57
+ api_request.multipart_post(:templates, params)
58
+ end
59
+ end
60
+
61
+ # FIXME: I guess we could be clever here - e.g. no need to repost
62
+ # the HTML if only the name is changing.
63
+ alias :update_params :create_params
64
+
65
+ def update
66
+ params = update_params
67
+ with_exceptions do
68
+ api_request.multipart_put(:templates, params)
69
+ end
70
+ end
71
+ end
72
+ end
data/lib/pdm/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Pdm
2
2
 
3
3
  def version
4
- "0.0.1"
4
+ "0.0.2"
5
5
  end
6
6
  module_function :version
7
7
  end
data/pdm.gemspec CHANGED
@@ -17,5 +17,6 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_development_dependency("rake")
19
19
  gem.add_runtime_dependency("mail")
20
+ gem.add_runtime_dependency("yajl-ruby")
20
21
  gem.add_runtime_dependency("multipart-post")
21
22
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdm
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - PipeDevMail
@@ -15,11 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-18 00:00:00 +02:00
18
+ date: 2011-11-20 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :development
23
22
  requirement: &id001 !ruby/object:Gem::Requirement
24
23
  none: false
25
24
  requirements:
@@ -29,11 +28,11 @@ dependencies:
29
28
  segments:
30
29
  - 0
31
30
  version: "0"
32
- name: rake
33
31
  version_requirements: *id001
32
+ name: rake
33
+ type: :development
34
34
  prerelease: false
35
35
  - !ruby/object:Gem::Dependency
36
- type: :runtime
37
36
  requirement: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
39
38
  requirements:
@@ -43,11 +42,11 @@ dependencies:
43
42
  segments:
44
43
  - 0
45
44
  version: "0"
46
- name: mail
47
45
  version_requirements: *id002
46
+ name: mail
47
+ type: :runtime
48
48
  prerelease: false
49
49
  - !ruby/object:Gem::Dependency
50
- type: :runtime
51
50
  requirement: &id003 !ruby/object:Gem::Requirement
52
51
  none: false
53
52
  requirements:
@@ -57,8 +56,23 @@ dependencies:
57
56
  segments:
58
57
  - 0
59
58
  version: "0"
60
- name: multipart-post
61
59
  version_requirements: *id003
60
+ name: yajl-ruby
61
+ type: :runtime
62
+ prerelease: false
63
+ - !ruby/object:Gem::Dependency
64
+ requirement: &id004 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ version_requirements: *id004
74
+ name: multipart-post
75
+ type: :runtime
62
76
  prerelease: false
63
77
  description: Wrapper around the PipeDevMail.com API
64
78
  email:
@@ -74,9 +88,14 @@ files:
74
88
  - Gemfile
75
89
  - Rakefile
76
90
  - lib/pdm.rb
91
+ - lib/pdm/api_request.rb
77
92
  - lib/pdm/error.rb
93
+ - lib/pdm/ext/mail/message.rb
94
+ - lib/pdm/history.rb
95
+ - lib/pdm/json.rb
78
96
  - lib/pdm/mail.rb
79
- - lib/pdm/recent_jobs.rb
97
+ - lib/pdm/resource.rb
98
+ - lib/pdm/template.rb
80
99
  - lib/pdm/version.rb
81
100
  - pdm.gemspec
82
101
  has_rdoc: true
@@ -1,60 +0,0 @@
1
- module Pdm
2
-
3
- class RecentJobs
4
-
5
- require "uri"
6
- require "net/http"
7
- require "pdm/error"
8
-
9
- attr_accessor :response, :options
10
-
11
- def initialize(options = {})
12
- self.options = Pdm.default_options.merge(options)
13
- check_opts
14
- end
15
-
16
- def check_opts
17
- required_opt_proc = lambda do |value|
18
- !(value.nil? || value.empty?)
19
- end
20
-
21
- [
22
- [:url, required_opt_proc],
23
- [:api_key, required_opt_proc],
24
- ].each do |key, proc|
25
- raise ArgumentError.new(":api_key is a required option") unless
26
- proc.call(options[key])
27
- end
28
- rescue => e
29
- Error.extend_and_raise(e)
30
- end
31
-
32
- def build_params
33
- {
34
- :api_key => options[:api_key],
35
- }
36
- end
37
-
38
- def make_api_request(url, params)
39
- uri = URI.parse(url)
40
- req = Net::HTTP::Get.new(url.path, params)
41
- Net::HTTP.start(url.host, url.port) do |http|
42
- http.request(req)
43
- end
44
- end
45
-
46
- def fetch
47
- params = build_params
48
- res = make_api_request(options[:url], params)
49
-
50
- case res
51
- when Net::HTTPSuccess
52
- return self.response = res.body
53
- else
54
- raise RuntimeError.new("Unexpected server response: #{res.inspect}")
55
- end
56
- rescue Timeout::Error, StandardError => e
57
- Error.extend_and_raise(e)
58
- end
59
- end
60
- end