esp_sdk 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +6 -1
  4. data/Gemfile.lock +11 -1
  5. data/README.md +287 -28
  6. data/bin/esp +15 -0
  7. data/esp_sdk.gemspec +2 -0
  8. data/lib/esp/aws_clients.rb +60 -0
  9. data/lib/esp/commands/add_external_account.rb +57 -0
  10. data/lib/esp/commands/commands_tasks.rb +106 -0
  11. data/lib/esp/commands/console.rb +68 -0
  12. data/lib/esp/extensions/active_resource/formats/json_api_format.rb +12 -4
  13. data/lib/esp/extensions/active_resource/paginated_collection.rb +5 -5
  14. data/lib/esp/extensions/active_resource/validations.rb +1 -1
  15. data/lib/esp/external_account_creator.rb +77 -0
  16. data/lib/esp/resources/alert.rb +30 -34
  17. data/lib/esp/resources/cloud_trail_event.rb +5 -0
  18. data/lib/esp/resources/contact_request.rb +6 -5
  19. data/lib/esp/resources/custom_signature.rb +32 -56
  20. data/lib/esp/resources/dashboard.rb +8 -1
  21. data/lib/esp/resources/external_account.rb +27 -19
  22. data/lib/esp/resources/organization.rb +27 -3
  23. data/lib/esp/resources/region.rb +15 -3
  24. data/lib/esp/resources/report.rb +28 -24
  25. data/lib/esp/resources/resource.rb +26 -10
  26. data/lib/esp/resources/service.rb +5 -0
  27. data/lib/esp/resources/signature.rb +28 -12
  28. data/lib/esp/resources/stat.rb +21 -2
  29. data/lib/esp/resources/stat_custom_signature.rb +30 -4
  30. data/lib/esp/resources/stat_region.rb +29 -3
  31. data/lib/esp/resources/stat_service.rb +29 -3
  32. data/lib/esp/resources/stat_signature.rb +29 -3
  33. data/lib/esp/resources/sub_organization.rb +27 -3
  34. data/lib/esp/resources/suppression/region.rb +14 -32
  35. data/lib/esp/resources/suppression/signature.rb +14 -40
  36. data/lib/esp/resources/suppression/unique_identifier.rb +8 -6
  37. data/lib/esp/resources/suppression.rb +43 -5
  38. data/lib/esp/resources/tag.rb +5 -0
  39. data/lib/esp/resources/team.rb +33 -9
  40. data/lib/esp/resources/user.rb +29 -3
  41. data/lib/esp/version.rb +1 -1
  42. data/lib/esp.rb +25 -5
  43. data/test/esp/aws_clients_test.rb +101 -0
  44. data/test/esp/extensions/active_resource/formats/json_api_format_test.rb +26 -12
  45. data/test/esp/extensions/active_resource/paginated_collection_test.rb +93 -72
  46. data/test/esp/extensions/active_resource/validations_test.rb +2 -12
  47. data/test/esp/external_account_creator_test.rb +153 -0
  48. data/test/esp/resources/alert_test.rb +71 -33
  49. data/test/esp/resources/cloud_trail_event_test.rb +9 -1
  50. data/test/esp/resources/contact_request_test.rb +8 -0
  51. data/test/esp/resources/custom_signature_test.rb +8 -0
  52. data/test/esp/resources/dashboard_test.rb +8 -0
  53. data/test/esp/resources/external_account_test.rb +8 -0
  54. data/test/esp/resources/metadata_test.rb +1 -1
  55. data/test/esp/resources/organization_test.rb +8 -0
  56. data/test/esp/resources/region_test.rb +12 -4
  57. data/test/esp/resources/report_test.rb +13 -4
  58. data/test/esp/resources/resource_test.rb +208 -64
  59. data/test/esp/resources/service_test.rb +8 -0
  60. data/test/esp/resources/signature_test.rb +15 -9
  61. data/test/esp/resources/stat_custom_signature_test.rb +9 -1
  62. data/test/esp/resources/stat_region_test.rb +23 -1
  63. data/test/esp/resources/stat_service_test.rb +23 -1
  64. data/test/esp/resources/stat_signature_test.rb +23 -1
  65. data/test/esp/resources/stat_test.rb +52 -8
  66. data/test/esp/resources/sub_organization_test.rb +8 -0
  67. data/test/esp/resources/suppression/region_test.rb +10 -2
  68. data/test/esp/resources/suppression/signature_test.rb +10 -2
  69. data/test/esp/resources/suppression/unique_identifier_test.rb +10 -2
  70. data/test/esp/resources/suppression_test.rb +74 -14
  71. data/test/esp/resources/tag_test.rb +9 -1
  72. data/test/esp/resources/team_test.rb +8 -0
  73. data/test/esp/resources/user_test.rb +49 -19
  74. data/test/esp_test.rb +19 -1
  75. data/test/factories/alerts.rb +70 -0
  76. data/test/factories/organizations.rb +2 -2
  77. data/test/factories/regions.rb +1 -1
  78. data/test/factories/sub_organizations.rb +1 -1
  79. data/test/factories/suppressions.rb +109 -3
  80. data/test/factories/users.rb +65 -2
  81. data/test/test_helper.rb +9 -8
  82. metadata +41 -69
  83. data/bin/esp_console +0 -67
  84. data/rdoc/ActiveResource/Formats.html +0 -178
  85. data/rdoc/ActiveResource/PaginatedCollection.html +0 -912
  86. data/rdoc/ActiveResource.html +0 -182
  87. data/rdoc/ESP/Alert.html +0 -808
  88. data/rdoc/ESP/CloudTrailEvent.html +0 -377
  89. data/rdoc/ESP/ContactRequest.html +0 -368
  90. data/rdoc/ESP/CustomSignature.html +0 -748
  91. data/rdoc/ESP/Dashboard.html +0 -357
  92. data/rdoc/ESP/ExternalAccount.html +0 -567
  93. data/rdoc/ESP/Metadata.html +0 -411
  94. data/rdoc/ESP/Organization.html +0 -592
  95. data/rdoc/ESP/Region.html +0 -401
  96. data/rdoc/ESP/Report.html +0 -624
  97. data/rdoc/ESP/Service.html +0 -382
  98. data/rdoc/ESP/Signature.html +0 -557
  99. data/rdoc/ESP/Stat.html +0 -1780
  100. data/rdoc/ESP/StatCustomSignature.html +0 -1601
  101. data/rdoc/ESP/StatRegion.html +0 -1600
  102. data/rdoc/ESP/StatService.html +0 -1600
  103. data/rdoc/ESP/StatSignature.html +0 -1600
  104. data/rdoc/ESP/SubOrganization.html +0 -542
  105. data/rdoc/ESP/Suppression/Region.html +0 -456
  106. data/rdoc/ESP/Suppression/Signature.html +0 -472
  107. data/rdoc/ESP/Suppression/UniqueIdentifier.html +0 -419
  108. data/rdoc/ESP/Suppression.html +0 -651
  109. data/rdoc/ESP/Tag.html +0 -373
  110. data/rdoc/ESP/Team.html +0 -586
  111. data/rdoc/ESP/User.html +0 -485
  112. data/rdoc/ESP.html +0 -549
  113. data/rdoc/README_md.html +0 -503
  114. data/rdoc/created.rid +0 -31
  115. data/rdoc/images/add.png +0 -0
  116. data/rdoc/images/arrow_up.png +0 -0
  117. data/rdoc/images/brick.png +0 -0
  118. data/rdoc/images/brick_link.png +0 -0
  119. data/rdoc/images/bug.png +0 -0
  120. data/rdoc/images/bullet_black.png +0 -0
  121. data/rdoc/images/bullet_toggle_minus.png +0 -0
  122. data/rdoc/images/bullet_toggle_plus.png +0 -0
  123. data/rdoc/images/date.png +0 -0
  124. data/rdoc/images/delete.png +0 -0
  125. data/rdoc/images/find.png +0 -0
  126. data/rdoc/images/loadingAnimation.gif +0 -0
  127. data/rdoc/images/macFFBgHack.png +0 -0
  128. data/rdoc/images/package.png +0 -0
  129. data/rdoc/images/page_green.png +0 -0
  130. data/rdoc/images/page_white_text.png +0 -0
  131. data/rdoc/images/page_white_width.png +0 -0
  132. data/rdoc/images/plugin.png +0 -0
  133. data/rdoc/images/ruby.png +0 -0
  134. data/rdoc/images/tag_blue.png +0 -0
  135. data/rdoc/images/tag_green.png +0 -0
  136. data/rdoc/images/transparent.png +0 -0
  137. data/rdoc/images/wrench.png +0 -0
  138. data/rdoc/images/wrench_orange.png +0 -0
  139. data/rdoc/images/zoom.png +0 -0
  140. data/rdoc/index.html +0 -136
  141. data/rdoc/js/darkfish.js +0 -155
  142. data/rdoc/js/jquery.js +0 -4
  143. data/rdoc/js/navigation.js +0 -142
  144. data/rdoc/js/search.js +0 -94
  145. data/rdoc/js/search_index.js +0 -1
  146. data/rdoc/js/searcher.js +0 -228
  147. data/rdoc/rdoc.css +0 -595
  148. data/rdoc/table_of_contents.html +0 -942
