pdm 0.0.1 → 0.0.2

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/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