copperegg-revealmetrics 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -19
- data/lib/copperegg/revealmetrics.rb +17 -0
- data/lib/copperegg/revealmetrics/api.rb +28 -0
- data/lib/copperegg/revealmetrics/custom_dashboard.rb +142 -0
- data/lib/copperegg/revealmetrics/metric_group.rb +127 -0
- data/lib/copperegg/revealmetrics/metric_sample.rb +26 -0
- data/lib/copperegg/revealmetrics/mixins/persistence.rb +124 -0
- data/lib/copperegg/revealmetrics/tag.rb +97 -0
- data/lib/copperegg/revealmetrics/ver.rb +7 -0
- data/test/custom_dashboard_test.rb +28 -28
- data/test/metric_group_test.rb +11 -11
- data/test/metric_sample_test.rb +2 -2
- data/test/tag_test.rb +12 -12
- metadata +9 -9
- data/lib/copperegg.rb +0 -13
- data/lib/copperegg/api.rb +0 -24
- data/lib/copperegg/custom_dashboard.rb +0 -138
- data/lib/copperegg/metric_group.rb +0 -123
- data/lib/copperegg/metric_sample.rb +0 -22
- data/lib/copperegg/mixins/persistence.rb +0 -118
- data/lib/copperegg/tag.rb +0 -94
- data/lib/copperegg/ver.rb +0 -3
data/test/metric_sample_test.rb
CHANGED
data/test/tag_test.rb
CHANGED
@@ -1,51 +1,51 @@
|
|
1
1
|
require "test/unit"
|
2
|
-
require "copperegg"
|
2
|
+
require "copperegg/revealmetrics"
|
3
3
|
|
4
4
|
class TagTest < Test::Unit::TestCase
|
5
5
|
|
6
6
|
def test_name_accessor_and_setter
|
7
|
-
tag =
|
7
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
|
8
8
|
|
9
9
|
assert_equal "my_tag", tag.name
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_save_should_fail_if_name_is_blank
|
13
|
-
tag =
|
13
|
+
tag = Copperegg::Revealmetrics::Tag.new
|
14
14
|
|
15
|
-
error = assert_raise(
|
15
|
+
error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
|
16
16
|
assert_equal "Name can't be blank.", error.message
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_save_should_fail_if_name_contains_invalid_characters
|
20
|
-
tag =
|
20
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "my%%%tag")
|
21
21
|
|
22
|
-
error = assert_raise(
|
22
|
+
error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
|
23
23
|
assert_equal "Name contains invalid characters.", error.message
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_objects_accessor_and_setter
|
27
|
-
tag =
|
27
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag", :objects => [{"idv" => "obj1"}, {"idv" => "obj2"}])
|
28
28
|
|
29
29
|
assert_equal ["obj1", "obj2"], tag.objects
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_save_should_fail_if_no_objects_are_declared
|
33
|
-
tag =
|
33
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
|
34
34
|
|
35
|
-
error = assert_raise(
|
35
|
+
error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
|
36
36
|
assert_equal "You must define at least one object.", error.message
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_save_should_fail_if_objects_include_non_strings
|
40
|
-
tag =
|
40
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
|
41
41
|
tag.objects = ["obj1", 12323]
|
42
42
|
|
43
|
-
error = assert_raise(
|
43
|
+
error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
|
44
44
|
assert_equal "Invalid object identifier.", error.message
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_to_hash
|
48
|
-
tag =
|
48
|
+
tag = Copperegg::Revealmetrics::Tag.new(:name => "test")
|
49
49
|
tag.objects = ["obj1", "obj2"]
|
50
50
|
|
51
51
|
assert tag.valid?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: copperegg-revealmetrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Anderson
|
@@ -61,14 +61,14 @@ extra_rdoc_files: []
|
|
61
61
|
files:
|
62
62
|
- LICENSE
|
63
63
|
- README.md
|
64
|
-
- lib/copperegg.rb
|
65
|
-
- lib/copperegg/api.rb
|
66
|
-
- lib/copperegg/custom_dashboard.rb
|
67
|
-
- lib/copperegg/metric_group.rb
|
68
|
-
- lib/copperegg/metric_sample.rb
|
69
|
-
- lib/copperegg/mixins/persistence.rb
|
70
|
-
- lib/copperegg/tag.rb
|
71
|
-
- lib/copperegg/ver.rb
|
64
|
+
- lib/copperegg/revealmetrics.rb
|
65
|
+
- lib/copperegg/revealmetrics/api.rb
|
66
|
+
- lib/copperegg/revealmetrics/custom_dashboard.rb
|
67
|
+
- lib/copperegg/revealmetrics/metric_group.rb
|
68
|
+
- lib/copperegg/revealmetrics/metric_sample.rb
|
69
|
+
- lib/copperegg/revealmetrics/mixins/persistence.rb
|
70
|
+
- lib/copperegg/revealmetrics/tag.rb
|
71
|
+
- lib/copperegg/revealmetrics/ver.rb
|
72
72
|
- test/custom_dashboard_test.rb
|
73
73
|
- test/metric_group_test.rb
|
74
74
|
- test/metric_sample_test.rb
|
data/lib/copperegg.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
require "net/https"
|
3
|
-
require "uri"
|
4
|
-
require "json/pure"
|
5
|
-
require File.dirname(__FILE__) + "/copperegg/mixins/persistence"
|
6
|
-
require File.dirname(__FILE__) + "/copperegg/metric_group"
|
7
|
-
require File.dirname(__FILE__) + "/copperegg/custom_dashboard"
|
8
|
-
require File.dirname(__FILE__) + "/copperegg/metric_sample"
|
9
|
-
require File.dirname(__FILE__) + "/copperegg/tag"
|
10
|
-
require File.dirname(__FILE__) + "/copperegg/api"
|
11
|
-
|
12
|
-
module CopperEgg
|
13
|
-
end
|
data/lib/copperegg/api.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module CopperEgg
|
2
|
-
class Api
|
3
|
-
class << self
|
4
|
-
attr_accessor :apikey
|
5
|
-
attr_reader :ssl_verify_peer, :timeout
|
6
|
-
|
7
|
-
def host=(host)
|
8
|
-
@uri = URI.join(host, "/v2/revealmetrics/").to_s
|
9
|
-
end
|
10
|
-
|
11
|
-
def uri
|
12
|
-
@uri || "https://api.copperegg.com/v2/revealmetrics/"
|
13
|
-
end
|
14
|
-
|
15
|
-
def ssl_verify_peer=(boolean)
|
16
|
-
@ssl_verify_peer = boolean ? true : false
|
17
|
-
end
|
18
|
-
|
19
|
-
def timeout=(seconds)
|
20
|
-
@timeout = seconds.to_i
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,138 +0,0 @@
|
|
1
|
-
module CopperEgg
|
2
|
-
class CustomDashboard
|
3
|
-
include CopperEgg::Mixins::Persistence
|
4
|
-
|
5
|
-
WIDGET_TYPES = %w(metric metric_list timeline)
|
6
|
-
WIDGET_STYLES = %w(value timeline both list values)
|
7
|
-
WIDGET_MATCHES = %w(select multi tag all)
|
8
|
-
|
9
|
-
resource "dashboards"
|
10
|
-
|
11
|
-
attr_accessor :name, :label, :data
|
12
|
-
|
13
|
-
def load_attributes(attributes)
|
14
|
-
@data = {"widgets" => {}, "order" => []}
|
15
|
-
attributes.each do |name, value|
|
16
|
-
if name.to_s == "id"
|
17
|
-
@id = value
|
18
|
-
elsif name.to_s == "data"
|
19
|
-
attributes[name].each do |data_name, data_value|
|
20
|
-
if data_name.to_s == "order"
|
21
|
-
data["order"] = data_value
|
22
|
-
else
|
23
|
-
data["widgets"] = data_value
|
24
|
-
end
|
25
|
-
end
|
26
|
-
elsif !respond_to?("#{name}=")
|
27
|
-
next
|
28
|
-
else
|
29
|
-
send "#{name}=", value
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def valid?
|
35
|
-
@error = nil
|
36
|
-
if self.name.nil? || self.name.to_s.strip.empty?
|
37
|
-
@error = "Name can't be blank."
|
38
|
-
else
|
39
|
-
self.data["widgets"].values.each do |widget|
|
40
|
-
widget.each do |key, value|
|
41
|
-
if key.to_s == "type" && !WIDGET_TYPES.include?(value)
|
42
|
-
@error = "Invalid widget type #{value}."
|
43
|
-
elsif key.to_s == "style" && !WIDGET_STYLES.include?(value)
|
44
|
-
@error = "Invalid widget style #{value}."
|
45
|
-
elsif key.to_s == "match" && !WIDGET_MATCHES.include?(value)
|
46
|
-
@error = "Invalid widget match #{value}."
|
47
|
-
elsif key.to_s == "metric" && (!value.is_a?(Hash) || value.keys.size == 0)
|
48
|
-
@error = "Invalid widget metric. #{value}"
|
49
|
-
else
|
50
|
-
(widget["metric"] || widget[:metric]).each do |metric_group_name, metric_group_value|
|
51
|
-
if !metric_group_value.is_a?(Array)
|
52
|
-
@error = "Invalid widget metric. #{metric_group_value}"
|
53
|
-
elsif metric_group_value.length == 0
|
54
|
-
@error = "Invalid widget metric. #{metric_group_value}"
|
55
|
-
else
|
56
|
-
metric_group_value.each do |metric_data|
|
57
|
-
if !metric_data.is_a?(Array)
|
58
|
-
@error = "Invalid widget metric. #{metric_group_value}"
|
59
|
-
elsif metric_data.length < 2
|
60
|
-
@error = "Invalid widget metric. #{metric_group_value}"
|
61
|
-
elsif (/^\d+$/ =~ metric_data.first.to_s).nil?
|
62
|
-
@error = "Invalid widget metric. #{metric_group_value}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
match_param = widget["match_param"] || widget[:match_param]
|
70
|
-
if (widget["match"] || widget[:match]) != "all" && (match_param.nil? || match_param.to_s.strip.empty?)
|
71
|
-
@error = "Missing match parameter."
|
72
|
-
end
|
73
|
-
break if !@error.nil?
|
74
|
-
end
|
75
|
-
end
|
76
|
-
@error.nil?
|
77
|
-
end
|
78
|
-
|
79
|
-
def to_hash
|
80
|
-
set_data_order
|
81
|
-
self.instance_variables.reduce({}) do |memo, variable|
|
82
|
-
unless variable.to_s == "@error"
|
83
|
-
value = instance_variable_get(variable)
|
84
|
-
memo[variable.to_s.sub("@","")] = value
|
85
|
-
end
|
86
|
-
memo
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class <<self
|
91
|
-
def create(*args)
|
92
|
-
options = args.last.class == Hash ? args.pop : {}
|
93
|
-
|
94
|
-
return super(args.first) if args.first.is_a?(Hash)
|
95
|
-
|
96
|
-
metric_group = args.first
|
97
|
-
raise ArgumentError.new("CopperEgg::MetricGroup object expected") if !metric_group.is_a?(MetricGroup)
|
98
|
-
raise ArgumentError.new("Invalid metric group") if !metric_group.valid?
|
99
|
-
|
100
|
-
metrics = filter_metrics(metric_group, options[:metrics]).map { |name| metric_group.metrics.find {|metric| metric.name == name} }
|
101
|
-
identifiers = options[:identifiers].is_a?(Array) ? (options[:identifiers].empty? ? nil : options[:identifiers]) : (options[:identifier] ? [options[:identifiers]] : nil)
|
102
|
-
widget_match = identifiers.nil? ? "all" : (identifiers.size == 1 ? "select" : "multi")
|
103
|
-
widget_type = widget_match == "select" ? "metric" : "timeline"
|
104
|
-
widget_style = widget_type == "metric" ? "both" : "values"
|
105
|
-
name = options[:name] || "#{metric_group.label} Dashboard"
|
106
|
-
|
107
|
-
dashboard = new(:name => name)
|
108
|
-
metrics.each.with_index do |metric, i|
|
109
|
-
metric_data = [metric.position, metric.name]
|
110
|
-
metric_data.push("rate") if metric.type == "ce_counter" || metric.type == "ce_counter_f"
|
111
|
-
widget = {:type => widget_type, :style => widget_style, :match => widget_match, :metric => {metric_group.name => [metric_data]}}
|
112
|
-
widget[:match_param] = identifiers if identifiers
|
113
|
-
dashboard.data["widgets"][i.to_s] = widget
|
114
|
-
end
|
115
|
-
dashboard.save
|
116
|
-
dashboard
|
117
|
-
end
|
118
|
-
|
119
|
-
def find_by_name(name)
|
120
|
-
find.detect {|dashboard| dashboard.name == name}
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
|
125
|
-
def filter_metrics(metric_group, specified_metrics)
|
126
|
-
metrics = metric_group.metrics.map(&:name)
|
127
|
-
specified_metrics = specified_metrics.is_a?(Array) ? specified_metrics & metrics : (specified_metrics ? [specified_metrics] & metrics : [])
|
128
|
-
specified_metrics.empty? ? metrics : specified_metrics
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
private
|
133
|
-
|
134
|
-
def set_data_order
|
135
|
-
@data["order"] = @data["widgets"].keys if @data["order"].empty?
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
@@ -1,123 +0,0 @@
|
|
1
|
-
module CopperEgg
|
2
|
-
class MetricGroup
|
3
|
-
include CopperEgg::Mixins::Persistence
|
4
|
-
|
5
|
-
resource "metric_groups"
|
6
|
-
|
7
|
-
attr_accessor :name, :label, :frequency, :metrics
|
8
|
-
|
9
|
-
def load_attributes(attributes)
|
10
|
-
@metrics = []
|
11
|
-
attributes.each do |name, value|
|
12
|
-
if name.to_s == "id"
|
13
|
-
@id = value
|
14
|
-
elsif !respond_to?("#{name}=")
|
15
|
-
next
|
16
|
-
elsif value.to_s == "metrics"
|
17
|
-
@metrics = value.map {|v| Metric.new(v)}
|
18
|
-
else
|
19
|
-
send "#{name}=", value
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def to_hash
|
25
|
-
self.instance_variables.reduce({}) do |memo, variable|
|
26
|
-
value = instance_variable_get(variable)
|
27
|
-
if variable.to_s == "@metrics"
|
28
|
-
memo[variable.to_s.sub("@","")] = value.map(&:to_hash)
|
29
|
-
elsif variable.to_s != "@error"
|
30
|
-
memo[variable.to_s.sub("@","")] = value
|
31
|
-
end
|
32
|
-
memo
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def valid?
|
37
|
-
@error = nil
|
38
|
-
if self.name.nil? || self.name.to_s.strip.empty?
|
39
|
-
@error = "Name can't be blank."
|
40
|
-
elsif self.metrics.nil? || self.metrics.empty?
|
41
|
-
@error = "You must define at least one metric."
|
42
|
-
else
|
43
|
-
self.metrics = self.metrics.map {|metric| metric.is_a?(Hash) ? Metric.new(metric) : metric}
|
44
|
-
self.metrics.each do |metric|
|
45
|
-
if !metric.is_a?(Metric)
|
46
|
-
@error = "Metric expected."
|
47
|
-
break
|
48
|
-
elsif !metric.valid?
|
49
|
-
@error = metric.error
|
50
|
-
break
|
51
|
-
else
|
52
|
-
metric.send(:remove_instance_variable, :@position) if (metric.instance_variables.include?(:@position) || metric.instance_variables.include?("@position")) && !self.persisted?
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
@error.nil?
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def create
|
62
|
-
response = self.class.request(:request_type => "get", :id => self.name, :show_hidden => true)
|
63
|
-
if response.code == "200"
|
64
|
-
json = JSON.parse(response.body)
|
65
|
-
metric_group = self.class.new(json)
|
66
|
-
@id = self.name
|
67
|
-
# needs_update = self.label != metric_group.label || self.frequency != metric_group.frequency || self.metrics.length != metric_group.metrics.length || self.metrics.map(&:name).sort != metric_group.metrics.map {|m| m["name"]}.sort
|
68
|
-
if true #needs_update
|
69
|
-
self.class.request(self.to_hash.merge(:id => @id, :is_hidden => 0, :request_type => "put", :show_hidden => true))
|
70
|
-
else
|
71
|
-
response
|
72
|
-
end
|
73
|
-
else
|
74
|
-
self.class.request(self.to_hash.merge(:request_type => "post"))
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
class Metric
|
79
|
-
TYPES = %w(ce_gauge ce_gauge_f ce_counter ce_counter_f)
|
80
|
-
|
81
|
-
attr_accessor :name, :label, :type, :unit
|
82
|
-
attr_reader :error, :position
|
83
|
-
|
84
|
-
def initialize(attributes={})
|
85
|
-
attributes.each do |name, value|
|
86
|
-
if name.to_s == "position"
|
87
|
-
@position = value
|
88
|
-
elsif !respond_to?("#{name}=")
|
89
|
-
next
|
90
|
-
else
|
91
|
-
send "#{name}=", value
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def to_hash
|
97
|
-
self.instance_variables.reduce({}) do |memo, variable|
|
98
|
-
if variable.to_s != "@error"
|
99
|
-
value = instance_variable_get(variable)
|
100
|
-
memo[variable.to_s.sub("@","")] = value
|
101
|
-
end
|
102
|
-
memo
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def valid?
|
107
|
-
valid = false
|
108
|
-
@error = nil
|
109
|
-
if self.name.nil? || self.name.to_s.strip.empty?
|
110
|
-
@error = "Metric name cannot be blank."
|
111
|
-
elsif self.type.nil? || self.type.to_s.strip.empty?
|
112
|
-
@error = "Metric type must be defined."
|
113
|
-
elsif !TYPES.include?(self.type)
|
114
|
-
@error = "Invalid metric type #{self.type}."
|
115
|
-
else
|
116
|
-
valid = true
|
117
|
-
remove_instance_variable(:@error)
|
118
|
-
end
|
119
|
-
valid
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module CopperEgg
|
2
|
-
class MetricSample
|
3
|
-
include CopperEgg::Mixins::Persistence
|
4
|
-
|
5
|
-
resource "samples"
|
6
|
-
|
7
|
-
def self.save(group_name, identifier, timestamp, metric_values)
|
8
|
-
request(:id => group_name, :identifier => identifier, :timestamp => timestamp, :values => metric_values, :request_type => "post")
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.samples(group_name, metrics, starttime=nil, duration=nil, sample_size=nil)
|
12
|
-
metrics = [metrics] unless metrics.is_a?(Array)
|
13
|
-
params = {}
|
14
|
-
params[:starttime] = starttime if starttime
|
15
|
-
params[:duration] = duration if duration
|
16
|
-
params[:sample_size] = sample_size if sample_size
|
17
|
-
params[:queries] = {group_name => [{:metrics => metrics}]}
|
18
|
-
|
19
|
-
request(params.merge(:request_type => "get"))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,118 +0,0 @@
|
|
1
|
-
module CopperEgg
|
2
|
-
class ValidationError < Exception; end
|
3
|
-
|
4
|
-
class HttpError < Exception; end
|
5
|
-
|
6
|
-
module Mixins
|
7
|
-
module Persistence
|
8
|
-
def self.included(klass)
|
9
|
-
klass.class_eval do
|
10
|
-
class << self
|
11
|
-
attr_reader :resource_name
|
12
|
-
|
13
|
-
def find(*args)
|
14
|
-
params = args.last.class == Hash ? args.pop : {}
|
15
|
-
id = args.first
|
16
|
-
response = request(params.merge(:request_type => "get", :id => id))
|
17
|
-
if response.code == "200"
|
18
|
-
json = JSON.parse(response.body)
|
19
|
-
if json.is_a?(Array)
|
20
|
-
json.map {|attributes| new(attributes)}
|
21
|
-
else
|
22
|
-
new(json)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def create(params)
|
28
|
-
params.delete(:id)
|
29
|
-
params.delete("id")
|
30
|
-
new(params).save
|
31
|
-
end
|
32
|
-
|
33
|
-
def delete(id)
|
34
|
-
request(:id => id, :request_type => "delete")
|
35
|
-
end
|
36
|
-
|
37
|
-
def request(params={})
|
38
|
-
request_type = params.delete(:request_type)
|
39
|
-
raise "invalid type `#{request_type}`" if !%w(get post put delete).include?(request_type)
|
40
|
-
id = params.delete(:id)
|
41
|
-
|
42
|
-
uri = id ? URI.parse("#{Api.uri}/#{self.resource_name}/#{id}.json") : URI.parse("#{Api.uri}/#{self.resource_name}.json")
|
43
|
-
|
44
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
45
|
-
http.use_ssl = uri.scheme == 'https'
|
46
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if !Api.ssl_verify_peer
|
47
|
-
|
48
|
-
request = Net::HTTP.const_get(request_type.capitalize).new(uri.request_uri)
|
49
|
-
request.body = JSON.generate(params) unless params.empty?
|
50
|
-
request.basic_auth(Api.apikey, "U")
|
51
|
-
request["Content-Type"] = "application/json"
|
52
|
-
|
53
|
-
begin
|
54
|
-
response = http.request(request)
|
55
|
-
rescue Exception => e
|
56
|
-
raise e
|
57
|
-
end
|
58
|
-
|
59
|
-
response
|
60
|
-
end
|
61
|
-
|
62
|
-
def request_200(params={})
|
63
|
-
response = request(params)
|
64
|
-
unless response.code === "200"
|
65
|
-
raise HttpError.new("HTTP request failed with code `#{response.code}`: `#{response.body}`")
|
66
|
-
end
|
67
|
-
response
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def resource(value)
|
73
|
-
@resource_name = value
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
attr_reader :id, :error
|
80
|
-
|
81
|
-
def initialize(attributes={})
|
82
|
-
load_attributes(attributes)
|
83
|
-
end
|
84
|
-
|
85
|
-
def save
|
86
|
-
if valid?
|
87
|
-
response = persisted? ? update : create
|
88
|
-
attributes = JSON.parse(response.body)
|
89
|
-
if response.code != "200"
|
90
|
-
@error = attributes.merge("code" => response.code)
|
91
|
-
else
|
92
|
-
load_attributes(attributes)
|
93
|
-
end
|
94
|
-
else
|
95
|
-
raise ValidationError.new(@error)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def delete
|
100
|
-
self.class.request(:id => @id, :request_type => "delete")
|
101
|
-
end
|
102
|
-
|
103
|
-
def persisted?
|
104
|
-
!@id.nil?
|
105
|
-
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
def create
|
110
|
-
self.class.request(to_hash.merge(:request_type => "post"))
|
111
|
-
end
|
112
|
-
|
113
|
-
def update
|
114
|
-
self.class.request(to_hash.merge(:id => @id, :request_type => "put"))
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|