@@ -18,9 +18,7 @@ module ESP
18
18
  #
19
19
  # ===== Valid Arguments
20
20
  #
21
- # +external_account_ids+ | Required | An Array of the external accounts identified by +external_account_id+ to suppress the signature or custom signature on.
22
- #
23
- # +reason+ | Required | The reason for creating the suppression.
21
+ # See {API documentation}[http://api-docs.evident.io?ruby#suppression-create] for valid arguments
24
22
  #
25
23
  # ==== Example
26
24
  # suppress(external_account_ids: [5], reason: 'My very good reason for creating this suppression')
@@ -29,6 +27,20 @@ module ESP
29
27
  ESP::Suppression::Region.create(regions: [code], external_account_ids: Array(arguments[:external_account_ids]), reason: arguments[:reason])
30
28
  end
31
29
 
30
+ # :singleton-method: where
31
+ # Return a paginated Region list filtered by search parameters
32
+ #
33
+ # ==== Parameters
34
+ #
35
+ # +clauses+ | Hash of attributes with appended predicates to search and sort by.
36
+ #
37
+ # ===== Valid Clauses
38
+ #
39
+ # See {API documentation}[http://api-docs.evident.io?ruby#region-attributes] for valid arguments
40
+ #
41
+ # :call-seq:
42
+ # where(clauses = {})
43
+
32
44
  ##
