gmail-api-ruby 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 +7 -0
- data/.gitignore +34 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +218 -0
- data/Rakefile +35 -0
- data/TODO.md +4 -0
- data/gmail.gemspec +35 -0
- data/lib/gmail.rb +112 -0
- data/lib/gmail/api_resource.rb +13 -0
- data/lib/gmail/base/create.rb +16 -0
- data/lib/gmail/base/delete.rb +27 -0
- data/lib/gmail/base/get.rb +17 -0
- data/lib/gmail/base/list.rb +50 -0
- data/lib/gmail/base/modify.rb +66 -0
- data/lib/gmail/base/trash.rb +33 -0
- data/lib/gmail/base/update.rb +26 -0
- data/lib/gmail/draft.rb +49 -0
- data/lib/gmail/gmail_object.rb +138 -0
- data/lib/gmail/label.rb +52 -0
- data/lib/gmail/message.rb +189 -0
- data/lib/gmail/thread.rb +32 -0
- data/lib/gmail/util.rb +45 -0
- data/lib/gmail/version.rb +3 -0
- metadata +196 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Create
|
4
|
+
module ClassMethods
|
5
|
+
def create(body, opts={})
|
6
|
+
response = Gmail.request(base_method.send("create"), {}, body)
|
7
|
+
Util.convert_to_gmail_object(response, class_name.downcase)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Delete
|
4
|
+
def delete(opts={})
|
5
|
+
response = Gmail.request(self.class.base_method.send("delete"),{id: id})
|
6
|
+
if response == ""
|
7
|
+
p "Success"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def delete(id, opts={})
|
13
|
+
response = Gmail.request(base_method.send("delete"),{id: id})
|
14
|
+
if response == ""
|
15
|
+
p "Success"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.included(base)
|
21
|
+
base.extend(ClassMethods)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Get
|
4
|
+
module ClassMethods
|
5
|
+
def get(id)
|
6
|
+
response = Gmail.request(base_method.send("get"), {id: id})
|
7
|
+
Util.convert_to_gmail_object(response, class_name.downcase)
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module List
|
4
|
+
module ClassMethods
|
5
|
+
def all(filters={}, opts={})
|
6
|
+
max_results = filters[:maxResults] || 100
|
7
|
+
opts[:items] ||= []
|
8
|
+
|
9
|
+
if max_results == -1
|
10
|
+
filters.merge!({maxResults: 100})
|
11
|
+
end
|
12
|
+
response = Gmail.request(base_method.send("list"), filters)
|
13
|
+
items = response["#{class_name.downcase}s".to_sym]
|
14
|
+
next_page_token = response[:nextPageToken]
|
15
|
+
opts[:items] = opts[:items] + items
|
16
|
+
|
17
|
+
if items.count < 100 || max_results == items.count
|
18
|
+
Util.convert_to_gmail_object(opts[:items], class_name.downcase)
|
19
|
+
else
|
20
|
+
max_results = (max_results == -1)?-1:max_results-items.count
|
21
|
+
all(filters.merge({maxResults: max_results, pageToken: next_page_token}), opts)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def search(q={})
|
26
|
+
if q.is_a? String
|
27
|
+
all({q: q})
|
28
|
+
else
|
29
|
+
query = ""
|
30
|
+
[:from, :to, :subject].each do |prop|
|
31
|
+
query += "#{prop.to_s}:(#{q[prop].downcase}) " unless q[prop].nil?
|
32
|
+
end
|
33
|
+
[:in, :before, :after].each do |prop|
|
34
|
+
query += "#{prop.to_s}:#{q[prop]} " unless q[prop].nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
query += "#{q[:has_words]} " unless q[:has_words].nil?
|
38
|
+
query += "-{#{q[:has_not_words]}}" unless q[:has_not_words].nil?
|
39
|
+
p "searching with this string #{query}"
|
40
|
+
all(q: query)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.included(base)
|
46
|
+
base.extend(ClassMethods)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Modify
|
4
|
+
def modify!(addLabelIds=[], removeLabelIds=[])
|
5
|
+
response = Gmail.request(self.class.base_method.send("modify"),{id: id}, {addLabelIds: addLabelIds, removeLabelIds: removeLabelIds})
|
6
|
+
d = Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
7
|
+
@values = d.values
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def modify(addLabelIds=[], removeLabelIds=[])
|
12
|
+
response = Gmail.request(self.class.base_method.send("modify"),{id: id}, {addLabelIds: addLabelIds, removeLabelIds: removeLabelIds})
|
13
|
+
d = Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
14
|
+
end
|
15
|
+
|
16
|
+
def archive
|
17
|
+
modify([], ["INBOX"])
|
18
|
+
end
|
19
|
+
|
20
|
+
def archive!
|
21
|
+
modify!([], ["INBOX"])
|
22
|
+
end
|
23
|
+
|
24
|
+
def unarchive
|
25
|
+
modify(["INBOX"], [] )
|
26
|
+
end
|
27
|
+
|
28
|
+
def unarchive!
|
29
|
+
modify!(["INBOX"], [] )
|
30
|
+
end
|
31
|
+
|
32
|
+
def star
|
33
|
+
modify(["STARRED"], [] )
|
34
|
+
end
|
35
|
+
|
36
|
+
def star!
|
37
|
+
modify!(["STARRED"], [] )
|
38
|
+
end
|
39
|
+
|
40
|
+
def unstar
|
41
|
+
modify([],["STARRED"] )
|
42
|
+
end
|
43
|
+
|
44
|
+
def unstar!
|
45
|
+
modify!([],["STARRED"] )
|
46
|
+
end
|
47
|
+
|
48
|
+
def mark_as_read
|
49
|
+
modify([],["UNREAD"] )
|
50
|
+
end
|
51
|
+
|
52
|
+
def mark_as_read!
|
53
|
+
modify!([],["UNREAD"] )
|
54
|
+
end
|
55
|
+
|
56
|
+
def mark_as_unread
|
57
|
+
modify(["UNREAD"],[] )
|
58
|
+
end
|
59
|
+
|
60
|
+
def mark_as_unread!
|
61
|
+
modify!(["UNREAD"],[] )
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Trash
|
4
|
+
def trash(opts={})
|
5
|
+
response = Gmail.request(self.class.base_method.send("trash"),{id: id})
|
6
|
+
Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
7
|
+
end
|
8
|
+
|
9
|
+
def untrash(opts={})
|
10
|
+
response = Gmail.request(self.class.base_method.send("untrash"),{id: id})
|
11
|
+
Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def trash(id, opts={})
|
16
|
+
response = Gmail.request(base_method.send("trash"),{id: id})
|
17
|
+
Util.convert_to_gmail_object(response, class_name.downcase)
|
18
|
+
end
|
19
|
+
|
20
|
+
def untrash(id, opts={})
|
21
|
+
response = Gmail.request(base_method.send("untrash"),{id: id})
|
22
|
+
Util.convert_to_gmail_object(response, class_name.downcase)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(base)
|
27
|
+
base.extend(ClassMethods)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gmail
|
2
|
+
module Base
|
3
|
+
module Update
|
4
|
+
def update!(body)
|
5
|
+
if id.nil?
|
6
|
+
d = self.class.create(body)
|
7
|
+
else
|
8
|
+
response = Gmail.request(self.class.base_method.send("update"),{id: id}, body)
|
9
|
+
d = Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
10
|
+
end
|
11
|
+
@values = d.values
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def update(body)
|
16
|
+
if id.nil?
|
17
|
+
d = self.class.create(body)
|
18
|
+
else
|
19
|
+
response = Gmail.request(self.class.base_method.send("update"),{id: id}, body)
|
20
|
+
d = Util.convert_to_gmail_object(response, self.class.class_name.downcase)
|
21
|
+
end
|
22
|
+
d
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gmail/draft.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module Gmail
|
2
|
+
class Draft < APIResource
|
3
|
+
include Gmail::Base::List
|
4
|
+
include Gmail::Base::Create
|
5
|
+
include Gmail::Base::Delete
|
6
|
+
include Gmail::Base::Get
|
7
|
+
include Gmail::Base::Update
|
8
|
+
|
9
|
+
def message
|
10
|
+
if @values.message.is_a?(Gmail::Message)
|
11
|
+
@values.message
|
12
|
+
else
|
13
|
+
@values.message = Util.convert_to_gmail_object(to_hash["message"], key="message").detailed
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def save(opts={})
|
18
|
+
msg = {raw: message.raw}
|
19
|
+
if message.threadId
|
20
|
+
msg[:threadId] = message.threadId
|
21
|
+
end
|
22
|
+
if message.labelIds
|
23
|
+
msg[:labelIds] = message.labelIds
|
24
|
+
end
|
25
|
+
body = {message: msg}
|
26
|
+
update(body)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save!(opts={})
|
30
|
+
msg = {raw: message.raw}
|
31
|
+
if message.threadId
|
32
|
+
msg[:threadId] = message.threadId
|
33
|
+
end
|
34
|
+
if message.labelIds
|
35
|
+
msg[:labelIds] = message.labelIds
|
36
|
+
end
|
37
|
+
body = {message: msg}
|
38
|
+
update!(body)
|
39
|
+
end
|
40
|
+
|
41
|
+
def deliver
|
42
|
+
response = Gmail.request(self.class.base_method.to_h['gmail.users.drafts.send'],{},{id: id})
|
43
|
+
Gmail::Message.get(response[:id])
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Gmail
|
2
|
+
class GmailObject
|
3
|
+
include Enumerable
|
4
|
+
include Hooks
|
5
|
+
define_hooks :after_initialize
|
6
|
+
|
7
|
+
# The default :id method is deprecated and isn't useful to us
|
8
|
+
if method_defined?(:id)
|
9
|
+
undef :id
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(hash={})
|
13
|
+
@values = Hashie::Mash.new hash
|
14
|
+
run_hook :after_initialize
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def to_s(*args)
|
19
|
+
JSON.pretty_generate(@values.to_hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
def inspect
|
23
|
+
"#<#{self.class}:0x#{self.object_id.to_s(16)}> " + to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def [](k)
|
27
|
+
@values[k.to_sym]
|
28
|
+
end
|
29
|
+
|
30
|
+
def []=(k, v)
|
31
|
+
@values.send("#{k}=", v)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_json(*a)
|
35
|
+
JSON.generate(@values)
|
36
|
+
end
|
37
|
+
|
38
|
+
def as_json(*a)
|
39
|
+
@values.as_json(*a)
|
40
|
+
end
|
41
|
+
|
42
|
+
def detailed
|
43
|
+
self.class.get(id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def detailed!
|
47
|
+
@values = self.class.get(id).values
|
48
|
+
self
|
49
|
+
end
|
50
|
+
#
|
51
|
+
def to_hash
|
52
|
+
@values.to_hash
|
53
|
+
end
|
54
|
+
|
55
|
+
def values
|
56
|
+
@values
|
57
|
+
end
|
58
|
+
#
|
59
|
+
# def each(&blk)
|
60
|
+
# @values.each(&blk)
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# def _dump(level)
|
64
|
+
# Marshal.dump([@values, @api_key])
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def self._load(args)
|
68
|
+
# values, api_key = Marshal.load(args)
|
69
|
+
# construct_from(values)
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# if RUBY_VERSION < '1.9.2'
|
73
|
+
# def respond_to?(symbol)
|
74
|
+
# @values.has_key?(symbol) || super
|
75
|
+
# end
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
protected
|
79
|
+
|
80
|
+
def metaclass
|
81
|
+
class << self; self; end
|
82
|
+
end
|
83
|
+
#
|
84
|
+
# def remove_accessors(keys)
|
85
|
+
# metaclass.instance_eval do
|
86
|
+
# keys.each do |k|
|
87
|
+
# next if @@permanent_attributes.include?(k)
|
88
|
+
# k_eq = :"#{k}="
|
89
|
+
# remove_method(k) if method_defined?(k)
|
90
|
+
# remove_method(k_eq) if method_defined?(k_eq)
|
91
|
+
# end
|
92
|
+
# end
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# def add_accessors(keys)
|
96
|
+
# metaclass.instance_eval do
|
97
|
+
# keys.each do |k|
|
98
|
+
# next if @@permanent_attributes.include?(k)
|
99
|
+
# k_eq = :"#{k}="
|
100
|
+
# define_method(k) { @values[k] }
|
101
|
+
# define_method(k_eq) do |v|
|
102
|
+
# if v == ""
|
103
|
+
# raise ArgumentError.new(
|
104
|
+
# "You cannot set #{k} to an empty string." +
|
105
|
+
# "We interpret empty strings as nil in requests." +
|
106
|
+
# "You may set #{self}.#{k} = nil to delete the property.")
|
107
|
+
# end
|
108
|
+
# @values[k] = v
|
109
|
+
# @unsaved_values.add(k)
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
# end
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
def method_missing(name, *args)
|
116
|
+
|
117
|
+
if @values.send(name.to_s + "?")
|
118
|
+
@values.send(name)
|
119
|
+
else
|
120
|
+
begin
|
121
|
+
@values.send(name.to_s, args[0])
|
122
|
+
rescue
|
123
|
+
begin
|
124
|
+
super.send(name)
|
125
|
+
rescue
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
#
|
134
|
+
# def respond_to_missing?(symbol, include_private = false)
|
135
|
+
# super
|
136
|
+
# end
|
137
|
+
end
|
138
|
+
end
|