google_api 1.0.3 → 1.1.0.beta

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ ## v1.1.0.beta
2
+
3
+ * add google urlshorter
4
+ * login_by_cert! can be end by ctr+c
5
+ * session start logic moved to GoogleApi::Session
6
+ * add check_session without raise error
7
+ * fix: login_by_line are now first write messae and then write
8
+
1
9
  ## v1.0.3
2
10
 
3
11
  * GoogleApi::Ga::Data has now silent error, GoogleApi::Ga::Data.error(true) - raise error, GoogleApi::Ga::Data.error(false) - not error (default)
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  Google Api [![Build Status](https://secure.travis-ci.org/ondra-m/google_api.png)](http://travis-ci.org/ondra-m/google_api)
2
2
  ==========
3
3
 
4
- Analytics - v1.0.0<br>
4
+ Analytics<br>
5
+ Url shortener - documentation is not complete yet<br>
5
6
  Calendar - will be soon
6
7
 
7
8
  Google Analytics
@@ -289,7 +290,7 @@ GoogleApi::Ga::Data
289
290
  </tr>
290
291
  <tr>
291
292
  <td>max_results</td>
292
- <td>offset</td>
293
+ <td>limit</td>
293
294
  </tr>
294
295
  </tbody>
295
296
  </table>
@@ -359,12 +360,13 @@ For how long in minutes will be data cached. Use 0 for never expire.
359
360
  GoogleApi::Ga::Data.cache(minutes)
360
361
 
361
362
  # you can also clear cache
363
+ # it will clear cache only for entered parameters
362
364
  GoogleApi::Ga::Data.clear_cache
363
365
 
364
366
  # if you want clear cache and cache new
365
367
  GoogleApi::Ga::Data.select(:visits).clear_cache.cache(60)
366
368
 
367
- # orif you don't want use cache at all, default: true
369
+ # or if you don't want use cache at all, default: true
368
370
  GoogleApi::Ga::Data.use_cache(false)
369
371
  ```
370
372
 
@@ -388,12 +390,12 @@ You can use one of these. Data is stored in the class.
388
390
  .rows # rows returned by google analytics
389
391
  .header # header of data, (["ga:day", "ga:month", "ga:visitis"])
390
392
  .count # number of rows
391
- .each # each as you expected, (`|data|` or `|index, data|`)
393
+ .each # each as you expected, (|data| or |index, data|)
392
394
  ```
393
395
 
394
396
  ### Clear stored data and fetch again
395
397
 
396
- If you add some parameters clear is called automaticlly.
398
+ If you add some parameters clear is called automatically.
397
399
 
398
400
  clear: `.clear`<br>
399
401
 
@@ -448,7 +450,7 @@ Examples
448
450
  # Check session, error if not login
449
451
  # =================================
450
452
 
451
- GoogleApi::Ga::Session.check_session!
453
+ GoogleApi::Ga::Session.check_session
452
454
 
453
455
 
454
456
 
@@ -4,8 +4,8 @@ require File.expand_path('../lib/google_api/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Ondřej Moravčík"]
6
6
  gem.email = ["moravcik.ondrej@gmail.com"]
7
- gem.description = %q{Simple Google Api. Include google analytics.}
8
- gem.summary = %q{Simple Google Api. Include google analytics.}
7
+ gem.description = %q{Simple Google Api. Include google analytics, url shortener.}
8
+ gem.summary = %q{Simple Google Api. Include google analytics, url shortener.}
9
9
  gem.homepage = "https://github.com/ondra-m/google_api"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
@@ -6,25 +6,26 @@ require "google_api/version"
6
6
 
7
7
  module GoogleApi
8
8
 
9
+ autoload :Session, 'google_api/session/session'
10
+ autoload :SessionMethods, 'google_api/session/session_methods'
11
+
9
12
  autoload :Cache, 'google_api/cache'
10
13
 
11
- autoload :Ga, 'google_api/ga'
14
+ autoload :Ga, 'google_api/ga/ga' # Google analytics
15
+ autoload :Shorten, 'google_api/shorten/shorten' # Google urlshortener
12
16
 
13
17
  class SessionError < StandardError; end
14
18
  class GaError < StandardError; end
19
+ class ShortenError < StandardError; end
15
20
  class DateError < StandardError; end
16
21
  class TypeError < StandardError; end
17
22
  class CanBeNilError < StandardError; end
23
+ class RequireError < StandardError; end
18
24
 
25
+ # Global configuration
19
26
  CONFIGURATION = {
20
- client_id: nil,
21
- client_secret: nil,
22
- client_developer_email: nil,
23
- client_cert_file: nil,
24
- key_secret: 'notasecret',
25
- redirect_uri: nil,
26
-
27
- ga: Configuration.new(Ga::CONFIGURATION)
27
+ ga: Configuration.new(Ga::CONFIGURATION),
28
+ shorten: Configuration.new(Shorten::CONFIGURATION)
28
29
  }
29
30
 
30
31
  def self.config
@@ -1,13 +1,23 @@
1
1
  module GoogleApi
2
2
  class Configuration
3
3
 
4
- def initialize(config = {})
4
+ DEFAULT = {
5
+ client_id: nil,
6
+ client_secret: nil,
7
+ client_developer_email: nil,
8
+ client_cert_file: nil,
9
+ key_secret: 'notasecret',
10
+ redirect_uri: nil,
11
+ }
12
+
13
+ def initialize(config, use_default = true)
14
+
15
+ if use_default
16
+ config = DEFAULT.merge(config)
17
+ end
18
+
5
19
  config.each do |key, value|
6
20
  eval <<-METHOD
7
- def #{key}=(value)
8
- @#{key} = value
9
- end
10
-
11
21
  def #{key}(value = nil, &block)
12
22
  if block_given?
13
23
  @#{key}.instance_eval(&block)
@@ -19,6 +29,10 @@ module GoogleApi
19
29
 
20
30
  self.#{key} = value
21
31
  end
32
+
33
+ def #{key}=(value)
34
+ @#{key} = value
35
+ end
22
36
  METHOD
23
37
 
24
38
  self.send("#{key}=", value)
@@ -2,6 +2,8 @@ module GoogleApi
2
2
  module Ga
3
3
  class Data
4
4
 
5
+ # Initialize ----------------------------------------------------------------------------------
6
+
5
7
  def initialize
6
8
  @ids, @cache = nil, nil
7
9
  @start_date, @end_date = Date.today, Date.today
@@ -21,262 +23,209 @@ module GoogleApi
21
23
  end
22
24
  end
23
25
 
24
- # Convert string, DateTime and Time to date
25
- DATE_FORMAT = /\A[0-9]{4}-[0-9]{2}-[0-9]{2}\Z/
26
-
27
- def to_date(date)
28
- if date.is_a?(String)
29
- unless date =~ DATE_FORMAT
30
- raise GoogleApi::DateError, "Date: #{date} must match with #{DATE_FORMAT}."
31
- end
32
-
33
- date = Date.parse(date)
34
- end
26
+ # Parameters for google analytics -------------------------------------------------------------
35
27
 
36
- date.to_date
37
- end
28
+ TYPE_INTEGER = { ids: 'id',
29
+ cache: nil,
30
+ start_index: 'offset',
31
+ max_results: 'limit' }
38
32
 
39
- # Add prefix ga: to symbol in Array
40
- def build_param(value)
41
- type?(value, Array)
33
+ TYPE_DATE = { start_date: 'from',
34
+ end_date: 'to' }
42
35
 
43
- value.flatten.collect { |v| v.is_a?(Symbol) ? "ga:#{v}" : v }
44
- end
36
+ TYPE_ARRAY = { metrics: 'select',
37
+ dimensions: 'with',
38
+ sort: nil }
45
39
 
46
- # Check type
47
- def type?(value, type)
48
- unless value.is_a?(type)
49
- raise GoogleApi::TypeError, "Value: #{value} must be #{type}."
50
- end
51
- end
40
+ TYPE_BLOCK = { filters: 'where',
41
+ segment: nil }
52
42
 
53
- # Clear value
54
- def clear
55
- @header = nil
56
- @parameters = nil
57
- @data = nil
58
- @all = nil
59
- end
43
+ TYPE_BOOLEAN = { error: nil,
44
+ use_cache: nil }
60
45
 
61
- # -----------------------------------------------------------------------------------
62
- # Type 1, all are integer
46
+ # Create a base method
47
+ # ids, cache, start_index, max_results, start_date, end_date, error, use_cache
63
48
  #
64
- # Ids, Cache, Start index, Max results
49
+ # Example:
65
50
  #
66
- # name, alias
51
+ # def ids(value = nil)
52
+ # if value.nil?
53
+ # return @ids
54
+ # end
67
55
  #
68
- TYPE_1 = { ids: :id,
69
- cache: nil,
70
- start_index: :offset,
71
- max_results: :limit }
72
-
73
- TYPE_1.each do |key, value|
56
+ # self.ids = value
57
+ # self
58
+ # end
59
+ #
60
+ def self.create_base_method(name)
74
61
  eval <<-METHOD
75
- def #{key}(value = nil)
62
+ def #{name}(value = nil)
76
63
  if value.nil?
77
- return @#{key}
64
+ return @#{name}
78
65
  end
79
66
 
80
- self.#{key} = value
67
+ self.#{name} = value
81
68
  self
82
69
  end
83
-
84
- def #{key}=(value)
85
- value = value.to_i
86
-
87
- @#{key} = value
88
- end
89
70
  METHOD
90
-
91
- unless value.nil?
92
- eval <<-METHOD
93
- alias :#{value} :#{key}
94
- alias :#{value}= :#{key}=
95
- METHOD
96
- end
97
71
  end
98
72
 
99
- # -----------------------------------------------------------------------------------
100
- # Type 2, date
73
+ # Create an array method, suffix is for _add or _sub
74
+ # metrics, dimensions, sort
101
75
  #
102
- # Start date, End date
76
+ # Example:
103
77
  #
104
- # name, alias
78
+ # def metrics(*args)
79
+ # if args.empty?
80
+ # return @metrics
81
+ # end
105
82
  #
106
- TYPE_2 = { start_date: :from,
107
- end_date: :to }
108
-
109
- TYPE_2.each do |key, value|
83
+ # self.metrics = args
84
+ # self
85
+ # end
86
+ #
87
+ # def metrics=(value)
88
+ # clear
89
+ # @metrics = build_param(value)
90
+ # end
91
+ #
92
+ def self.create_array_method(name, operator = '', suffix = '')
110
93
  eval <<-METHOD
111
- def #{key}(date = nil)
112
- if date.nil?
113
- return @#{key}
94
+ def #{name}#{suffix}(*args)
95
+ if args.empty?
96
+ return @#{name}
114
97
  end
115
98
 
116
- self.#{key} = date
99
+ self.#{name}#{suffix} = args
117
100
  self
118
101
  end
119
102
 
120
- def #{key}=(date)
121
- if date.is_a?(Integer)
122
- @#{key} += date
123
- else
124
- @#{key} = to_date(date)
125
- end
103
+ def #{name}#{suffix}=(value)
104
+ clear
105
+ @#{name} #{operator}= build_param(value)
126
106
  end
127
107
  METHOD
108
+ end
128
109
 
129
- unless value.nil?
110
+ # Create a base alias
111
+ # ids, cache, start_index, max_results, start_date, end_date, metrics, dimensions, sort
112
+ #
113
+ # Example:
114
+ #
115
+ # alias :id :ids
116
+ # alias :id= :ids=
117
+ #
118
+ def self.create_base_alias(name, method_alias, suffix = '')
119
+ unless method_alias.nil?
130
120
  eval <<-METHOD
131
- alias :#{value} :#{key}
132
- alias :#{value}= :#{key}=
121
+ alias :#{method_alias}#{suffix} :#{name}#{suffix}
122
+ alias :#{method_alias}#{suffix}= :#{name}#{suffix}=
133
123
  METHOD
134
124
  end
135
125
  end
136
126
 
137
- # -----------------------------------------------------------------------------------
138
- # Type 3
139
- #
140
- # Metrics, Dimensions, Sort
141
- #
142
- # name, alias
143
- #
144
- TYPE_3 = { metrics: :select,
145
- dimensions: :with,
146
- sort: nil }
127
+ # ids, cache, start_index, max_results
128
+ TYPE_INTEGER.each do |name, method_alias|
129
+ create_base_method(name)
147
130
 
148
- TYPE_3.each do |key, value|
149
131
  eval <<-METHOD
150
- def #{key}(*args)
151
- if args.size == 0
152
- return @#{key}
153
- end
154
-
155
- self.#{key} = args
156
- self
157
- end
158
-
159
- def #{key}=(value)
132
+ def #{name}=(value)
160
133
  clear
161
- @#{key} = build_param(value)
134
+ @#{name} = value.to_i
162
135
  end
136
+ METHOD
163
137
 
164
- def #{key}_add(*args)
165
- if args.size == 0
166
- return @#{key}
167
- end
138
+ create_base_alias(name, method_alias)
139
+ end
168
140
 
169
- self.#{key}_add = args
170
- self
171
- end
141
+ # start_date, end_date
142
+ TYPE_DATE.each do |name, method_alias|
143
+ create_base_method(name)
172
144
 
173
- def #{key}_add=(value)
145
+ eval <<-METHOD
146
+ def #{name}=(value)
174
147
  clear
175
- @#{key} += build_param(value)
176
- end
177
-
178
- def #{key}_sub(*args)
179
- if args.size == 0
180
- return @#{key}
148
+ if value.is_a?(Integer)
149
+ @#{name} += value
150
+ else
151
+ @#{name} = to_date(value)
181
152
  end
182
-
183
- self.#{key}_sub = args
184
- self
185
- end
186
-
187
- def #{key}_sub=(value)
188
- clear
189
- @#{key} -= build_param(value)
190
153
  end
191
154
  METHOD
192
155
 
193
- unless value.nil?
194
- eval <<-METHOD
195
- alias :#{value} :#{key}
196
- alias :#{value}= :#{key}=
156
+ create_base_alias(name, method_alias)
157
+ end
197
158
 
198
- alias :#{value}_add :#{key}_add
199
- alias :#{value}_add= :#{key}_add=
159
+ # metrics, dimensions, sort
160
+ TYPE_ARRAY.each do |name, method_alias|
161
+ create_array_method(name)
162
+ create_array_method(name, '+', '_add')
163
+ create_array_method(name, '-', '_sub')
200
164
 
201
- alias :#{value}_sub :#{key}_sub
202
- alias :#{value}_sub= :#{key}_sub=
203
- METHOD
204
- end
165
+ create_base_alias(name, method_alias)
166
+ create_base_alias(name, method_alias, '_add')
167
+ create_base_alias(name, method_alias, '_sub')
205
168
  end
206
169
 
207
- # -----------------------------------------------------------------------------------
208
- # Type 4
209
- #
210
- # Filters, Segment
211
- #
212
- # name, alias
213
- #
214
- TYPE_4 = { filters: :where,
215
- segment: nil }
216
-
217
- TYPE_4.each do |key, value|
170
+ # filters, segment
171
+ TYPE_BLOCK.each do |name, method_alias|
218
172
  eval <<-METHOD
219
- def #{key}(value = nil, &block)
173
+ def #{name}(value = nil, &block)
220
174
  if !block_given? && value.nil?
221
- return @#{key}
175
+ return @#{name}
222
176
  end
223
177
 
224
178
  if block_given?
225
- @#{key} = #{key.to_s.capitalize}Dsl.new.instance_eval(&block).join
179
+ @#{name} = #{name.to_s.capitalize}Dsl.new.instance_eval(&block).join
226
180
  else
227
- @#{key} = value
181
+ @#{name} = value
228
182
  end
229
183
  self
230
184
  end
231
185
  METHOD
232
186
 
233
- unless value.nil?
187
+ unless method_alias.nil?
234
188
  eval <<-METHOD
235
- alias :#{value} :#{key}
189
+ alias :#{method_alias} :#{name}
236
190
  METHOD
237
191
  end
238
192
  end
239
193
 
240
- # -----------------------------------------------------------------------------------
241
- # Type 5
242
- #
243
- # Error, use cache
244
- #
245
- TYPE_5 = { error: nil,
246
- use_cache: nil }
247
- TYPE_5.each do |key, value|
248
- eval <<-METHOD
249
- def #{key}(value = nil)
250
- if value.nil?
251
- return @#{key}
252
- end
194
+ # error, user_cache
195
+ TYPE_BOOLEAN.each do |name, method_alias|
196
+ create_base_method(name)
253
197
 
198
+ eval <<-METHOD
199
+ def #{name}=(value)
254
200
  if !value.is_a?(TrueClass) && !value.is_a?(FalseClass)
255
201
  raise GoogleApi::TypeError, "Value must be true of false"
256
202
  end
257
203
 
258
- self.#{key} = value
259
- self
260
- end
261
-
262
- def #{key}=(value)
263
- @#{key} = value
204
+ @#{name} = value
264
205
  end
265
206
  METHOD
266
207
  end
267
208
 
209
+ # Methods for manipulations with data ---------------------------------------------------------
210
+
211
+ # Clear values
212
+ def clear
213
+ @header = nil
214
+ @parameters = nil
215
+ @data = nil
216
+ @all = nil
217
+ end
218
+
219
+ # Clear cache
268
220
  def clear_cache
269
221
  _cache.delete(parameters)
270
222
  self
271
223
  end
272
224
 
273
- # Add row!, header!, all!, count!. First clear and run method .
225
+ # Add row!, header!, all!, count!. First clear and run normal method.
274
226
  [:rows, :header, :all, :count].each do |value|
275
227
  eval <<-METHOD
276
- def #{value}!
277
- clear
278
- #{value}
279
- end
228
+ def #{value}!; clear; #{value}; end
280
229
  METHOD
281
230
  end
282
231
 
@@ -317,10 +266,41 @@ module GoogleApi
317
266
 
318
267
  private
319
268
 
269
+ # Store data, call clear for fetch again
320
270
  def data
321
271
  @data ||= get
322
272
  end
323
273
 
274
+ # Convert string, DateTime and Time to date for google analytics YYYY-MM-DD
275
+ DATE_FORMAT = /\A[0-9]{4}-[0-9]{2}-[0-9]{2}\Z/
276
+
277
+ def to_date(date)
278
+ if date.is_a?(String)
279
+ unless date =~ DATE_FORMAT
280
+ raise GoogleApi::DateError, "Date: #{date} must match with #{DATE_FORMAT}."
281
+ end
282
+
283
+ date = Date.parse(date)
284
+ end
285
+
286
+ date.to_date
287
+ end
288
+
289
+ # Add prefix ga: to symbol in Array
290
+ def build_param(value)
291
+ type?(value, Array)
292
+
293
+ value.flatten.collect { |v| v.is_a?(Symbol) ? "ga:#{v}" : v }
294
+ end
295
+
296
+ # Check type
297
+ def type?(value, type)
298
+ unless value.is_a?(type)
299
+ raise GoogleApi::TypeError, "Value: #{value} must be #{type}."
300
+ end
301
+ end
302
+
303
+ # Build and store parameters
324
304
  def parameters
325
305
  return @parameters if @parameters
326
306
 
@@ -356,6 +336,7 @@ module GoogleApi
356
336
  Session
357
337
  end
358
338
 
339
+ # Get data from google analytics
359
340
  def get
360
341
  if @use_cache && _cache.exists?(parameters)
361
342
  return _cache.read(parameters)