33
45
  # :singleton-method: find
34
46
  # Find a Region by id
@@ -26,7 +26,7 @@ module ESP
26
26
  # Returns a Report object with a status of 'queued' and an id
27
27
  # ==== Attribute
28
28
  #
29
- # +team_id+ | Required | The ID of the team to create a report for
29
+ # See {API documentation}[http://api-docs.evident.io?ruby#report-create] for valid arguments
30
30
  #
31
31
  # Periodically check the API
32
32
  # ESP::Report.find(<id>)
@@ -48,34 +48,14 @@ module ESP
48
48
  #
49
49
  # ===== Valid Arguments
50
50
  #
51
- # +region_id+ | Not Required | Return only alerts for this region.
52
- #
53
- # +status+ | Not Required | Return only alerts for the give status(es). Valid values are fail, warn, error, pass, info
54
- #
55
- # +first_seen+ | Not Required | Return only alerts that have started within a number of hours of the report. For example, first_seen of 3 will return alerts that started showing up within the last 3 hours of the report.
56
- #
57
- # +suppressed+ | Not Required | Return only suppressed alerts
58
- #
59
- # +team_id+ | Not Required | Return only alerts for the given team.
60
- #
61
- # +external_account_id+ | Not Required | Return only alerts for the given external id.
62
- #
63
- # +service_id+ | Not Required | Return only alerts on signatures with the given service.
64
- #
65
- # +signature_severity+ | Not Required | Return only alerts for signatures with the given risk_level. Valid values are Low, Medium, High
66
- #
67
- # +signature_name+ | Not Required | Return only alerts for signatures with the given name.
68
- #
69
- # +resource+ | Not Required | Return only alerts for the given resource or tag.
70
- #
71
- # +signature_identifier+ | Not Required | Return only alerts for signatures with the given identifier.
51
+ # See {API documentation}[http://api-docs.evident.io?ruby#alert-attributes] for valid arguments
72
52
  #
73
53
  # ==== Example
74
54
  #
75
55
  # report = ESP::Report.find(345)
76
56
  # alerts = report.alerts(status: 'fail', signature_severity: 'High')
77
57
  def alerts(arguments = {})
78
- ESP::Alert.for_report(id, arguments)
58
+ ESP::Alert.where(arguments.merge(report_id: id))
79
59
  end
80
60
 
81
61
  # Returns the stats for this report
@@ -83,6 +63,20 @@ module ESP
83
63
  ESP::Stat.for_report(id)
84
64
  end
85
65
 
66
+ # :singleton-method: where
67
+ # Return a paginated Report list filtered by search parameters
68
+ #
69
+ # ==== Parameters
70
+ #
71
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
72
+ #
73
+ # ===== Valid Clauses
74
+ #
75
+ # See {API documentation}[http://api-docs.evident.io?ruby#report-attributes] for valid arguments
76
+ #
77
+ # :call-seq:
78
+ # where(clauses = {})
79
+
86
80
  ##
