dm_live_resources 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -18
- data/bin/add_resource +4 -5
- data/bin/update_db +2 -2
- data/dm_live_resources.gemspec +8 -6
- data/lib/dm_live_resources/dm_sheet.rb +52 -54
- data/lib/dm_live_resources/g_sheet.rb +35 -34
- data/lib/dm_live_resources/resource.rb +43 -41
- data/lib/dm_live_resources/resource_manager.rb +49 -51
- data/lib/dm_live_resources/version.rb +1 -1
- data/lib/dm_live_resources.rb +4 -0
- metadata +14 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53de0c8c7ac6abd93212dd45c314923b44e06a83
|
4
|
+
data.tar.gz: ebd24935a5b1d7cd113dc092f08637914eb89104
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46e37471783c233e7bdfaf5da6903ae33926751e66454ad1a9a171f577163289809b056433321a5490f7afc8ce55d860f9b75aa9a767f696f9ad266d6c7eab75
|
7
|
+
data.tar.gz: 441fd6ca459b6ff7dc306126fbc44bdd66f7487599cf8715b5a0d97e4baee586880099729ffe1f37283f27194a219e6eb9bad094b09031c6a9fb9caa6c3acb60
|
data/README.md
CHANGED
@@ -1,28 +1,16 @@
|
|
1
1
|
# DmLiveResources
|
2
2
|
|
3
|
-
|
3
|
+
Add Google Sheets as live resources in Device Magic.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
```ruby
|
10
|
-
gem 'dm_live_resources'
|
11
|
-
```
|
12
|
-
|
13
|
-
And then execute:
|
5
|
+
Device Magic users can upload .xlsx files to be referenced within their mobile forms. This project is aimed at automating the same process for Google Sheets to increase the flexibility of resources.
|
14
6
|
|
15
|
-
|
16
|
-
|
17
|
-
Or install it yourself as:
|
7
|
+
## Installation
|
18
8
|
|
19
9
|
$ gem install dm_live_resources
|
20
10
|
|
21
11
|
## Adding a Resource
|
22
12
|
|
23
|
-
|
24
|
-
|
25
|
-
To add a Google Sheet as a Resource, within your terminal execute:
|
13
|
+
To add a Google Sheet as a Resource, in terminal execute:
|
26
14
|
|
27
15
|
$ ruby add_resource --gs-api-key="Google Drive API Key" --gs-identifier="Google Sheet Identifier" --gs-sheets="Sheets in workbook to be tracked for changes" --dm-api-key="Device Magic API Key"
|
28
16
|
|
@@ -30,8 +18,6 @@ The first time this script is ran, a 'Resources.db' file will be created in the
|
|
30
18
|
|
31
19
|
## Updating a Resource
|
32
20
|
|
33
|
-
In your terminal, execute:
|
34
|
-
|
35
21
|
$ ruby update_db
|
36
22
|
|
37
23
|
This will check to see if any changes have been made within the sheets you specified previously for your resources. If there are changes, Device Magic will be updated with a new copy of the resource.
|
data/bin/add_resource
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'trollop'
|
3
|
-
require 'dm_live_resources
|
3
|
+
require 'dm_live_resources'
|
4
4
|
|
5
5
|
resource_data = Trollop::options do
|
6
6
|
opt :gs_api_key, "Google Drive API Key", type: :string
|
@@ -9,17 +9,16 @@ resource_data = Trollop::options do
|
|
9
9
|
opt :dm_api_key, "Device Magic API Key", type: :string
|
10
10
|
end
|
11
11
|
|
12
|
-
g_sheet = GSheet.new(resource_data)
|
13
|
-
|
12
|
+
g_sheet = DmLiveResources::GSheet.new(resource_data)
|
14
13
|
|
15
14
|
resource_data[:file] = g_sheet.exported_file
|
16
15
|
resource_data[:description] = g_sheet.title
|
17
16
|
|
18
|
-
dm_sheet = DMSheet.new(resource_data)
|
17
|
+
dm_sheet = DmLiveResources::DMSheet.new(resource_data)
|
19
18
|
dm_sheet.add_resource
|
20
19
|
|
21
20
|
resource_data[:dm_id] = dm_sheet.id
|
22
21
|
resource_data[:gs_content] = g_sheet.content
|
23
22
|
resource_data[:gs_title] = g_sheet.title
|
24
23
|
|
25
|
-
ResourceManager.new(resource_data).create_new_table
|
24
|
+
DmLiveResources::ResourceManager.new(resource_data).create_new_table
|
data/bin/update_db
CHANGED
data/dm_live_resources.gemspec
CHANGED
@@ -9,8 +9,10 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Anthony Seliga"]
|
10
10
|
spec.email = ["anthony.seliga@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.description = %q{
|
12
|
+
spec.summary = %q{Add Google Sheets as live resources in Device Magic.}
|
13
|
+
spec.description = %q{Device Magic users can upload .xlsx files to be referenced within
|
14
|
+
their mobile forms. This project is aimed at automating the same process
|
15
|
+
for Google Sheets to increase the flexibility of resources. }
|
14
16
|
spec.homepage = "https://github.com/aseli1/dm_live_resources"
|
15
17
|
spec.license = "MIT"
|
16
18
|
|
@@ -30,10 +32,10 @@ Gem::Specification.new do |spec|
|
|
30
32
|
spec.executables = ['add_resource', 'update_db']
|
31
33
|
spec.require_paths = ['lib', 'lib/dm_live_resources']
|
32
34
|
|
33
|
-
spec.add_runtime_dependency "httparty", "~> 0.15
|
34
|
-
spec.add_runtime_dependency "trollop", "~> 2.1
|
35
|
-
spec.add_runtime_dependency "sqlite3", "~> 1.3
|
36
|
-
|
35
|
+
spec.add_runtime_dependency "httparty", "~> 0.15"
|
36
|
+
spec.add_runtime_dependency "trollop", "~> 2.1"
|
37
|
+
spec.add_runtime_dependency "sqlite3", "~> 1.3"
|
38
|
+
|
37
39
|
spec.add_development_dependency "bundler", "~> 1.15"
|
38
40
|
spec.add_development_dependency "rake", "~> 10.0"
|
39
41
|
spec.add_development_dependency "minitest", "~> 5.0"
|
@@ -1,67 +1,65 @@
|
|
1
|
-
require 'base64'
|
2
1
|
require 'httparty'
|
3
|
-
require 'sqlite3'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module DmLiveResources
|
4
|
+
class DMSheet
|
5
|
+
attr_reader :api_key, :name, :file, :description, :id, :content_type, :auth, :resource_hash
|
6
|
+
include HTTParty
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
def initialize(args = {})
|
9
|
+
@api_key = args[:dm_api_key]
|
10
|
+
@file = args[:file]
|
11
|
+
@description = args[:description]
|
12
|
+
@name = args[:name] ||= "#{description}.xlsx"
|
13
|
+
@id = args[:dm_id] ||= find_resource_id
|
14
|
+
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
def auth
|
17
|
+
@auth = { username: api_key, password: "p" }
|
18
|
+
end
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
def content_type
|
21
|
+
@content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
22
|
+
end
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
def resource_hash
|
25
|
+
@resource_hash = { "description" => description,"file" => { "file_name" => name,
|
26
|
+
"file_data" => file, "content_type" => content_type }}
|
27
|
+
@resource_hash
|
28
|
+
end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
def request_options
|
31
|
+
@request_options = { basic_auth: auth, body: {"resource" => resource_hash }}
|
32
|
+
@request_options
|
33
|
+
end
|
36
34
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
def id
|
36
|
+
@id = find_resource_id
|
37
|
+
@id
|
38
|
+
end
|
41
39
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
40
|
+
def list_resources
|
41
|
+
options = { basic_auth: auth }
|
42
|
+
response = self.class.get('https://www.devicemagic.com/api/resources.json', options)
|
43
|
+
resources = response['resources']
|
44
|
+
return resources
|
45
|
+
end
|
48
46
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
47
|
+
def find_resource_id
|
48
|
+
resources = list_resources
|
49
|
+
resources.each do |resource|
|
50
|
+
if resource['original_filename'] == name && resource['description'] == description
|
51
|
+
id = resource['id']
|
52
|
+
return id
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
58
56
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
def update_resource
|
64
|
-
self.class.put("https://www.devicemagic.com/api/resources/#{id}.json", request_options)
|
65
|
-
end
|
57
|
+
def add_resource
|
58
|
+
self.class.post('https://www.devicemagic.com/api/resources.json', request_options)
|
59
|
+
end
|
66
60
|
|
61
|
+
def update_resource
|
62
|
+
self.class.put("https://www.devicemagic.com/api/resources/#{id}.json", request_options)
|
63
|
+
end
|
64
|
+
end
|
67
65
|
end
|
@@ -1,45 +1,46 @@
|
|
1
1
|
require 'base64'
|
2
2
|
require 'httparty'
|
3
|
-
require 'sqlite3'
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module DmLiveResources
|
5
|
+
class GSheet
|
6
|
+
attr_reader :api_key, :identifier, :title, :sheets, :content_type, :exported_file, :content
|
7
|
+
include HTTParty
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
def initialize(args = {})
|
10
|
+
@api_key = args[:gs_api_key]
|
11
|
+
@identifier = args[:gs_identifier]
|
12
|
+
@title = args[:gs_title] ||= get_title
|
13
|
+
@sheets = args[:gs_sheets] ||= "Sheet1"
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def content_type
|
17
|
+
@content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
def content
|
21
|
+
options = { :query => {:key => api_key} }
|
22
|
+
request = self.class.get("https://sheets.googleapis.com/v4/spreadsheets/#{identifier}/values:batchGet?#{ranges}", options)
|
23
|
+
@content = request.to_s
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
def get_title
|
27
|
+
params = { mimeType: content_type, key: api_key }
|
28
|
+
request = self.class.get("https://www.googleapis.com/drive/v3/files/#{identifier}", query: params)
|
29
|
+
@title = request["name"]
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
def ranges
|
33
|
+
split_sheets = sheets.split(", ")
|
34
|
+
range = split_sheets.map {|sheet| "ranges=#{sheet}"}
|
35
|
+
range = range.join("&")
|
36
|
+
return range
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def exported_file
|
40
|
+
params = { mimeType: content_type, key: api_key }
|
41
|
+
request = self.class.get("https://www.googleapis.com/drive/v3/files/#{identifier}/export", query: params)
|
42
|
+
contents = request.body
|
43
|
+
@exported_file = Base64.encode64(contents)
|
44
|
+
end
|
44
45
|
end
|
45
46
|
end
|
@@ -1,50 +1,52 @@
|
|
1
|
-
require 'base64'
|
2
|
-
require 'httparty'
|
3
1
|
require 'sqlite3'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
module DmLiveResources
|
4
|
+
class Resource
|
5
|
+
class << self
|
6
|
+
def db
|
7
|
+
if File.exists? "Resources.db"
|
8
|
+
@db = SQLite3::Database.open "Resources.db"
|
9
|
+
else
|
10
|
+
@db = SQLite3::Database.new "Resources.db"
|
11
|
+
end
|
12
|
+
end
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
def remove_db
|
15
|
+
File.delete("Resources.db") if File.exists? "Resources.db"
|
16
|
+
end
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
def update_required?(row,
|
19
|
+
sheet)
|
20
|
+
return row['GSheetContent'] != sheet.content
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
def return_tables
|
24
|
+
# List of all tables in db
|
25
|
+
tables = db.execute("SELECT name FROM sqlite_master WHERE type='table'").flatten
|
26
|
+
return tables
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
def data_as_hash(gs_api_key, gs_identifier, gs_sheets, gs_title, dm_api_key, dm_id)
|
30
|
+
data = { gs_api_key: gs_api_key,
|
31
|
+
gs_identifier: gs_identifier,
|
32
|
+
gs_sheets: gs_sheets,
|
33
|
+
gs_title: gs_title,
|
34
|
+
dm_api_key: dm_api_key,
|
35
|
+
dm_id: dm_id}
|
36
|
+
return data
|
37
|
+
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
def add_gsheet_data(data_hash,
|
40
|
+
file,
|
41
|
+
title)
|
42
|
+
data_hash[:file] = file
|
43
|
+
data_hash[:description] = title
|
44
|
+
return data_hash
|
45
|
+
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
def insert_query(table)
|
48
|
+
return %Q{INSERT INTO '#{table}' ( GSheetApiKey, GSheetIdentifier, GSheetTitle, GSheetContent, GSheetSheets, DMagicApiKey, DMagicId ) VALUES ( ?,?,?,?,?,?,? )}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
50
52
|
end
|
@@ -1,64 +1,62 @@
|
|
1
|
-
require 'base64'
|
2
|
-
require 'httparty'
|
3
|
-
require 'sqlite3'
|
4
|
-
|
5
1
|
require_relative 'g_sheet.rb'
|
6
2
|
require_relative 'dm_sheet.rb'
|
7
3
|
require_relative 'resource.rb'
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
module DmLiveResources
|
6
|
+
class ResourceManager
|
7
|
+
attr_reader :gsheet_api_key, :gsheet_identifier, :gsheet_title, :gsheet_content,
|
8
|
+
:gsheet_sheets, :dmagic_api_key, :dmagic_id, :table_name
|
9
|
+
@@db = Resource.db
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
def initialize(args = {})
|
12
|
+
@gsheet_identifier = args[:gs_identifier]
|
13
|
+
@gsheet_title = args[:gs_title]
|
14
|
+
@gsheet_content = args[:gs_content]
|
15
|
+
@gsheet_sheets = args[:gs_sheets]
|
16
|
+
@gsheet_api_key = args[:gs_api_key]
|
17
|
+
@dmagic_api_key = args[:dm_api_key]
|
18
|
+
@dmagic_id = args[:dm_id]
|
19
|
+
end
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def table_name
|
22
|
+
gsheet_title
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
25
|
+
def create_new_table
|
26
|
+
@@db.execute %Q{
|
27
|
+
CREATE TABLE IF NOT EXISTS #{table_name} (
|
28
|
+
Id INTEGER PRIMARY KEY,
|
29
|
+
GSheetApiKey,
|
30
|
+
GSheetIdentifier,
|
31
|
+
GSheetTitle,
|
32
|
+
GSheetContent,
|
33
|
+
GSheetSheets,
|
34
|
+
DMagicApiKey,
|
35
|
+
DMagicId,
|
36
|
+
DateAdded datetime default current_timestamp)
|
37
|
+
}
|
38
|
+
@@db.execute(Resource.insert_query(table_name), gsheet_api_key, gsheet_identifier, gsheet_title, gsheet_content, gsheet_sheets, dmagic_api_key, dmagic_id)
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
41
|
+
def self.check_tables(tables)
|
42
|
+
@@db.results_as_hash = true
|
43
|
+
tables.each do |table|
|
44
|
+
# Retrieve the last row added to the table
|
45
|
+
row = @@db.get_first_row("SELECT * FROM '#{table}' ORDER BY DateAdded DESC LIMIT 1")
|
46
|
+
resource_data = Resource.data_as_hash(row['GSheetApiKey'], row['GSheetIdentifier'], row['GSheetSheets'], row['GSheetTitle'], row['DMagicApiKey'], row['DMagicId'])
|
47
|
+
sheet = GSheet.new(resource_data)
|
48
|
+
if Resource.update_required?(row, sheet)
|
49
|
+
resource_data = Resource.add_gsheet_data(resource_data, sheet.exported_file, sheet.title)
|
50
|
+
dm = DMSheet.new(resource_data)
|
51
|
+
dm.update_resource
|
52
|
+
@@db.execute(Resource.insert_query(table), sheet.api_key, sheet.identifier, sheet.title, sheet.content, sheet.sheets, dm.api_key, dm.id)
|
53
|
+
end
|
56
54
|
end
|
57
55
|
end
|
58
|
-
end
|
59
56
|
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
def self.update_db_tables
|
58
|
+
tables = Resource.return_tables
|
59
|
+
self.check_tables(tables)
|
60
|
+
end
|
63
61
|
end
|
64
62
|
end
|
data/lib/dm_live_resources.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm_live_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Seliga
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.15
|
19
|
+
version: '0.15'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.15
|
26
|
+
version: '0.15'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: trollop
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.1
|
33
|
+
version: '2.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.1
|
40
|
+
version: '2.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.3
|
47
|
+
version: '1.3'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.3
|
54
|
+
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +94,10 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '5.0'
|
97
|
-
description:
|
97
|
+
description: "Device Magic users can upload .xlsx files to be referenced within\n
|
98
|
+
\ their mobile forms. This project is aimed at automating
|
99
|
+
the same process\n for Google Sheets to increase the flexibility
|
100
|
+
of resources. "
|
98
101
|
email:
|
99
102
|
- anthony.seliga@gmail.com
|
100
103
|
executables:
|
@@ -141,8 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
144
|
version: '0'
|
142
145
|
requirements: []
|
143
146
|
rubyforge_project:
|
144
|
-
rubygems_version: 2.
|
147
|
+
rubygems_version: 2.5.1
|
145
148
|
signing_key:
|
146
149
|
specification_version: 4
|
147
|
-
summary:
|
150
|
+
summary: Add Google Sheets as live resources in Device Magic.
|
148
151
|
test_files: []
|