packethost 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ require 'bundler/gem_tasks'
6
+
7
+ begin
8
+ Bundler.setup(:default, :development)
9
+ rescue Bundler::BundlerError => e
10
+ $stderr.puts e.message
11
+ $stderr.puts 'Run `bundle install` to install missing gems'
12
+ exit e.status_code
13
+ end
14
+
15
+ require 'rspec/core'
16
+ require 'rspec/core/rake_task'
17
+ RSpec::Core::RakeTask.new(:spec) do |spec|
18
+ spec.pattern = FileList['spec/**/*_spec.rb']
19
+ end
20
+
21
+ require 'rubocop/rake_task'
22
+ RuboCop::RakeTask.new
23
+
24
+ desc 'Run the CI suite'
25
+ task ci: [:spec, :rubocop]
26
+
27
+ task default: :ci
28
+
29
+ require 'rdoc/task'
30
+ Rake::RDocTask.new do |rdoc|
31
+ version = File.exist?('VERSION') ? File.read('VERSION') : ''
32
+
33
+ rdoc.rdoc_dir = 'rdoc'
34
+ rdoc.title = "packet #{version}"
35
+ rdoc.rdoc_files.include('README*')
36
+ rdoc.rdoc_files.include('lib/**/*.rb')
37
+ end
@@ -0,0 +1,34 @@
1
+ module Packet
2
+ class Client
3
+ module Devices
4
+ def list_devices(project_id, *args)
5
+ get("projects/#{project_id}/devices", *args).body['devices'].map { |p| Packet::Device.new(p, self) }
6
+ end
7
+
8
+ def get_device(id, *args)
9
+ Packet::Device.new(get("devices/#{id}", *args).body, self)
10
+ end
11
+
12
+ def create_device(device)
13
+ post("projects/#{device.project_id}/devices", device.to_hash).tap do |response|
14
+ device.update_attributes(response.body)
15
+ end
16
+ end
17
+
18
+ def update_device(device)
19
+ patch("devices/#{device.id}", device.to_hash).tap do |response|
20
+ device.update_attributes(response.body)
21
+ end
22
+ end
23
+
24
+ def delete_device(device_or_id)
25
+ id = if device_or_id.is_a?(Packet::Device)
26
+ device_or_id.id
27
+ else
28
+ device_or_id
29
+ end
30
+ delete("devices/#{id}")
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Client
3
+ module Facilities
4
+ def list_facilities(*args)
5
+ get('facilities', *args).body['facilities'].map { |p| Packet::Facility.new(p, self) }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Client
3
+ module OperatingSystems
4
+ def list_operating_systems(*args)
5
+ get('operating-systems', *args).body['operating_systems'].map { |p| Packet::OperatingSystem.new(p, self) }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Client
3
+ module Plans
4
+ def list_plans(*args)
5
+ get('plans', *args).body['plans'].map { |p| Packet::Plan.new(p, self) }
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ module Packet
2
+ class Client
3
+ module Projects
4
+ def list_projects(*args)
5
+ get('projects', *args).body['projects'].map { |p| Packet::Project.new(p, self) }
6
+ end
7
+
8
+ def get_project(id, *args)
9
+ Packet::Project.new(get("projects/#{id}", *args).body, self)
10
+ end
11
+
12
+ def create_project(project)
13
+ post('projects', project.to_hash).tap do |response|
14
+ project.update_attributes(response.body)
15
+ end
16
+ end
17
+
18
+ def update_project(project)
19
+ patch("projects/#{project.id}", project.to_hash).tap do |response|
20
+ project.update_attributes(response.body)
21
+ end
22
+ end
23
+
24
+ def delete_project(project_or_id)
25
+ id = if project_or_id.is_a?(Packet::Project)
26
+ project_or_id.id
27
+ else
28
+ project_or_id
29
+ end
30
+ delete("projects/#{id}")
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module Packet
2
+ class Client
3
+ module SshKeys
4
+ def list_ssh_keys(*args)
5
+ get('ssh-keys', *args).body['ssh_keys'].map { |p| Packet::SshKey.new(p, self) }
6
+ end
7
+
8
+ def get_ssh_key(id, *args)
9
+ Packet::SshKey.new(get("ssh-keys/#{id}", *args).body, self)
10
+ end
11
+
12
+ def create_ssh_key(ssh_key)
13
+ post('ssh-keys', ssh_key.to_hash).tap do |response|
14
+ ssh_key.update_attributes(response.body)
15
+ end
16
+ end
17
+
18
+ def update_ssh_key(ssh_key)
19
+ patch("ssh-keys/#{ssh_key.id}", ssh_key.to_hash).tap do |response|
20
+ ssh_key.update_attributes(response.body)
21
+ end
22
+ end
23
+
24
+ def delete_ssh_key(ssh_key_or_id)
25
+ id = if ssh_key_or_id.is_a?(Packet::SshKey)
26
+ ssh_key_or_id.id
27
+ else
28
+ ssh_key_or_id
29
+ end
30
+ delete("ssh-keys/#{id}")
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Client
3
+ module Users
4
+ def get_user(id, *args)
5
+ Packet::User.new(get("users/#{id}", *args).body, self)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,70 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+
4
+ require 'packet/entity'
5
+
6
+ %w(device facility operating_system plan project ssh_key user).each do |f|
7
+ require "packet/#{f}"
8
+ require "packet/client/#{f.pluralize}"
9
+ end
10
+
11
+ module Packet
12
+ class Client
13
+ attr_accessor :auth_token, :consumer_token, :url
14
+
15
+ def initialize(auth_token = nil, consumer_token = nil, url = nil)
16
+ self.url = url || Packet.configuration.url
17
+ self.auth_token = auth_token || Packet.configuration.auth_token
18
+ self.consumer_token = consumer_token || Packet.configuration.consumer_token
19
+ end
20
+
21
+ [:get, :post, :patch, :head, :delete].each do |method|
22
+ define_method(method) do |*args|
23
+ response = client.send(method, *args)
24
+ fail_on_error(response) || response
25
+ end
26
+ end
27
+
28
+ def inspect
29
+ %(#<#{self.class}:#{format('%014x', (object_id << 1))}>)
30
+ end
31
+
32
+ private
33
+
34
+ def client
35
+ @client ||= Faraday.new(url: url, headers: headers, ssl: { verify: true }) do |faraday|
36
+ faraday.request :json
37
+ faraday.response :json, content_type: /\bjson$/
38
+ faraday.adapter Faraday.default_adapter
39
+ end
40
+ end
41
+
42
+ def headers
43
+ {
44
+ 'X-Consumer-Token' => consumer_token,
45
+ 'X-Auth-Token' => auth_token,
46
+ # 'X-Packet-Staff' => '1',
47
+ 'Content-Type' => 'application/json',
48
+ 'Accept' => 'application/json'
49
+ }.reject { |_, v| v.nil? }
50
+ end
51
+
52
+ def fail_on_error(response)
53
+ return if response.success?
54
+
55
+ klass = case response.status
56
+ when 404 then NotFound
57
+ else Error
58
+ end
59
+ fail klass, response.body
60
+ end
61
+
62
+ include Packet::Client::Devices
63
+ include Packet::Client::Facilities
64
+ include Packet::Client::OperatingSystems
65
+ include Packet::Client::Plans
66
+ include Packet::Client::Projects
67
+ include Packet::Client::SshKeys
68
+ include Packet::Client::Users
69
+ end
70
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Configuration
3
+ attr_accessor :url, :auth_token, :consumer_token
4
+
5
+ def initialize
6
+ @url = 'https://api.packet.net'.freeze
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Packet
2
+ class Device
3
+ include Entity
4
+
5
+ attr_accessor :hostname
6
+
7
+ has_timestamps
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support/concern'
3
+
4
+ module Packet
5
+ module Entity
6
+ module Associations
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods
10
+ def has_one(association)
11
+ require "packet/#{association}"
12
+ casts(association, lambda do |value|
13
+ klass = "Packet::#{association.to_s.classify}".constantize
14
+ klass.new(value, client)
15
+ end)
16
+ end
17
+
18
+ def has_many(association)
19
+ require "packet/#{association.to_s.singularize}"
20
+ casts(association, lambda do |value|
21
+ klass = "Packet::#{association.to_s.classify}".constantize
22
+ value.map { |v| klass.new(v, client) }
23
+ end)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support/concern'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/module/delegation'
5
+
6
+ module Packet
7
+ module Entity
8
+ module Base
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ class_attribute :_casts
13
+ self._casts = {}
14
+
15
+ attr_accessor :client, :id
16
+ delegate :resource_name, to: :class
17
+ end
18
+
19
+ def initialize(attributes = {}, client = nil)
20
+ self.client = client
21
+ update_attributes(attributes)
22
+ end
23
+
24
+ def update_attributes(attributes = {})
25
+ attributes.each_pair do |attribute, value|
26
+ setter = "#{attribute}="
27
+ send(setter, _cast_value(attribute, value)) if respond_to?(setter)
28
+ end
29
+ end
30
+
31
+ def client
32
+ @client || Packet.client
33
+ end
34
+
35
+ module ClassMethods
36
+ def casts(attribute, transformer)
37
+ _casts[attribute.to_sym] = transformer
38
+ attr_accessor attribute.to_sym
39
+ end
40
+
41
+ def resource_name
42
+ to_s.demodulize.underscore
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def _cast_value(attribute, value)
49
+ if self.class._casts.key?(attribute.to_sym)
50
+ callback = self.class._casts[attribute.to_sym]
51
+ instance_exec(value, &callback)
52
+ else
53
+ value
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support/concern'
3
+
4
+ module Packet
5
+ module Entity
6
+ module Finders
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods
10
+ def all(params = {}, client = nil)
11
+ (client || Packet.client).send(:"list_#{resource_name.pluralize}", params)
12
+ end
13
+
14
+ def find(id, params = {}, client = nil)
15
+ (client || Packet.client).send(:"get_#{resource_name}", id, params)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ require 'active_support/concern'
2
+
3
+ module Packet
4
+ module Entity
5
+ module Persistence
6
+ extend ActiveSupport::Concern
7
+
8
+ def save!
9
+ if id
10
+ client.send("update_#{resource_name}", self)
11
+ else
12
+ client.send("create_#{resource_name}", self)
13
+ end
14
+ true
15
+ end
16
+
17
+ def destroy!
18
+ client.send("delete_#{resource_name}", self)
19
+ true
20
+ end
21
+
22
+ module ClassMethods
23
+ def create!(attributes = {}, client = nil)
24
+ new(attributes, client).tap(&:save!)
25
+ end
26
+
27
+ def destroy!(id, client = nil)
28
+ (client || Packet.client).send("delete_#{resource_name}", id)
29
+ true
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ require 'active_support/concern'
2
+
3
+ module Packet
4
+ module Entity
5
+ module Serialization
6
+ extend ActiveSupport::Concern
7
+
8
+ def to_hash
9
+ instance_variables.reject { |ivar| [:@client].include?(ivar) }.map do |ivar|
10
+ [ivar.to_s.tr('@', ''), instance_variable_get(ivar)]
11
+ end.to_h
12
+ end
13
+ alias_method :to_h, :to_hash
14
+ end
15
+ end
16
+ end