87
81
  # :singleton-method: find
88
82
  # Find a Report by id
@@ -91,8 +85,18 @@ module ESP
91
85
  #
92
86
  # +id+ | Required | The ID of the report to retrieve
93
87
  #
88
+ # +options+ | Optional | A hash of options
89
+ #
90
+ # ===== Valid Options
91
+ #
92
+ # +include+ | The list of associated objects to return on the initial request.
93
+ #
94
+ # ===== Valid Includable Associations
95
+ #
96
+ # See {API documentation}[http://api-docs.evident.io?ruby#report-attributes] for valid arguments
97
+ #
94
98
  # :call-seq:
95
- # find(id)
99
+ # find(id, options = {})
96
100
 
97
101
  # :singleton-method: all
98
102
  # Return a paginated Report list
@@ -1,6 +1,7 @@
1
1
  module ESP
2
2
  class Resource < ActiveResource::Base # :nodoc:
3
3
  self.site = ESP.site
4
+ self.proxy = ESP.http_proxy
4
5
  self.format = ActiveResource::Formats::JsonAPIFormat
5
6
  with_api_auth(ESP.access_key_id, ESP.secret_access_key)
6
7
  headers["Content-Type"] = format.mime_type
@@ -8,9 +9,8 @@ module ESP
8
9
 
9
10
  self.collection_parser = ActiveResource::PaginatedCollection
10
11
 
11
- def self.where(*)
12
- fail ESP::NotImplementedError
13
- end
12
+ # List of predicates that can be used for searching
13
+ PREDICATES = %w(sorts m eq eq_any eq_all not_eq not_eq_any not_eq_all matches matches_any matches_all does_not_match does_not_match_any does_not_match_all lt lt_any lt_all lteq lteq_any lteq_all gt gt_any gt_all gteq gteq_any gteq_all in in_any in_all not_in not_in_any not_in_all cont cont_any cont_all not_cont not_cont_any not_cont_all start start_any start_all not_start not_start_any not_start_all end end_any end_all not_end not_end_any not_end_all true false present blank null not_null).join('|').freeze
14
14
 
15
15
  # Pass a json api compliant hash to the api.
16
16
  def serializable_hash(*)
@@ -21,6 +21,17 @@ module ESP
21
21
  h
22
22
  end
23
23
 
24
+ def self.where(clauses = {})
25
+ fail ArgumentError, "expected a clauses Hash, got #{clauses.inspect}" unless clauses.is_a? Hash
26
+ from = clauses.delete(:from) || "#{prefix}#{name.demodulize.pluralize.underscore}"
27
+ clauses = { params: clauses }
28
+ arrange_options(clauses)
29
+ prefix_options, query_options = split_options(clauses)
30
+ instantiate_collection((format.decode(connection.put("#{from}.json", clauses[:params].to_json).body) || []), query_options, prefix_options).tap do |collection|
31
+ make_pageable collection, clauses.merge(from: from)
32
+ end
33
+ end
34
+
24
35
  def self.find(*arguments)
25
36
  scope = arguments.slice!(0)
26
37
  options = (arguments.slice!(0) || {}).with_indifferent_access
@@ -30,20 +41,24 @@ module ESP
30
41
  end
31
42
  end
32
43
 
33
- def self.filters(params)
44
+ def self.filters(params) # rubocop:disable Metrics/MethodLength
34
45
  h = {}.tap do |filters|
35
46
  params.each do |attr, value|
