glass-rails 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +20 -3
- data/lib/generators/glass/install/templates/initializer.rb +16 -2
- data/lib/glass.rb +9 -1
- data/lib/glass/api_keys.rb +52 -13
- data/lib/glass/client.rb +18 -33
- data/lib/glass/rails/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04e2a6397d54f83f18ca0038cf0512ac36d5516c
|
4
|
+
data.tar.gz: 9294c8db7bf53009e9063a7907fce9522f434268
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16c3cce5db9c51886b515ecf47b2d2603c9c821d42f83f3e486258c5f921b5553b77e0ad94a979e9efd03040dad0a5490ee13804c146bde04070793befc99605
|
7
|
+
data.tar.gz: 6c02d1425142c574d5d18c88fb477d4a56cedbe682cda18f19f5cf0cc84aabd5d8072e7459d2d8295a7a2be6f35ff104cd0317f1948c5d23560816af9cd1bb25
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -34,6 +34,23 @@ tables.
|
|
34
34
|
Additionally, the install generator will create a set of html.erb templates for you to use (optionally) when creating timeline items to post to a user. The templates will be created under the directory
|
35
35
|
`app/views/glass` though you may want to organize them more logically, depending on your use case.
|
36
36
|
|
37
|
+
### API Key Configuration
|
38
|
+
|
39
|
+
The glass install generator will automatically generate a yaml file for you in the correct format for storing your client id and client secret, for each respective environment. You can optionally bypass loading your API Keys from
|
40
|
+
a YAML file by utilizing the generated initializer, which allows you to set custom configurations for your application.
|
41
|
+
|
42
|
+
If you want to load your keys, for example, from your ENV variables, you can do so like this:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
Glass.setup do |config|
|
46
|
+
|
47
|
+
## blah blah some config stuff..
|
48
|
+
|
49
|
+
|
50
|
+
config.client_id = ENV["GOOGLE_CLIENT_ID"]
|
51
|
+
config.client_secret = ENV["GOOGLE_CLIENT_SECRET"]
|
52
|
+
end
|
53
|
+
```
|
37
54
|
### Glass Models - (Introduction)
|
38
55
|
|
39
56
|
This gem also provides a glass model generator, which generates a timeline-item
|
@@ -196,12 +213,12 @@ mirror api for insertion into the timeline.
|
|
196
213
|
Then all you have to do is use the following command to actually insert the content:
|
197
214
|
|
198
215
|
```ruby
|
199
|
-
gt.
|
216
|
+
gt.mirror_insert()
|
200
217
|
```
|
201
218
|
|
202
219
|
Additionally, if you would like to merge in attributes into the hash before it is
|
203
220
|
posted to the mirror-api, then you can optionally pass in a hash of attributes
|
204
|
-
to the
|
221
|
+
to the mirror_insert() method call, and the hash will be merged into the body_object that
|
205
222
|
is posted to the mirror api.
|
206
223
|
|
207
224
|
This last point is relevant, for example, in the case of reading aloud text.
|
@@ -209,7 +226,7 @@ To do so, you need to specify a speakableText: "some text to be read aloud" attr
|
|
209
226
|
in the body object when it gets posted. You can therefore do something like this:
|
210
227
|
|
211
228
|
```ruby
|
212
|
-
gt.
|
229
|
+
gt.mirror_insert(speakableText: "some text to be read aloud")
|
213
230
|
```
|
214
231
|
## License
|
215
232
|
|
@@ -9,13 +9,27 @@ Rails.application.routes.default_url_options[:host] = 'localhost:3000' if Rails.
|
|
9
9
|
## Your configuration details here:
|
10
10
|
|
11
11
|
Glass.setup do |config|
|
12
|
-
|
12
|
+
|
13
|
+
# modify this to change the name of your glass app
|
13
14
|
## config.application_name = "SomeGlassApp"
|
14
15
|
|
15
|
-
|
16
|
+
|
17
|
+
|
18
|
+
# modify this to change the application version of your glass app
|
16
19
|
## config.application_version = "0.0.1"
|
17
20
|
|
18
21
|
|
22
|
+
|
23
|
+
# if you don't want to use a yaml file to load your api
|
24
|
+
# keys, then you can use these config vars to force load
|
25
|
+
# your keys from enviroment variables, or whatever method
|
26
|
+
# you might choose.
|
27
|
+
#
|
28
|
+
## config.client_id = ENV["GOOGLE_CLIENT_ID"]
|
29
|
+
## config.client_secret = ENV["GOOGLE_CLIENT_SECRET"]
|
30
|
+
|
31
|
+
|
32
|
+
|
19
33
|
## manually override your glass views path here.
|
20
34
|
config.glass_template_path = "app/views/glass"
|
21
35
|
end
|
data/lib/glass.rb
CHANGED
@@ -15,10 +15,18 @@ module Glass
|
|
15
15
|
mattr_accessor :glass_template_path
|
16
16
|
@@glass_template_path = "app/views/glass"
|
17
17
|
|
18
|
+
mattr_accessor :_api_keys
|
19
|
+
@@_api_keys = nil
|
18
20
|
|
21
|
+
mattr_accessor :client_id
|
22
|
+
|
23
|
+
mattr_accessor :client_secret
|
24
|
+
|
19
25
|
## devise trick
|
20
26
|
def self.setup
|
21
27
|
yield self
|
28
|
+
require "glass/api_keys"
|
29
|
+
Glass::ApiKeys.generate!
|
22
30
|
end
|
31
|
+
end
|
23
32
|
|
24
|
-
end
|
data/lib/glass/api_keys.rb
CHANGED
@@ -1,29 +1,68 @@
|
|
1
1
|
require "yaml"
|
2
|
+
require "pry"
|
2
3
|
module Glass
|
3
4
|
## just a small class to organize the api key logic info
|
4
5
|
## from the yml file in config.
|
5
6
|
class ApiKeys
|
6
7
|
class APIKeyConfigurationError < StandardError; end;
|
7
|
-
|
8
|
+
class YAMLDoesNotHaveTheRightKeysForExtraction < StandardError; end;
|
9
|
+
attr_accessor :client_id, :client_secret, :google_api_keys, :yaml_config, :yaml_file_contents, :keys
|
8
10
|
def initialize
|
9
|
-
self.google_api_keys =
|
11
|
+
self.google_api_keys = {}
|
12
|
+
preload_yaml_file_keys
|
13
|
+
load_google_keys_from_whereever
|
10
14
|
load_keys
|
11
|
-
self
|
15
|
+
return self.keys
|
16
|
+
end
|
17
|
+
def self.generate!
|
18
|
+
keys_instance = self.new
|
19
|
+
keys_instance.keys
|
20
|
+
::Glass.client_secret = keys_instance.keys.client_secret
|
21
|
+
::Glass.client_id = keys_instance.keys.client_id
|
22
|
+
::Glass._api_keys = keys_instance.keys
|
23
|
+
end
|
24
|
+
private
|
25
|
+
def yaml_file_path
|
26
|
+
"#{Dir.pwd}/config/google-api-keys.yml"
|
12
27
|
end
|
13
|
-
private
|
14
28
|
def load_keys
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
29
|
+
google_api_keys_are_empty? ? (raise APIKeyConfigurationError) : set_client_keys
|
30
|
+
end
|
31
|
+
def yaml_config_hash
|
32
|
+
return self.yaml_file_contents if self.yaml_file_contents
|
33
|
+
self.yaml_file_contents = {}
|
34
|
+
self.yaml_file_contents = ::YAML.load(File.read(yaml_file_path)) if File.exists?(yaml_file_path)
|
35
|
+
self.yaml_file_contents
|
36
|
+
end
|
37
|
+
def preload_yaml_file_keys
|
38
|
+
self.yaml_config = {}
|
39
|
+
if yaml_config_hash.has_key?(::Rails.env)
|
40
|
+
self.yaml_config = yaml_config_hash[::Rails.env]
|
19
41
|
end
|
20
42
|
end
|
21
|
-
|
22
|
-
|
43
|
+
|
44
|
+
def load_google_keys_from_whereever
|
45
|
+
[:client_id, :client_secret].each do |key|
|
46
|
+
google_api_keys[key] = ::Glass.send(key)
|
47
|
+
unless google_api_keys[key]
|
48
|
+
load_yaml_as_auxiliary_method(key)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_yaml_as_auxiliary_method(key)
|
54
|
+
if yaml_config.has_key?(key.to_s)
|
55
|
+
google_api_keys[key] = yaml_config[key.to_s]
|
56
|
+
else
|
57
|
+
raise YAMLDoesNotHaveTheRightKeysForExtraction
|
58
|
+
end
|
23
59
|
end
|
24
60
|
def set_client_keys
|
25
|
-
|
26
|
-
self.
|
61
|
+
keys_struct = Struct.new(:client_id, :client_secret)
|
62
|
+
self.keys = keys_struct.new(google_api_keys[:client_id], google_api_keys[:client_secret])
|
63
|
+
end
|
64
|
+
def google_api_keys_are_empty?
|
65
|
+
google_api_keys[:client_id].nil? or google_api_keys[:client_secret].nil?
|
27
66
|
end
|
28
67
|
end
|
29
|
-
end
|
68
|
+
end
|
data/lib/glass/client.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "glass/api_keys"
|
2
1
|
require 'active_support/core_ext/hash/indifferent_access'
|
3
2
|
require "google/api_client"
|
4
3
|
|
@@ -16,36 +15,18 @@ module Glass
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def initialize(opts)
|
19
|
-
|
20
|
-
|
21
|
-
self.mirror_api = google_client.discovered_api("mirror", "v1")
|
18
|
+
setup_google_api_keys
|
19
|
+
initialize_google_client
|
22
20
|
self.google_account = opts[:google_account]
|
23
|
-
|
24
|
-
### this isn't functional yet but this is an idea for
|
25
|
-
### an api for those who wish to opt out of passing in a
|
26
|
-
### google account, by passing in a hash of options
|
27
|
-
###
|
28
|
-
###
|
29
|
-
### the tricky aspect of this is how to handle the update
|
30
|
-
### of the token information if the token is expired.
|
31
|
-
|
32
|
-
self.access_token = opts[:access_token] || google_account.try(:token)
|
33
|
-
self.refresh_token = opts[:refresh_token] || google_account.try(:refresh_token)
|
34
|
-
self.has_expired_token = opts[:has_expired_token] || google_account.has_expired_token?
|
35
|
-
|
36
21
|
setup_with_our_access_tokens
|
37
22
|
setup_with_user_access_token
|
38
23
|
self
|
39
24
|
end
|
40
|
-
def initialize_google_api_client
|
41
|
-
application_name = ::Glass.application_name
|
42
|
-
application_version = ::Glass.application_version
|
43
|
-
self.google_client = ::Google::APIClient.new(application_name: application_name, application_version: application_version)
|
44
|
-
end
|
45
25
|
|
46
26
|
def get_timeline_item(id)
|
47
27
|
response_hash(self.google_client.execute(get_timeline_item_parameters(id)).response)
|
48
28
|
end
|
29
|
+
|
49
30
|
def get_timeline_item_parameters(id)
|
50
31
|
{ api_method: self.mirror_api.timeline.get,
|
51
32
|
parameters: {
|
@@ -59,7 +40,6 @@ module Glass
|
|
59
40
|
self
|
60
41
|
end
|
61
42
|
|
62
|
-
|
63
43
|
def json_content(options, api_method="insert")
|
64
44
|
if c = options[:content]
|
65
45
|
data = c.is_a?(String) ? {text: c} : c
|
@@ -82,6 +62,7 @@ module Glass
|
|
82
62
|
inserting_content = { api_method: mirror_api.timeline.send(action),
|
83
63
|
body_object: body_object}
|
84
64
|
end
|
65
|
+
|
85
66
|
def get(id)
|
86
67
|
self.google_client.execute(get_timeline_item_parameters(id))
|
87
68
|
end
|
@@ -90,7 +71,6 @@ module Glass
|
|
90
71
|
google_client.execute(rest_action(options, "insert"))
|
91
72
|
end
|
92
73
|
|
93
|
-
|
94
74
|
def patch(options={})
|
95
75
|
glass_item_id = options.delete(:glass_item_id)
|
96
76
|
patch_action = rest_action(options, "patch").merge(parameters: {id: glass_item_id})
|
@@ -106,15 +86,12 @@ module Glass
|
|
106
86
|
google_client.execute update_content
|
107
87
|
end
|
108
88
|
|
109
|
-
|
110
|
-
|
111
89
|
## deprecated: please use cached_list instead
|
112
90
|
def timeline_list(opts={as_hash: true})
|
113
91
|
puts "DEPRECATION WARNING: timeline_list is now deprecated, please use cached_list instead"
|
114
92
|
cached_list
|
115
93
|
end
|
116
94
|
|
117
|
-
|
118
95
|
def cached_list(opts={as_hash: true})
|
119
96
|
retval = @timeline_list.nil? ? self.list(opts) : @timeline_list
|
120
97
|
opts[:as_hash] ? retval.map(&:to_hash).map(&:with_indifferent_access) : retval
|
@@ -151,16 +128,12 @@ module Glass
|
|
151
128
|
timeline_list(opts)
|
152
129
|
end
|
153
130
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
131
|
def delete(options={})
|
158
132
|
deleting_content = { api_method: mirror_api.timeline.delete,
|
159
133
|
parameters: options }
|
160
134
|
google_client.execute(deleting_content)
|
161
135
|
end
|
162
136
|
|
163
|
-
|
164
137
|
def response_hash(google_response)
|
165
138
|
JSON.parse(google_response.body).with_indifferent_access
|
166
139
|
end
|
@@ -194,8 +167,6 @@ module Glass
|
|
194
167
|
ea_data_hash
|
195
168
|
end
|
196
169
|
|
197
|
-
|
198
|
-
private
|
199
170
|
def format_hash_properly(data_hash)
|
200
171
|
data_hash.inject({}) do |acc, (key, value)|
|
201
172
|
new_key = key.to_s.camelize(:lower)
|
@@ -203,11 +174,25 @@ module Glass
|
|
203
174
|
acc
|
204
175
|
end.with_indifferent_access
|
205
176
|
end
|
177
|
+
|
206
178
|
def to_google_time(time)
|
207
179
|
Time.now.to_i + time
|
208
180
|
end
|
181
|
+
|
209
182
|
def format_date(time)
|
210
183
|
time.to_time.utc.iso8601.gsub("Z", ".000Z") # fucking google has a weird format
|
211
184
|
end
|
185
|
+
|
186
|
+
def initialize_google_client
|
187
|
+
application_name = ::Glass.application_name
|
188
|
+
application_version = ::Glass.application_versio
|
189
|
+
self.google_client = ::Google::APIClient.new(application_name: application_name,
|
190
|
+
application_version: application_version)
|
191
|
+
self.mirror_api = google_client.discovered_api("mirror", "v1")
|
192
|
+
end
|
193
|
+
|
194
|
+
def setup_google_api_keys
|
195
|
+
self.api_keys = ::Glass._api_keys
|
196
|
+
end
|
212
197
|
end
|
213
198
|
end
|
data/lib/glass/rails/version.rb
CHANGED