dm_live_resources 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9812d5ea726dd7da4649422519604c03b9a1b746
4
+ data.tar.gz: fad1973d9356f99d5ffa0b8563f4ce22e3e6ce00
5
+ SHA512:
6
+ metadata.gz: 19f9fd49cdd9efb3391f80b36b04715a66520d704fac420b1437be6711f6494fcc405ec3329d65a7a997957d29f221dc58d5eb8470b1cdf42ee08c9c40e6a5fb
7
+ data.tar.gz: ed7589ac1de0a71174ea5a976e7c7752127f4c9b17ec71af421ce349e164e828a563880a81031dae37cc33732cc621cc925fb09f4f75dd80f7fbaa2380a58c67
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ /pkg
2
+ Gemfile.lock
3
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dm_live_resources.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Anthony Seliga
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # DmLiveResources
2
+
3
+ Convert Google Sheets to be used as Resources in Device Magic.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'dm_live_resources'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install dm_live_resources
20
+
21
+ ## Adding a Resource
22
+
23
+ Trollop is used to pass arguments pertaining to the Google Sheet. For more information on Trollop, see https://github.com/ManageIQ/trollop.
24
+
25
+ To add a Google Sheet as a Resource, within your terminal execute:
26
+
27
+ $ ruby add_resource.rb --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
+
29
+ The first time this script is ran, a 'Resources.db' file will be created in the same directory with a table for the resource data. The Google Sheet will then be added to the Device Magic organization in .xlsx format. Each time thereafter, an additional table will be added to the same database.
30
+
31
+ ## Updating a Resource
32
+
33
+ In your terminal, execute:
34
+
35
+ $ ruby update_db.rb
36
+
37
+ 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.
38
+
39
+ ## Development
40
+
41
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
42
+
43
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
44
+
45
+ ## Contributing
46
+
47
+ Bug reports and pull requests are welcome on GitHub at https://github.com/aseli1/dm_live_resources.
48
+
49
+ ## License
50
+
51
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/Resources.db ADDED
Binary file
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require 'trollop'
3
+ require 'dm_live_resources/resource_manager.rb'
4
+
5
+ resource_data = Trollop::options do
6
+ opt :gs_api_key, "Google Drive API Key", type: :string
7
+ opt :gs_identifier, "Google Sheet Identifier", type: :string
8
+ opt :gs_sheets, "Sheets to track changes in workbook", type: :string
9
+ opt :dm_api_key, "Device Magic API Key", type: :string
10
+ end
11
+
12
+ g_sheet = GSheet.new(resource_data)
13
+
14
+
15
+ resource_data[:file] = g_sheet.exported_file
16
+ resource_data[:description] = g_sheet.title
17
+
18
+ dm_sheet = DMSheet.new(resource_data)
19
+ dm_sheet.add_resource
20
+
21
+ resource_data[:dm_id] = dm_sheet.id
22
+ resource_data[:gs_content] = g_sheet.content
23
+ resource_data[:gs_title] = g_sheet.title
24
+
25
+ ResourceManager.new(resource_data).create_new_table
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "dm_live_resources"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/bin/update_db.rb ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'lib/dm_live_resources/resource_manager.rb'
3
+
4
+ ResourceManager.update_db_tables
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "dm_live_resources/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "dm_live_resources"
8
+ spec.version = DmLiveResources::VERSION
9
+ spec.authors = ["Anthony Seliga"]
10
+ spec.email = ["anthony.seliga@gmail.com"]
11
+
12
+ spec.summary = %q{Convert Google Sheets to be used as Resources in Device Magic.}
13
+ spec.description = %q{Convert Google Sheets to be used as Resources in Device Magic.}
14
+ spec.homepage = "https://github.com/aseli1/dm_live_resources"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = 'https://rubygems.org'
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = 'bin'
30
+ spec.executables = ['add_resource.rb', 'update_db.rb']
31
+ spec.require_paths = ['lib', 'lib/dm_live_resources']
32
+
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
+
37
+ spec.add_development_dependency "bundler", "~> 1.15"
38
+ spec.add_development_dependency "rake", "~> 10.0"
39
+ spec.add_development_dependency "minitest", "~> 5.0"
40
+ end
@@ -0,0 +1,67 @@
1
+ require 'base64'
2
+ require 'httparty'
3
+ require 'sqlite3'
4
+
5
+ class DMSheet
6
+ attr_reader :api_key, :name, :file, :description, :id, :content_type, :auth,
7
+ :resource_hash
8
+ include HTTParty
9
+
10
+ def initialize(args = {})
11
+ @api_key = args[:dm_api_key]
12
+ @file = args[:file]
13
+ @description = args[:description]
14
+ @name = args[:name] ||= "#{description}.xlsx"
15
+ @id = args[:dm_id] ||= find_resource_id
16
+ end
17
+
18
+ def auth
19
+ @auth = { username: api_key, password: "p" }
20
+ end
21
+
22
+ def content_type
23
+ @content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
24
+ end
25
+
26
+ def resource_hash
27
+ @resource_hash = { "description" => description,"file" => { "file_name" => name,
28
+ "file_data" => file, "content_type" => content_type }}
29
+ @resource_hash
30
+ end
31
+
32
+ def request_options
33
+ @request_options = { basic_auth: auth, body: {"resource" => resource_hash }}
34
+ @request_options
35
+ end
36
+
37
+ def id
38
+ @id = find_resource_id
39
+ @id
40
+ end
41
+
42
+ def list_resources
43
+ options = { basic_auth: auth }
44
+ response = self.class.get('https://www.devicemagic.com/api/resources.json', options)
45
+ resources = response['resources']
46
+ return resources
47
+ end
48
+
49
+ def find_resource_id
50
+ resources = list_resources
51
+ resources.each do |resource|
52
+ if resource['original_filename'] == name && resource['description'] == description
53
+ id = resource['id']
54
+ return id
55
+ end
56
+ end
57
+ end
58
+
59
+ def add_resource
60
+ self.class.post('https://www.devicemagic.com/api/resources.json', request_options)
61
+ end
62
+
63
+ def update_resource
64
+ self.class.put("https://www.devicemagic.com/api/resources/#{id}.json", request_options)
65
+ end
66
+
67
+ end
@@ -0,0 +1,45 @@
1
+ require 'base64'
2
+ require 'httparty'
3
+ require 'sqlite3'
4
+
5
+ class GSheet
6
+ attr_reader :api_key, :identifier, :title, :sheets, :content_type, :exported_file, :content
7
+ include HTTParty
8
+
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
+
16
+ def content_type
17
+ @content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
18
+ end
19
+
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
+
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
+
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
+
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
45
+ end
@@ -0,0 +1,50 @@
1
+ require 'base64'
2
+ require 'httparty'
3
+ require 'sqlite3'
4
+
5
+ class Resource
6
+ class << self
7
+
8
+ def db
9
+ if File.exists? "Resources.db"
10
+ @db = SQLite3::Database.open "Resources.db"
11
+ else
12
+ @db = SQLite3::Database.new "Resources.db"
13
+ end
14
+ end
15
+
16
+ def remove_db
17
+ File.delete("Resources.db") if File.exists? "Resources.db"
18
+ end
19
+
20
+ def update_required?(row, sheet)
21
+ return row['GSheetContent'] != sheet.content
22
+ end
23
+
24
+ def return_tables
25
+ # List of all tables in db
26
+ tables = db.execute("SELECT name FROM sqlite_master WHERE type='table'").flatten
27
+ return tables
28
+ end
29
+
30
+ def data_as_hash(gs_api_key, gs_identifier, gs_sheets, gs_title, dm_api_key, dm_id)
31
+ data = {gs_api_key: gs_api_key,
32
+ gs_identifier: gs_identifier,
33
+ gs_sheets: gs_sheets,
34
+ gs_title: gs_title,
35
+ dm_api_key: dm_api_key,
36
+ dm_id: dm_id}
37
+ return data
38
+ end
39
+
40
+ def add_gsheet_data(data_hash, file, title)
41
+ data_hash[:file] = file
42
+ data_hash[:description] = title
43
+ return data_hash
44
+ end
45
+
46
+ def insert_query(table)
47
+ return %Q{INSERT INTO '#{table}' ( GSheetApiKey, GSheetIdentifier, GSheetTitle, GSheetContent, GSheetSheets, DMagicApiKey, DMagicId ) VALUES ( ?,?,?,?,?,?,? )}
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,64 @@
1
+ require 'base64'
2
+ require 'httparty'
3
+ require 'sqlite3'
4
+
5
+ require_relative 'g_sheet.rb'
6
+ require_relative 'dm_sheet.rb'
7
+ require_relative 'resource.rb'
8
+
9
+ class ResourceManager
10
+ attr_reader :gsheet_api_key, :gsheet_identifier, :gsheet_title, :gsheet_content,
11
+ :gsheet_sheets, :dmagic_api_key, :dmagic_id, :table_name
12
+ @@db = Resource.db
13
+
14
+ def initialize(args = {})
15
+ @gsheet_identifier = args[:gs_identifier]
16
+ @gsheet_title = args[:gs_title]
17
+ @gsheet_content = args[:gs_content]
18
+ @gsheet_sheets = args[:gs_sheets]
19
+ @gsheet_api_key = args[:gs_api_key]
20
+ @dmagic_api_key = args[:dm_api_key]
21
+ @dmagic_id = args[:dm_id]
22
+ end
23
+
24
+ def table_name
25
+ gsheet_title
26
+ end
27
+
28
+ def create_new_table
29
+ @@db.execute %Q{
30
+ CREATE TABLE IF NOT EXISTS #{table_name} (
31
+ Id INTEGER PRIMARY KEY,
32
+ GSheetApiKey,
33
+ GSheetIdentifier,
34
+ GSheetTitle,
35
+ GSheetContent,
36
+ GSheetSheets,
37
+ DMagicApiKey,
38
+ DMagicId,
39
+ DateAdded datetime default current_timestamp)
40
+ }
41
+ @@db.execute(Resource.insert_query(table_name), gsheet_api_key, gsheet_identifier, gsheet_title, gsheet_content, gsheet_sheets, dmagic_api_key, dmagic_id)
42
+ end
43
+
44
+ def self.check_tables(tables)
45
+ @@db.results_as_hash = true
46
+ tables.each do |table|
47
+ # Retrieve the last row added to the table
48
+ row = @@db.get_first_row("SELECT * FROM '#{table}' ORDER BY DateAdded DESC LIMIT 1")
49
+ resource_data = Resource.data_as_hash(row['GSheetApiKey'], row['GSheetIdentifier'], row['GSheetSheets'], row['GSheetTitle'], row['DMagicApiKey'], row['DMagicId'])
50
+ sheet = GSheet.new(resource_data)
51
+ if Resource.update_required?(row, sheet)
52
+ resource_data = Resource.add_gsheet_data(resource_data, sheet.exported_file, sheet.title)
53
+ dm = DMSheet.new(resource_data)
54
+ dm.update_resource
55
+ @@db.execute(Resource.insert_query(table), sheet.api_key, sheet.identifier, sheet.title, sheet.content, sheet.sheets, dm.api_key, dm.id)
56
+ end
57
+ end
58
+ end
59
+
60
+ def self.update_db_tables
61
+ tables = Resource.return_tables
62
+ self.check_tables(tables)
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module DmLiveResources
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "dm_live_resources/version"
2
+
3
+ module DmLiveResources
4
+
5
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm_live_resources
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Anthony Seliga
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.15'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.15'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.0'
97
+ description: Convert Google Sheets to be used as Resources in Device Magic.
98
+ email:
99
+ - anthony.seliga@gmail.com
100
+ executables:
101
+ - add_resource.rb
102
+ - update_db.rb
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - ".gitignore"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - bin/Resources.db
112
+ - bin/add_resource.rb
113
+ - bin/console
114
+ - bin/setup
115
+ - bin/update_db.rb
116
+ - dm_live_resources.gemspec
117
+ - lib/dm_live_resources.rb
118
+ - lib/dm_live_resources/dm_sheet.rb
119
+ - lib/dm_live_resources/g_sheet.rb
120
+ - lib/dm_live_resources/resource.rb
121
+ - lib/dm_live_resources/resource_manager.rb
122
+ - lib/dm_live_resources/version.rb
123
+ homepage: https://github.com/aseli1/dm_live_resources
124
+ licenses:
125
+ - MIT
126
+ metadata:
127
+ allowed_push_host: https://rubygems.org
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ - lib/dm_live_resources
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 2.5.1
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: Convert Google Sheets to be used as Resources in Device Magic.
149
+ test_files: []