36
- if value.is_a? Enumerable
37
- filters["#{attr.sub(/_in$/, '')}_in"] = value
38
- else
39
- filters["#{attr.sub(/_eq$/, '')}_eq"] = value
47
+ unless attr =~ /(#{PREDICATES})$/
48
+ attr = if value.is_a? Enumerable
49
+ "#{attr}_in"
50
+ else
51
+ "#{attr}_eq"
52
+ end
40
53
  end
54
+ filters[attr] = value
41
55
  end
42
56
  end
43
57
  { filter: h }
44
58
  end
45
59
 
46
- def self.make_pageable(object, options)
60
+ def self.make_pageable(object, options = {}) # rubocop:disable Style/OptionHash
61
+ options = options.with_indifferent_access
47
62
  return object unless object.is_a? ActiveResource::PaginatedCollection
48
63
  # Need to set from so paginated collection can use it for page calls.
49
64
  object.tap do |collection|
@@ -55,8 +70,9 @@ module ESP
55
70
  def self.arrange_options(options)
56
71
  if options[:params].present?
57
72
  page = options[:params][:page] ? { page: options[:params].delete(:page) } : {}
73
+ include = options[:params][:include] ? { include: options[:params].delete(:include) } : {}
58
74
  options[:params].merge!(options[:params].delete(:filter)) if options[:params][:filter]
59
- options[:params] = filters(options[:params]).merge!(page)
75
+ options[:params] = filters(options[:params]).merge!(page).merge!(include)
60
76
  end
61
77
  if options[:include].present?
62
78
  options[:params] ||= {}
@@ -4,6 +4,11 @@ module ESP
4
4
  # The collection of signatures associated with this service.
5
5
  has_many :signatures, class_name: 'ESP::Signature'
6
6
 
7
+ # Not Implemented. You cannot search for a Tag.
8
+ def self.where(*)
9
+ fail ESP::NotImplementedError
10
+ end
11
+
7
12
  # Not Implemented. You cannot create or update a Service.
8
13
  def save
9
14
  fail ESP::NotImplementedError
@@ -24,9 +24,7 @@ module ESP
24
24
  #
25
25
  # ===== Valid Arguments
26
26
  #
27
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
28
- #
29
- # +region+ | Required | Region name to run this custom signature against
27
+ # See {API documentation}[http://api-docs.evident.io?ruby#signature-run] for valid arguments
30
28
  #
31
29
  # ==== Example
32
30
  # signature = ESP::Signature.find(3)
@@ -48,9 +46,7 @@ module ESP
48
46
  #
49
47
  # ===== Valid Arguments
50
48
  #
51
- # +external_account_id+ | Required | The ID of the external account to run this custom signature against
52
- #
53
- # +region+ | Required | Region name to run this custom signature against
49
+ # See {API documentation}[http://api-docs.evident.io?ruby#signature-run] for valid arguments
54
50
  #
55
51
  # ==== Example
56
52
  # signature = ESP::Signature.find(3)
@@ -76,11 +72,7 @@ module ESP
76
72
  #
77
73
  # ===== Valid Arguments
78
74
  #
79
- # +regions+ | Required | An array of region names to suppress.
80
- #
81
- # +external_account_ids+ | Required | An Array of the external accounts identified by +external_account_id+ to suppress the signature or custom signature on.
82
- #
83
- # +reason+ | Required | The reason for creating the suppression.
75
+ # See {API documentation}[http://api-docs.evident.io?ruby#suppression-create] for valid arguments
84
76
  #
85
77
  # ==== Example
86
78
  # suppress(regions: ['us_east_1'], external_account_ids: [5], reason: 'My very good reason for creating this suppression')
@@ -89,6 +81,20 @@ module ESP
89
81
  ESP::Suppression::Signature.create(signature_ids: [id], regions: Array(arguments[:regions]), external_account_ids: Array(arguments[:external_account_ids]), reason: arguments[:reason])
90
82
  end
91
83
 
84
+ # :singleton-method: where
85
+ # Return a paginated Signature list filtered by search parameters
86
+ #
87
+ # ==== Parameters
88
+ #
89
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
90
+ #
91
+ # ===== Valid Clauses
92
+ #
93
+ # See {API documentation}[http://api-docs.evident.io?ruby#signature-attributes] for valid arguments
94
+ #
95
+ # :call-seq:
96
+ # where(clauses = {})
97
+
92
98
  ##
93
99
  # :singleton-method: find
94
100
  # Find a Signature by id
@@ -97,8 +103,18 @@ module ESP
97
103
  #
98
104
  # +id+ | Required | The ID of the signature to retrieve
99
105
  #
106
+ # +options+ | Optional | A hash of options
107
+ #
108
+ # ===== Valid Options
109
+ #
110
+ # +include+ | The list of associated objects to return on the initial request.
111
+ #
112
+ # ===== Valid Includable Associations
113
+ #
114
+ # See {API documentation}[http://api-docs.evident.io?ruby#signature-attributes] for valid arguments
115
+ #
100
116
  # :call-seq:
101
- # find(id)
117
+ # find(id, options = {})
102
118
 
103
119
  # :singleton-method: all
104
120
  # Return a paginated Signature list
@@ -22,6 +22,11 @@ module ESP
22
22
  # The stats for each custom signature associated with this stat object.
23
23
  has_many :custom_signatures, class_name: 'ESP::StatCustomSignature'
24
24
 
25
+ # Not Implemented. You cannot search for a Stat.
26
+ def self.where(*)
27
+ fail ESP::NotImplementedError
28
+ end
29
+
25
30
  # Not Implemented. You cannot search for a Stat.
26
31
  def self.find(*)
27
32
  fail ESP::NotImplementedError, 'Regular ARELlike methods are disabled. Use either the ESP::Stat.for_report or ESP::Stat.latest_for_teams method.'
@@ -37,10 +42,24 @@ module ESP
37
42
  # Not Implemented. You cannot delete a Stat.
38
43
 
39
44
  # Returns all the stats of all the alerts for a report identified by the report_id parameter. Said report contains all statistics for this alert triggered from signatures contained in all regions for the selected hour.
40
- def self.for_report(report_id = nil)
45
+ #
46
+ # ==== Parameters
47
+ #
48
+ # +report_id+ | Required | The ID of the report to retrieve stats for
49
+ #
50
+ # +options+ | Optional | A hash of options
51
+ #
52
+ # ===== Valid Options
53
+ #
54
+ # +include+ | The list of associated objects to return on the initial request.
55
+ #
56
+ # ===== valid Includable Associations
57
+ #
58
+ # See {API documentation}[http://api-docs.evident.io?ruby#alert-attributes] for valid arguments
59
+ def self.for_report(report_id = nil, options = {}) # rubocop:disable Style/OptionHash
41
60
  fail ArgumentError, "You must supply a report id." unless report_id.present?
42
61
  # call find_one directly since find is overriden/not implemented
43
- find_one(from: "#{prefix}reports/#{report_id}/stats.json")
62
+ find_one(from: "#{prefix}reports/#{report_id}/stats.json", params: options)
44
63
  end
45
64
 
46
65
  # Returns all the stats for the most recent report of each team accessible by the given API key.
@@ -2,22 +2,38 @@ module ESP
2
2
  class StatCustomSignature < ESP::Resource
3
3
  include ESP::StatTotals
4
4
 
5
+ ##
5
6
  # The custom_signature these stats are for.
6
7
  belongs_to :custom_signature, class_name: 'ESP::CustomSignature'
7
8
 
9
+ # Not Implemented. You cannot search for a StatSignature.
10
+ def self.where(*)
11
+ fail ESP::NotImplementedError
12
+ end
13
+
8
14
  # Returns a paginated collection of custom_signature stats for the given stat_id
9
15
  # Convenience method to use instead of ::find since a stat_id is required to return custom_signature stats.
10
16
  #
11
- # ==== Parameter
17
+ # ==== Parameters
12
18
  #
13
19
  # +stat_id+ | Required | The ID of the stat to list custom_signature stats for
14
20
  #
21
+ # +options+ | Optional | A hash of options
22
+ #
23
+ # ===== Valid Options
24
+ #
25
+ # +include+ | The list of associated objects to return on the initial request.
26
+ #
27
+ # ===== valid Includable Associations
28
+ #
29
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-custom-signature-attributes] for valid arguments
30
+ #
15
31
  # ==== Example
