cog-rb 0.1.5
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 +7 -0
- data/.gitignore +9 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.MD +1 -0
- data/Gemfile +4 -0
- data/LICENSE +13 -0
- data/README.md +45 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/cog-rb.gemspec +21 -0
- data/lib/cog/bundle.rb +40 -0
- data/lib/cog/command.rb +65 -0
- data/lib/cog/config.rb +18 -0
- data/lib/cog/request.rb +27 -0
- data/lib/cog/response.rb +48 -0
- data/lib/cog/service.rb +70 -0
- data/lib/cog/services/memory.rb +17 -0
- data/lib/cog/services/metadata.rb +7 -0
- data/lib/cog/version.rb +3 -0
- data/lib/cog.rb +19 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5858a013f657bf57c9dc372951d33d4f915ce73f
|
4
|
+
data.tar.gz: c7318d78922ad2f13da3899069f73b815c2d1904
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4bbb2620093d355de471842989e383b47c72e18fa02f3ae395d07cb856b956fdfe419864a6fc2eda95bb2be44e89beebd036db2b7f1eb6593d2e026b61fe47da
|
7
|
+
data.tar.gz: be7ee2c72c195907a2f7d9d2727f6f79fcf9b87cec35e70db0cd3f21b8c5a54087489fb458d6880c94929453445d579dadb3013b9152dce6c6f91bb24be02baf
|
data/.gitignore
ADDED
data/CODE_OF_CONDUCT.md
ADDED
data/CONTRIBUTING.MD
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
For information about making contributions to this project please see [CONTRIBUTING.md](https://github.com/operable/cog/blob/master/CONTRIBUTING.md) in the main [Cog](https://github.com/operable/cog) repo.
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2015 Operable, Inc.
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# cog-rb
|
2
|
+
|
3
|
+
Simple, opinionated library for building Cog commands in Ruby.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
First, create a file named `cog-command` at the top level of your project directory. This file should look something like the following, with `format` replaced with the name of your bundle:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
#!/usr/bin/env ruby
|
11
|
+
|
12
|
+
# Make sure we're in the top-level directory for the command
|
13
|
+
# since so many paths are relative.
|
14
|
+
Dir.chdir(File.dirname(__FILE__))
|
15
|
+
|
16
|
+
require 'bundler/setup'
|
17
|
+
require 'cog'
|
18
|
+
|
19
|
+
Cog.bundle('format')
|
20
|
+
```
|
21
|
+
|
22
|
+
This file will be the target `executable` for every command in your bundle. The library handles routing commands to the correct class based on the command name. Note: The permissions on this file must allow it to be run by your Relay.
|
23
|
+
|
24
|
+
The class that implements your command should be named the same as your command and should be declared in a namespace named after your bundle within the `CogCmd` toplevel namespace. For instance, if you had a bundle named **test** and a command named **dump**, the class that implements the **dump** command would be called `CogCmd::Test::Dump`. The implementation for the command would live in `lib/cog_cmd/test/dump.rb` relative to the location of your `cog-command` script.
|
25
|
+
|
26
|
+
## Examples
|
27
|
+
|
28
|
+
See the [cog-bundles/format](https://github.com/cog-bundles/format) repository for an example of this library in action.
|
29
|
+
|
30
|
+
## Installation
|
31
|
+
|
32
|
+
Add this line to your application's Gemfile:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
gem 'cog-rb'
|
36
|
+
```
|
37
|
+
|
38
|
+
And then execute:
|
39
|
+
|
40
|
+
$ bundle
|
41
|
+
|
42
|
+
Or install it yourself as:
|
43
|
+
|
44
|
+
$ gem install cog-rb
|
45
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "cog/rb"
|
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
|
data/bin/setup
ADDED
data/cog-rb.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cog/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "cog-rb"
|
8
|
+
spec.version = Cog::VERSION
|
9
|
+
spec.authors = ["Mark Imbriaco"]
|
10
|
+
spec.email = ["mark@operable.io"]
|
11
|
+
|
12
|
+
spec.summary = "Cog command helper library"
|
13
|
+
spec.homepage = "https://github.com/cog-bundles/cog-rb"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
spec.bindir = "bin"
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
21
|
+
end
|
data/lib/cog/bundle.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
class Cog
|
2
|
+
class Bundle
|
3
|
+
attr_reader :name, :config
|
4
|
+
|
5
|
+
def initialize(name, base_dir: nil, config_file: nil)
|
6
|
+
@name = name
|
7
|
+
@base_dir = base_dir || File.dirname($0)
|
8
|
+
@config = load_config(config_file || File.join(@base_dir, 'config.yaml'))
|
9
|
+
@module = create_bundle_module
|
10
|
+
|
11
|
+
load_commands
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_bundle_module
|
15
|
+
return if Object.const_defined?('CogCmd')
|
16
|
+
|
17
|
+
Object.const_set('CogCmd', Module.new)
|
18
|
+
CogCmd.const_set(@name.capitalize, Module.new)
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_config(path=nil)
|
22
|
+
path ||= File.join(@base_dir, 'config.yaml')
|
23
|
+
Cog::Config.new(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def load_commands
|
27
|
+
@config[:commands].each do |command, config|
|
28
|
+
require File.join(@base_dir, 'lib', 'cog_cmd', @name, command)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_command
|
33
|
+
command = ENV['COG_COMMAND']
|
34
|
+
command_class = command.gsub(/(\A|_)([a-z])/) { $2.upcase }
|
35
|
+
|
36
|
+
target = @module.const_get(command_class).new
|
37
|
+
target.execute
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/cog/command.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class Cog
|
5
|
+
class Command
|
6
|
+
attr_writer :memory_key, :config
|
7
|
+
|
8
|
+
def request
|
9
|
+
@request ||= Cog::Request.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def response
|
13
|
+
@response ||= Cog::Response.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def memory_key
|
17
|
+
@memory_key ||= ENV['COG_INVOCATION_ID']
|
18
|
+
end
|
19
|
+
|
20
|
+
def config
|
21
|
+
@config ||= { input: self.class.input }
|
22
|
+
end
|
23
|
+
|
24
|
+
def step
|
25
|
+
step = ENV['COG_INVOCATION_STEP']
|
26
|
+
step.nil? ? nil : step.to_sym
|
27
|
+
end
|
28
|
+
|
29
|
+
def accumulate_input
|
30
|
+
Cog::Services::Memory.accum(memory_key, request.input)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch_input
|
34
|
+
JSON.parse(Cog::Services::Memory.get(memory_key))
|
35
|
+
end
|
36
|
+
|
37
|
+
def execute
|
38
|
+
accumulate_input if config[:input] == :accumulate
|
39
|
+
run_command
|
40
|
+
response.send
|
41
|
+
end
|
42
|
+
|
43
|
+
def env_var(var, suffix: nil, required: false, failure_message: nil)
|
44
|
+
key = suffix ? "#{var}_#{suffix.upcase}" : var
|
45
|
+
value = ENV[key]
|
46
|
+
|
47
|
+
if required and value.nil?
|
48
|
+
message = failure_message ? failure_message : "Required environment variable #{key} missing!"
|
49
|
+
fail(message)
|
50
|
+
else
|
51
|
+
value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def fail(message)
|
56
|
+
STDERR.puts(message)
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.input(value=nil)
|
61
|
+
return @input if value.nil?
|
62
|
+
@input = value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/cog/config.rb
ADDED
data/lib/cog/request.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class Cog
|
5
|
+
class Request
|
6
|
+
attr_reader :options, :args, :input
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@args = populate_args
|
10
|
+
@options = populate_options
|
11
|
+
@input = JSON.parse(STDIN.read)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def populate_args
|
17
|
+
(0 .. (ENV['COG_ARGC'].to_i - 1)).map { |n| ENV["COG_ARGV_#{n}"] }
|
18
|
+
end
|
19
|
+
|
20
|
+
def populate_options
|
21
|
+
return {} if ENV['COG_OPTS'].nil?
|
22
|
+
|
23
|
+
options = ENV["COG_OPTS"].split(",")
|
24
|
+
Hash[options.map { |opt| [ opt, ENV["COG_OPT_#{opt.upcase}"] ]}]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/cog/response.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class Cog
|
5
|
+
class Response
|
6
|
+
LOG_LEVELS = [ :debug, :info, :warn, :err, :error ]
|
7
|
+
|
8
|
+
attr_accessor :template, :content
|
9
|
+
|
10
|
+
def []=(key, value)
|
11
|
+
@content ||= {}
|
12
|
+
@content[key] = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def send
|
16
|
+
return if content.nil?
|
17
|
+
|
18
|
+
write "COG_TEMPLATE: #{@template}" unless @template.nil?
|
19
|
+
|
20
|
+
case content.class
|
21
|
+
when String
|
22
|
+
write @content.join('').to_json
|
23
|
+
else
|
24
|
+
write "JSON\n" + @content.to_json
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def write(message)
|
29
|
+
self.class.write(message)
|
30
|
+
end
|
31
|
+
|
32
|
+
def log(level, message)
|
33
|
+
self.class.log(level, message)
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
def write(message)
|
38
|
+
puts message
|
39
|
+
STDOUT.flush
|
40
|
+
end
|
41
|
+
|
42
|
+
def log(level, message)
|
43
|
+
level = LOG_LEVELS.include?(level) ? level : :info
|
44
|
+
write "COGCMD_#{level.to_s.upcase}: #{message}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/cog/service.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
class Cog
|
5
|
+
class Service
|
6
|
+
class << self
|
7
|
+
def headers
|
8
|
+
{
|
9
|
+
"Authorization" => "pipeline #{ENV['COG_SERVICE_TOKEN']}",
|
10
|
+
"Content-Type" => "application/json"
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def uri_for(path=nil)
|
15
|
+
service_path =
|
16
|
+
if path.class == URI::HTTP
|
17
|
+
path
|
18
|
+
else
|
19
|
+
[ service_name, version, path ].compact.join('/')
|
20
|
+
end
|
21
|
+
|
22
|
+
URI(ENV['COG_SERVICES_ROOT'] + '/v1/services/' + service_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def service_name
|
26
|
+
get_const('SERVICE_NAME', self.to_s.split('::').last.downcase)
|
27
|
+
end
|
28
|
+
|
29
|
+
def version
|
30
|
+
get_const('VERSION')
|
31
|
+
end
|
32
|
+
|
33
|
+
def get(path=nil)
|
34
|
+
uri = uri_for(path)
|
35
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
36
|
+
req = Net::HTTP::Get.new(uri)
|
37
|
+
headers.each { |k,v| req[k] = v }
|
38
|
+
http.request(req)
|
39
|
+
end
|
40
|
+
|
41
|
+
res.body
|
42
|
+
end
|
43
|
+
|
44
|
+
def post(path: nil, data: nil)
|
45
|
+
put_or_post(:post, path: path, data: data)
|
46
|
+
end
|
47
|
+
|
48
|
+
def put(path: nil, data: nil)
|
49
|
+
put_or_post(:put, path: path, data: data)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def get_const(name, default=nil)
|
55
|
+
self.const_defined?(name) ? self.const_get(name) : default
|
56
|
+
end
|
57
|
+
|
58
|
+
def put_or_post(type, path: nil, data: nil)
|
59
|
+
uri = uri_for(path)
|
60
|
+
http_class = (type == :post) ? Net::HTTP::Post : Net::HTTP::Put
|
61
|
+
req = http_class.new(uri, headers)
|
62
|
+
req.body = data
|
63
|
+
|
64
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
65
|
+
http.request(req)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Cog
|
2
|
+
class Services
|
3
|
+
class Memory < Cog::Service
|
4
|
+
VERSION = "1.0.0"
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def accum(key, value)
|
8
|
+
post(path: key, data: { "op" => "accum", "value" => value }.to_json)
|
9
|
+
end
|
10
|
+
|
11
|
+
def replace(key, value)
|
12
|
+
put(path: key, data: value.to_s)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/cog/version.rb
ADDED
data/lib/cog.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
require_relative 'cog/bundle'
|
3
|
+
require_relative 'cog/config'
|
4
|
+
require_relative 'cog/command'
|
5
|
+
require_relative 'cog/request'
|
6
|
+
require_relative 'cog/response'
|
7
|
+
require_relative 'cog/version'
|
8
|
+
|
9
|
+
require_relative 'cog/service'
|
10
|
+
require_relative 'cog/services/memory'
|
11
|
+
require_relative 'cog/services/metadata'
|
12
|
+
|
13
|
+
class Cog
|
14
|
+
def self.bundle(name)
|
15
|
+
bundle = Cog::Bundle.new(name)
|
16
|
+
yield bundle if block_given?
|
17
|
+
bundle.run_command
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cog-rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Imbriaco
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- mark@operable.io
|
30
|
+
executables:
|
31
|
+
- console
|
32
|
+
- setup
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- ".gitignore"
|
37
|
+
- CODE_OF_CONDUCT.md
|
38
|
+
- CONTRIBUTING.MD
|
39
|
+
- Gemfile
|
40
|
+
- LICENSE
|
41
|
+
- README.md
|
42
|
+
- Rakefile
|
43
|
+
- bin/console
|
44
|
+
- bin/setup
|
45
|
+
- cog-rb.gemspec
|
46
|
+
- lib/cog.rb
|
47
|
+
- lib/cog/bundle.rb
|
48
|
+
- lib/cog/command.rb
|
49
|
+
- lib/cog/config.rb
|
50
|
+
- lib/cog/request.rb
|
51
|
+
- lib/cog/response.rb
|
52
|
+
- lib/cog/service.rb
|
53
|
+
- lib/cog/services/memory.rb
|
54
|
+
- lib/cog/services/metadata.rb
|
55
|
+
- lib/cog/version.rb
|
56
|
+
homepage: https://github.com/cog-bundles/cog-rb
|
57
|
+
licenses: []
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.4.5.1
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Cog command helper library
|
79
|
+
test_files: []
|