sheety 0.2.2 → 0.3.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 +4 -4
- data/lib/sheety/api.rb +58 -2
- data/lib/sheety/children.rb +36 -7
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bcb4c0f7b6b0dcf39e89cc9e816cb48ece43ae2
|
4
|
+
data.tar.gz: c3b3a6c2f573a421a2f87a24818bca447186373d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef9ccea18022a4e0ffa7f6d60941dbeb3d31898a1def8ccdf421879523ef984c3dd528668a7761fad8e25f5cfe0471f85a57c1301b8c75e463563e1faf26d87a
|
7
|
+
data.tar.gz: 36aebc88802a69d9d3d7edda08af38ee137ab77d957829a7212061b5edcc96dc61bf0fc1d1fd7aa405032982c1a101e9dc7f6869585305043d266a29c68f73f0
|
data/lib/sheety/api.rb
CHANGED
@@ -6,6 +6,12 @@ require_relative 'spreadsheet'
|
|
6
6
|
|
7
7
|
module Sheety
|
8
8
|
|
9
|
+
class SheetyError < StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
class SheetyFetchError < SheetyError
|
13
|
+
end
|
14
|
+
|
9
15
|
private
|
10
16
|
|
11
17
|
class Api
|
@@ -14,7 +20,7 @@ module Sheety
|
|
14
20
|
URI_LIST = 'https://spreadsheets.google.com/feeds/spreadsheets/private/full'
|
15
21
|
URI_AUTH = 'https://www.googleapis.com/oauth2/v3/token'
|
16
22
|
|
17
|
-
def link(key) # for
|
23
|
+
def link(key) # for compatibility with Sheety::Children
|
18
24
|
return key
|
19
25
|
end
|
20
26
|
|
@@ -39,34 +45,82 @@ module Sheety
|
|
39
45
|
return (@access_token ? self : nil)
|
40
46
|
end
|
41
47
|
|
48
|
+
# block so you can have the max retries set only for a small amount of code
|
49
|
+
def with_max_retries(num, &block)
|
50
|
+
raise ArgumentError.new, "Must pass a block!" unless block_given?
|
51
|
+
|
52
|
+
previous_max = @max_retries
|
53
|
+
@max_retries = num.to_i
|
54
|
+
yield
|
55
|
+
@max_retries = previous_max
|
56
|
+
end
|
57
|
+
|
58
|
+
attr_accessor :max_read_retries
|
59
|
+
|
60
|
+
def with_max_read_retries(num)
|
61
|
+
if block_given?
|
62
|
+
previous_max = @max_read_retries
|
63
|
+
@max_read_retries = num.to_i
|
64
|
+
yield
|
65
|
+
@max_read_retries = previous_max
|
66
|
+
else
|
67
|
+
@max_read_retries = num.to_i
|
68
|
+
end
|
69
|
+
end
|
70
|
+
alias_method :set_max_read_retries, :with_max_read_retries
|
71
|
+
|
42
72
|
def get_feed(uri)
|
73
|
+
tries = 0
|
43
74
|
begin
|
44
75
|
return parse_response(HTTParty.get(uri, headers: get_headers))
|
45
76
|
rescue
|
77
|
+
if tries < [@max_retries, @max_read_retries].max
|
78
|
+
tries += 1
|
79
|
+
retry
|
80
|
+
end
|
81
|
+
|
46
82
|
return nil
|
47
83
|
end
|
48
84
|
end
|
49
85
|
|
50
86
|
def post_feed(uri, data)
|
87
|
+
tries = 0
|
51
88
|
begin
|
52
89
|
return parse_response(HTTParty.post(uri, body: data, headers: post_headers))
|
53
90
|
rescue
|
91
|
+
if tries < @max_retries
|
92
|
+
tries += 1
|
93
|
+
retry
|
94
|
+
end
|
95
|
+
|
54
96
|
return nil
|
55
97
|
end
|
56
98
|
end
|
57
99
|
|
58
100
|
def put_feed(uri, data)
|
101
|
+
tries = 0
|
59
102
|
begin
|
60
103
|
return parse_response(HTTParty.put(uri, body: data, headers: put_headers))
|
61
104
|
rescue
|
105
|
+
if tries < @max_retries
|
106
|
+
tries += 1
|
107
|
+
retry
|
108
|
+
end
|
109
|
+
|
62
110
|
return nil
|
63
111
|
end
|
64
112
|
end
|
65
113
|
|
66
114
|
def delete_feed(uri)
|
115
|
+
tries = 0
|
67
116
|
begin
|
68
117
|
return parse_response(HTTParty.delete(uri, headers: delete_headers))
|
69
118
|
rescue
|
119
|
+
if tries < @max_retries
|
120
|
+
tries += 1
|
121
|
+
retry
|
122
|
+
end
|
123
|
+
|
70
124
|
return nil
|
71
125
|
end
|
72
126
|
end
|
@@ -108,8 +162,10 @@ module Sheety
|
|
108
162
|
@client.authorization= :google_app_default
|
109
163
|
@auth = @client.authorization
|
110
164
|
@auth.scope = 'https://spreadsheets.google.com/feeds'
|
165
|
+
@max_retries = 0
|
166
|
+
@max_read_retries = 0
|
111
167
|
|
112
168
|
return self
|
113
169
|
end
|
114
170
|
end
|
115
|
-
end
|
171
|
+
end
|
data/lib/sheety/children.rb
CHANGED
@@ -27,10 +27,16 @@ module Sheety::Children
|
|
27
27
|
end
|
28
28
|
|
29
29
|
module ClassMethods
|
30
|
+
# Defines a child relationship with the given name
|
31
|
+
# symbol (required): the name of the child
|
32
|
+
# options (required): a hash of options
|
33
|
+
# - klass (required): the class to use for the child instances
|
34
|
+
# - link (required): the url to fetch the children from
|
35
|
+
# -
|
30
36
|
def atom_children(symbol, options)
|
31
37
|
|
32
38
|
if options.blank?
|
33
|
-
raise ArgumentError.new("blank options #{options} are not valid options for
|
39
|
+
raise ArgumentError.new("blank options #{options} are not valid options for atom_children")
|
34
40
|
end
|
35
41
|
|
36
42
|
if options[:klass].blank? || options[:klass].class != Class
|
@@ -42,11 +48,11 @@ module Sheety::Children
|
|
42
48
|
end
|
43
49
|
|
44
50
|
unless method_defined?(:link)
|
45
|
-
raise TypeError.new("#{self} must respond to :link to
|
51
|
+
raise TypeError.new("#{self} must respond to :link to use atom_children")
|
46
52
|
end
|
47
53
|
|
48
54
|
if options[:merge_links] && method_defined?(:add_links) == false
|
49
|
-
raise TypeError.new("#{self} must respond to :add_links
|
55
|
+
raise TypeError.new("#{self} must respond to :add_links in atom_children with merge_links=true")
|
50
56
|
end
|
51
57
|
|
52
58
|
plural = symbol.to_s
|
@@ -62,14 +68,20 @@ module Sheety::Children
|
|
62
68
|
except_any_method = :"#{plural}_except_any"
|
63
69
|
find_first_method = :"find_#{singular}"
|
64
70
|
|
71
|
+
# Defines a method that instantiates a new child
|
65
72
|
define_method(new_method) do |entry=nil|
|
66
73
|
options[:klass].new(self, entry)
|
67
74
|
end
|
68
75
|
|
76
|
+
# Defines a method that fetches children from Google
|
69
77
|
define_method(get_method) do |force_refetch=false|
|
70
78
|
if instance_variable_get(inst_var_sym).nil? || force_refetch
|
71
79
|
list = Sheety::Api.inst.get_feed(link(options[:link])) # sort of a cyclic dependency, suboptimal
|
72
80
|
|
81
|
+
if list.nil?
|
82
|
+
raise Sheety::SheetyFetchError.new, "Fetching #{plural} failed!"
|
83
|
+
end
|
84
|
+
|
73
85
|
# TODO: Create a ListFeed Object so the links we get here don't need to be worried about collisions on link ids
|
74
86
|
add_links(list['link']) if !list['link'].blank? && options[:merge_links]
|
75
87
|
|
@@ -83,28 +95,45 @@ module Sheety::Children
|
|
83
95
|
return instance_variable_get(inst_var_sym)
|
84
96
|
end
|
85
97
|
|
86
|
-
|
87
|
-
|
98
|
+
# Defines a helper-method that will iterate over children checking that each item passes all constraints given
|
99
|
+
define_method(enum_method) do |constraints, enumeration_method|
|
100
|
+
children = method(get_method).()
|
101
|
+
|
102
|
+
if children.nil?
|
103
|
+
return []
|
104
|
+
end
|
105
|
+
|
106
|
+
return children.send(enumeration_method) do |item|
|
88
107
|
constraints.all? do |constraint|
|
89
108
|
_passes_constraint(_get_i_val(item, constraint[0], options[:accessor]), constraint[1])
|
90
109
|
end
|
91
110
|
end
|
92
111
|
end
|
93
112
|
|
113
|
+
# Defines a method that selects the children who adhere to all constraints given
|
94
114
|
define_method(where_method) do |constraints|
|
95
115
|
return method(enum_method).call(constraints, :find_all)
|
96
116
|
end
|
97
117
|
|
118
|
+
# Defines a method that selects the first child that passes all constraints given
|
98
119
|
define_method(find_first_method) do |constraints|
|
99
120
|
return method(enum_method).call(constraints, :detect)
|
100
121
|
end
|
101
122
|
|
123
|
+
# Defines a method that selects those children who fail to meet all constraint given
|
102
124
|
define_method(except_method) do |constraints|
|
103
125
|
return method(enum_method).call(constraints, :reject)
|
104
126
|
end
|
105
127
|
|
128
|
+
# Defines a method that selects those children who fail to meet at least one constraint given
|
106
129
|
define_method(except_any_method) do |constraints|
|
107
|
-
|
130
|
+
children = method(get_method).()
|
131
|
+
|
132
|
+
if children.nil?
|
133
|
+
return []
|
134
|
+
end
|
135
|
+
|
136
|
+
return children.reject do |item|
|
108
137
|
constraints.any? do |constraint|
|
109
138
|
_passes_constraint(_get_i_val(item, constraint[0], options[:accessor]), constraint[1])
|
110
139
|
end
|
@@ -112,4 +141,4 @@ module Sheety::Children
|
|
112
141
|
end
|
113
142
|
end
|
114
143
|
end
|
115
|
-
end
|
144
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sheety
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Israel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xml-simple
|
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
92
|
version: '0'
|
93
93
|
requirements: []
|
94
94
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
95
|
+
rubygems_version: 2.5.1
|
96
96
|
signing_key:
|
97
97
|
specification_version: 4
|
98
98
|
summary: A Google Spreadsheets Gem
|