16
32
  # stats = ESP::StatCustomSignature.for_stat(1194)
17
- def self.for_stat(stat_id = nil)
33
+ def self.for_stat(stat_id = nil, options = {}) # rubocop:disable Style/OptionHash
18
34
  fail ArgumentError, "You must supply a stat id." unless stat_id.present?
19
35
  from = "#{prefix}stats/#{stat_id}/custom_signatures.json"
20
- find(:all, from: from)
36
+ find(:all, from: from, params: options)
21
37
  end
22
38
 
23
39
  # Find a StatRegion by id
@@ -26,8 +42,18 @@ module ESP
26
42
  #
27
43
  # +id+ | Required | The ID of the custom_signature stat to retrieve
28
44
  #
45
+ # +options+ | Optional | A hash of options
46
+ #
47
+ # ===== Valid Options
48
+ #
49
+ # +include+ | The list of associated objects to return on the initial request.
50
+ #
51
+ # ===== valid Includable Associations
52
+ #
53
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-custom-signature-attributes] for valid arguments
54
+ #
29
55
  # :call-seq:
30
- # find(id)
56
+ # find(id, options = {})
31
57
  def self.find(*arguments)
32
58
  scope = arguments.slice!(0)
33
59
  options = (arguments.slice!(0) || {}).with_indifferent_access
@@ -2,9 +2,15 @@ module ESP
2
2
  class StatRegion < ESP::Resource
3
3
  include ESP::StatTotals
4
4
 
5
+ ##
5
6
  # The region these stats are for.
6
7
  belongs_to :region, class_name: 'ESP::Region'
7
8
 
9
+ # Not Implemented. You cannot search for a StatSignature.
10
+ def self.where(*)
11
+ fail ESP::NotImplementedError
12
+ end
13
+
8
14
  # Returns a paginated collection of region stats for the given stat_id
9
15
  # Convenience method to use instead of ::find since a stat_id is required to return region stats.
10
16
  #
@@ -12,12 +18,22 @@ module ESP
12
18
  #
13
19
  # +stat_id+ | Required | The ID of the stat to list region stats for
14
20
  #
21
+ # +options+ | Optional | A hash of options
22
+ #
23
+ # ===== Valid Options
24
+ #
25
+ # +include+ | The list of associated objects to return on the initial request.
26
+ #
27
+ # ===== valid Includable Associations
28
+ #
29
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-region-attributes] for valid arguments
30
+ #
15
31
  # ==== Example
16
32
  # stats = ESP::StatRegion.for_stat(1194)
17
- def self.for_stat(stat_id = nil)
33
+ def self.for_stat(stat_id = nil, options = {}) # rubocop:disable Style/OptionHash
18
34
  fail ArgumentError, "You must supply a stat id." unless stat_id.present?
19
35
  from = "#{prefix}stats/#{stat_id}/regions.json"
20
- find(:all, from: from)
36
+ find(:all, from: from, params: options)
21
37
  end
22
38
 
23
39
  # Find a StatRegion by id
@@ -26,8 +42,18 @@ module ESP
26
42
  #
27
43
  # +id+ | Required | The ID of the region stat to retrieve
28
44
  #
45
+ # +options+ | Optional | A hash of options
46
+ #
47
+ # ===== Valid Options
48
+ #
49
+ # +include+ | The list of associated objects to return on the initial request.
50
+ #
51
+ # ===== valid Includable Associations
52
+ #
53
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-region-attributes] for valid arguments
54
+ #
29
55
  # :call-seq:
30
- # find(id)
56
+ # find(id, options = {})
31
57
  def self.find(*arguments)
32
58
  scope = arguments.slice!(0)
33
59
  options = (arguments.slice!(0) || {}).with_indifferent_access
@@ -2,9 +2,15 @@ module ESP
2
2
  class StatService < ESP::Resource
3
3
  include ESP::StatTotals
4
4
 
5
+ ##
5
6
  # The service these stats are for.
6
7
  belongs_to :service, class_name: 'ESP::Service'
7
8
 
9
+ # Not Implemented. You cannot search for a StatSignature.
10
+ def self.where(*)
11
+ fail ESP::NotImplementedError
12
+ end
13
+
8
14
  # Returns a paginated collection of service stats for the given stat_id
9
15
  # Convenience method to use instead of ::find since a stat_id is required to return service stats.
10
16
  #
@@ -12,12 +18,22 @@ module ESP
12
18
  #
13
19
  # +stat_id+ | Required | The ID of the stat to list service stats for
14
20
  #
21
+ # +options+ | Optional | A hash of options
22
+ #
23
+ # ===== Valid Options
24
+ #
25
+ # +include+ | The list of associated objects to return on the initial request.
26
+ #
27
+ # ===== valid Includable Associations
28
+ #
29
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-service-attributes] for valid arguments
30
+ #
15
31
  # ==== Example
16
32
  # stats = ESP::StatService.for_stat(1194)
17
- def self.for_stat(stat_id = nil)
33
+ def self.for_stat(stat_id = nil, options = {}) # rubocop:disable Style/OptionHash
18
34
  fail ArgumentError, "You must supply a stat id." unless stat_id.present?
19
35
  from = "#{prefix}stats/#{stat_id}/services.json"
20
- find(:all, from: from)
36
+ find(:all, from: from, params: options)
21
37
  end
22
38
 
23
39
  # Find a StatService by id
@@ -26,8 +42,18 @@ module ESP
26
42
  #
27
43
  # +id+ | Required | The ID of the service stat to retrieve
28
44
  #
45
+ # +options+ | Optional | A hash of options
46
+ #
47
+ # ===== Valid Options
48
+ #
49
+ # +include+ | The list of associated objects to return on the initial request.
50
+ #
51
+ # ===== valid Includable Associations
52
+ #
53
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-service-attributes] for valid arguments
54
+ #
29
55
  # :call-seq:
30
- # find(id)
56
+ # find(id, options = {})
31
57
  def self.find(*arguments)
32
58
  scope = arguments.slice!(0)
33
59
  options = (arguments.slice!(0) || {}).with_indifferent_access
@@ -2,9 +2,15 @@ module ESP
2
2
  class StatSignature < ESP::Resource
3
3
  include ESP::StatTotals
4
4
 
5
+ ##
5
6
  # The signature these stats are for.
6
7
  belongs_to :signature, class_name: 'ESP::Signature'
7
8
 
9
+ # Not Implemented. You cannot search for a StatSignature.
10
+ def self.where(*)
11
+ fail ESP::NotImplementedError
12
+ end
13
+
8
14
  # Returns a paginated collection of signature stats for the given stat_id
9
15
  # Convenience method to use instead of ::find since a stat_id is required to return signature stats.
10
16
  #
@@ -12,12 +18,22 @@ module ESP
12
18
  #
13
19
  # +stat_id+ | Required | The ID of the stat to list signature stats for
14
20
  #
21
+ # +options+ | Optional | A hash of options
22
+ #
23
+ # ===== Valid Options
24
+ #
25
+ # +include+ | The list of associated objects to return on the initial request.
26
+ #
27
+ # ===== valid Includable Associations
28
+ #
29
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-signature-attributes] for valid arguments
30
+ #
15
31
  # ==== Example
16
32
  # stats = ESP::StatSignature.for_stat(1194)
17
- def self.for_stat(stat_id = nil)
33
+ def self.for_stat(stat_id = nil, options = {}) # rubocop:disable Style/OptionHash
18
34
  fail ArgumentError, "You must supply a stat id." unless stat_id.present?
19
35
  from = "#{prefix}stats/#{stat_id}/signatures.json"
20
- find(:all, from: from)
36
+ find(:all, from: from, params: options)
21
37
  end
22
38
 
23
39
  # Find a StatRegion by id
@@ -26,8 +42,18 @@ module ESP
26
42
  #
27
43
  # +id+ | Required | The ID of the signature stat to retrieve
28
44
  #
45
+ # +options+ | Optional | A hash of options
46
+ #
47
+ # ===== Valid Options
48
+ #
49
+ # +include+ | The list of associated objects to return on the initial request.
50
+ #
51
+ # ===== valid Includable Associations
52
+ #
53
+ # See {API documentation}[http://api-docs.evident.io?ruby#stat-signature-attributes] for valid arguments
54
+ #
29
55
  # :call-seq:
30
- # find(id)
56
+ # find(id, options = {})
31
57
  def self.find(*arguments)
32
58
  scope = arguments.slice!(0)
33
59
  options = (arguments.slice!(0) || {}).with_indifferent_access
@@ -16,6 +16,20 @@ module ESP
16
16
  # The collection of reports that belong to the sub organization.
17
17
  has_many :reports, class_name: 'ESP::Report'
18
18
 
19
+ # :singleton-method: where
20
+ # Return a paginated SubOrganization list filtered by search parameters
21
+ #
22
+ # ==== Parameters
23
+ #
24
+ # +clauses+ | Hash of attributes with appended predicates to search, sort and include.
25
+ #
26
+ # ===== Valid Clauses
27
+ #
28
+ # See {API documentation}[http://api-docs.evident.io?ruby#sub-organization-attributes] for valid arguments
29
+ #
30
+ # :call-seq:
31
+ # where(clauses = {})
32
+
19
33
  ##
20
34
  # :singleton-method: find
21
35
  # Find a SubOrganization by id
@@ -24,8 +38,18 @@ module ESP
24
38
  #
25
39
  # +id+ | Required | The ID of the sub organization to retrieve
26
40
  #
41
+ # +options+ | Optional | A hash of options
42
+ #
43
+ # ===== Valid Options
44
+ #
45
+ # +include+ | The list of associated objects to return on the initial request.
46
+ #
47
+ # ===== Valid Includable Associations
48
+ #
49
+ # See {API documentation}[http://api-docs.evident.io?ruby#sub-organization-attributes] for valid arguments
50
+ #
27
51
  # :call-seq:
28
- # find(id)
52
+ # find(id, options = {})
29
53
 
30
54
  # :singleton-method: all
31
55
  # Return a paginated SubOrganization list
@@ -41,7 +65,7 @@ module ESP
41
65
  #
42
66
  # ===== Valid Attributes
43
67
  #
44
- # +name+ | Required | The name of the sub organization
68
+ # See {API documentation}[http://api-docs.evident.io?ruby#sub-organization-create] for valid arguments
45
69
  #
46
70
  # ==== Example
47
71
  #
@@ -56,7 +80,7 @@ module ESP
56
80
  #
57
81
  # ===== Valid Attributes
58
82
  #
59
- # +name+ | Required | The name of the sub organization
83
+ # See {API documentation}[http://api-docs.evident.io?ruby#sub-organization-create] for valid arguments
60
84
  #
61
85
  # ==== Example
62
86
  #