influxer 1.1.6 → 1.2.0

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +34 -58
  3. data/.travis.yml +6 -1
  4. data/Changelog.md +6 -2
  5. data/Gemfile +5 -2
  6. data/MIT-LICENSE +1 -1
  7. data/README.md +21 -21
  8. data/Rakefile +4 -2
  9. data/bin/console +8 -0
  10. data/gemfiles/rails32.gemfile +1 -1
  11. data/gemfiles/rails42.gemfile +1 -1
  12. data/gemfiles/rails5.gemfile +2 -2
  13. data/gemfiles/rails6.gemfile +7 -0
  14. data/influxer.gemspec +16 -9
  15. data/lib/influxer.rb +10 -9
  16. data/lib/influxer/client.rb +1 -1
  17. data/lib/influxer/config.rb +3 -3
  18. data/lib/influxer/engine.rb +1 -1
  19. data/lib/influxer/metrics/active_model3/model.rb +2 -4
  20. data/lib/influxer/metrics/metrics.rb +8 -8
  21. data/lib/influxer/metrics/quoting/timestamp.rb +13 -13
  22. data/lib/influxer/metrics/relation.rb +17 -13
  23. data/lib/influxer/metrics/relation/calculations.rb +1 -1
  24. data/lib/influxer/metrics/relation/time_query.rb +15 -14
  25. data/lib/influxer/metrics/relation/where_clause.rb +6 -4
  26. data/lib/influxer/metrics/scoping.rb +4 -4
  27. data/lib/influxer/metrics/scoping/current_scope.rb +2 -1
  28. data/lib/influxer/metrics/scoping/default.rb +1 -1
  29. data/lib/influxer/metrics/scoping/named.rb +2 -1
  30. data/lib/influxer/model.rb +4 -9
  31. data/lib/influxer/rails/client.rb +1 -1
  32. data/lib/influxer/version.rb +1 -1
  33. data/spec/cases/points_spec.rb +4 -4
  34. data/spec/cases/write_points_spec.rb +9 -9
  35. data/spec/client_spec.rb +4 -4
  36. data/spec/metrics/metrics_spec.rb +16 -16
  37. data/spec/metrics/relation_spec.rb +11 -11
  38. data/spec/metrics/scoping_spec.rb +2 -2
  39. data/spec/model/user_spec.rb +2 -2
  40. data/spec/spec_helper.rb +13 -14
  41. data/spec/support/shared_contexts/shared_precision.rb +1 -1
  42. metadata +27 -63
@@ -1,16 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'influxer/metrics/relation'
4
- require 'influxer/metrics/scoping'
5
- require 'influxer/metrics/quoting/timestamp'
6
- require 'influxer/metrics/active_model3/model'
3
+ require "influxer/metrics/relation"
4
+ require "influxer/metrics/scoping"
5
+ require "influxer/metrics/quoting/timestamp"
6
+ require "influxer/metrics/active_model3/model"
7
7
 
8
8
  module Influxer
9
9
  class MetricsError < StandardError; end
10
10
  class MetricsInvalid < MetricsError; end
11
11
 
12
12
  # Base class for InfluxDB querying and writing
13
- # rubocop:disable Metrics/ClassLength
14
13
  class Metrics
15
14
  TIME_FACTOR = 1_000_000_000
16
15
  if Influxer.active_model3?
@@ -124,7 +123,7 @@ module Influxer
124
123
  quoted_series(val.call(instance), write: write)
125
124
  when Array
126
125
  if val.length > 1
127
- "merge(#{val.map { |s| quoted_series(s, write: write) }.join(',')})"
126
+ "merge(#{val.map { |s| quoted_series(s, write: write) }.join(",")})"
128
127
  else
129
128
  quoted_series(val.first, write: write)
130
129
  end
@@ -132,7 +131,7 @@ module Influxer
132
131
  # Only add retention policy when selecting points
133
132
  # and not writing
134
133
  if !write && retention_policy.present?
135
- [quote(@retention_policy), quote(val)].join('.')
134
+ [quote(@retention_policy), quote(val)].join(".")
136
135
  else
137
136
  quote(val)
138
137
  end
@@ -168,6 +167,7 @@ module Influxer
168
167
 
169
168
  def write!
170
169
  raise MetricsInvalid if invalid?
170
+
171
171
  write
172
172
  end
173
173
 
@@ -228,7 +228,7 @@ module Influxer
228
228
  end
229
229
 
230
230
  def unquote(name)
231
- name.gsub(/(\A['"]|['"]\z)/, '')
231
+ name.gsub(/(\A['"]|['"]\z)/, "")
232
232
  end
233
233
  end
234
234
  end
@@ -3,27 +3,27 @@
3
3
  module Influxer
4
4
  module TimestampQuoting #:nodoc:
5
5
  TIME_FACTORS = {
6
- 'ns' => 1_000_000_000,
7
- 'ms' => 1_000,
8
- 's' => 1
6
+ "ns" => 1_000_000_000,
7
+ "ms" => 1_000,
8
+ "s" => 1
9
9
  }.freeze
10
10
 
11
- DEFAULT_PRECISION = 'ns'
11
+ DEFAULT_PRECISION = "ns"
12
12
 
13
13
  # Quote timestamp
14
14
  # rubocop: disable Metrics/MethodLength, Metrics/AbcSize
15
15
  def quote_timestamp(val, client)
16
16
  if Influxer.config.time_duration_suffix_enabled
17
- precision = if TIME_FACTORS.keys.include?(client.time_precision)
18
- client.time_precision
19
- else
20
- DEFAULT_PRECISION
21
- end
17
+ precision = if TIME_FACTORS.key?(client.time_precision)
18
+ client.time_precision
19
+ else
20
+ DEFAULT_PRECISION
21
+ end
22
22
  return quote_timestamp_with_suffix(val, precision)
23
23
  end
24
24
 
25
- if !TIME_FACTORS.keys.include?(client.time_precision) &&
26
- !val.is_a?(Numeric)
25
+ if !TIME_FACTORS.key?(client.time_precision) &&
26
+ !val.is_a?(Numeric)
27
27
  warn(
28
28
  "Influxer doesn't automatically cast Time and String values " \
29
29
  "to '#{client.time_precision}' precision. " \
@@ -41,8 +41,8 @@ module Influxer
41
41
  end
42
42
 
43
43
  def quote_timestamp_for_write(val, client)
44
- if !TIME_FACTORS.keys.include?(client.time_precision) &&
45
- !val.is_a?(Numeric)
44
+ if !TIME_FACTORS.key?(client.time_precision) &&
45
+ !val.is_a?(Numeric)
46
46
  raise ArgumentError,
47
47
  "Influxer doesn't support quoting #{val} " \
48
48
  " with '#{client.time_precision}' precision. " \
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/module/delegation'
4
- require 'influxer/metrics/relation/time_query'
5
- require 'influxer/metrics/relation/calculations'
6
- require 'influxer/metrics/relation/where_clause'
7
- require 'influxer/metrics/quoting/timestamp'
3
+ require "active_support/core_ext/module/delegation"
4
+ require "influxer/metrics/relation/time_query"
5
+ require "influxer/metrics/relation/calculations"
6
+ require "influxer/metrics/relation/where_clause"
7
+ require "influxer/metrics/quoting/timestamp"
8
8
 
9
9
  module Influxer
10
10
  # Relation is used to build queries
11
- # rubocop:disable Metrics/ClassLength
12
11
  class Relation
13
12
  include Influxer::TimeQuery
14
13
  include Influxer::Calculations
@@ -144,17 +143,17 @@ module Influxer
144
143
 
145
144
  sql << "from #{build_series_name}"
146
145
 
147
- sql << "where #{where_values.join(' and ')}" unless where_values.empty?
146
+ sql << "where #{where_values.join(" and ")}" unless where_values.empty?
148
147
 
149
148
  unless group_values.empty? && time_value.nil?
150
- group_fields = (time_value.nil? ? [] : ['time(' + @values[:time] + ')']) + group_values
149
+ group_fields = (time_value.nil? ? [] : ["time(" + @values[:time] + ")"]) + group_values
151
150
  group_fields.uniq!
152
- sql << "group by #{group_fields.join(', ')}"
151
+ sql << "group by #{group_fields.join(", ")}"
153
152
  end
154
153
 
155
154
  sql << "fill(#{fill_value})" unless fill_value.nil?
156
155
 
157
- sql << "order by #{order_values.uniq.join(',')}" unless order_values.empty?
156
+ sql << "order by #{order_values.uniq.join(",")}" unless order_values.empty?
158
157
 
159
158
  sql << "limit #{limit_value}" unless limit_value.nil?
160
159
  sql << "offset #{offset_value}" unless offset_value.nil?
@@ -169,14 +168,15 @@ module Influxer
169
168
 
170
169
  def to_a
171
170
  return @records if loaded?
171
+
172
172
  load
173
173
  end
174
174
 
175
175
  def inspect
176
176
  entries = to_a.take(11).map!(&:inspect)
177
- entries[10] = '...' if entries.size == 11
177
+ entries[10] = "..." if entries.size == 11
178
178
 
179
- "#<#{self.class.name} [#{entries.join(', ')}]>"
179
+ "#<#{self.class.name} [#{entries.join(", ")}]>"
180
180
  end
181
181
 
182
182
  def empty?
@@ -209,7 +209,7 @@ module Influxer
209
209
 
210
210
  sql << "from #{@instance.series}"
211
211
 
212
- sql << "where #{where_values.join(' and ')}" unless where_values.empty?
212
+ sql << "where #{where_values.join(" and ")}" unless where_values.empty?
213
213
 
214
214
  sql = sql.join " "
215
215
 
@@ -228,6 +228,7 @@ module Influxer
228
228
  # rubocop:disable Metrics/MethodLength
229
229
  def merge!(rel)
230
230
  return self if rel.nil?
231
+
231
232
  MULTI_VALUE_METHODS.each do |method|
232
233
  (@values[method] ||= []).concat(rel.values[method]).uniq! unless rel.values[method].nil?
233
234
  end
@@ -280,6 +281,7 @@ module Influxer
280
281
 
281
282
  def get_points(list)
282
283
  return list if normalized?
284
+
283
285
  list.reduce([]) do |a, e|
284
286
  a + e.fetch("values", []).map { |v| inject_tags(v, e["tags"] || {}) }
285
287
  end
@@ -291,11 +293,13 @@ module Influxer
291
293
 
292
294
  def method_missing(method, *args, &block)
293
295
  return super unless @klass.respond_to?(method)
296
+
294
297
  merge!(scoping { @klass.public_send(method, *args, &block) })
295
298
  end
296
299
 
297
300
  def respond_to_missing?(method, *args)
298
301
  return true if @klass.respond_to?(method)
302
+
299
303
  super
300
304
  end
301
305
  end
@@ -21,7 +21,7 @@ module Influxer
21
21
 
22
22
  def percentile(name, val, alias_name = nil)
23
23
  @values[:has_calculations] = true
24
- select_values << "percentile(#{name}, #{val})#{alias_name ? ' as ' + alias_name.to_s : ''}"
24
+ select_values << "percentile(#{name}, #{val})#{alias_name ? " as " + alias_name.to_s : ""}"
25
25
  self
26
26
  end
27
27
  end
@@ -3,15 +3,15 @@
3
3
  module Influxer
4
4
  module TimeQuery #:nodoc:
5
5
  TIME_ALIASES = {
6
- hour: '1h',
7
- minute: '1m',
8
- second: '1s',
9
- ms: '1ms',
10
- u: '1u',
11
- week: '1w',
12
- day: '1d',
13
- month: '30d',
14
- year: '365d'
6
+ hour: "1h",
7
+ minute: "1m",
8
+ second: "1s",
9
+ ms: "1ms",
10
+ u: "1u",
11
+ week: "1w",
12
+ day: "1d",
13
+ month: "30d",
14
+ year: "365d"
15
15
  }.freeze
16
16
 
17
17
  FILL_RESERVED = %i[null previous none].freeze
@@ -28,10 +28,10 @@ module Influxer
28
28
  # # select * from metrics group by time(4d) fill(0)
29
29
  def time(val, options = {})
30
30
  @values[:time] = if val.is_a?(Symbol)
31
- TIME_ALIASES[val] || '1' + val.to_s
32
- else
33
- val
34
- end
31
+ TIME_ALIASES[val] || "1" + val.to_s
32
+ else
33
+ val
34
+ end
35
35
 
36
36
  build_fill(options[:fill])
37
37
  self
@@ -51,7 +51,7 @@ module Influxer
51
51
  def past(val)
52
52
  case val
53
53
  when Symbol
54
- where("time > now() - #{TIME_ALIASES[val] || ('1' + val.to_s)}")
54
+ where("time > now() - #{TIME_ALIASES[val] || ("1" + val.to_s)}")
55
55
  when String
56
56
  where("time > now() - #{val}")
57
57
  else
@@ -76,6 +76,7 @@ module Influxer
76
76
 
77
77
  def build_fill(val)
78
78
  return if val.nil?
79
+
79
80
  fill(FILL_RESERVED.include?(val) ? val.to_s : val.to_i)
80
81
  end
81
82
  end
@@ -29,6 +29,7 @@ module Influxer
29
29
 
30
30
  def load
31
31
  return if @null_relation
32
+
32
33
  super
33
34
  end
34
35
 
@@ -57,14 +58,15 @@ module Influxer
57
58
  when NilClass
58
59
  build_eql(key, /.*/, !negate)
59
60
  when Regexp
60
- "#{key}#{negate ? ' !~ ' : ' =~ '}#{val.inspect}"
61
+ "#{key}#{negate ? " !~ " : " =~ "}#{val.inspect}"
61
62
  when Array
62
63
  return build_none(negate) if val.empty?
64
+
63
65
  build_in(key, val, negate)
64
66
  when Range
65
67
  build_range(key, val, negate)
66
68
  else
67
- "#{key}#{negate ? ' <> ' : ' = '}#{quoted(val, key)}"
69
+ "#{key}#{negate ? " <> " : " = "}#{quoted(val, key)}"
68
70
  end
69
71
  end
70
72
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -75,7 +77,7 @@ module Influxer
75
77
  arr.each do |val|
76
78
  buf << build_eql(key, val, negate)
77
79
  end
78
- buf.join(negate ? ' and ' : ' or ').to_s
80
+ buf.join(negate ? " and " : " or ").to_s
79
81
  end
80
82
 
81
83
  # rubocop: disable Metrics/AbcSize, Metrics/MethodLength, Style/IfInsideElse
@@ -100,7 +102,7 @@ module Influxer
100
102
 
101
103
  def build_none(negate = false)
102
104
  @null_relation = !negate
103
- negate ? 'time >= 0' : 'time < 0'
105
+ negate ? "time >= 0" : "time < 0"
104
106
  end
105
107
  end
106
108
  end
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'influxer/metrics/scoping/default'
4
- require 'influxer/metrics/scoping/named'
3
+ require "influxer/metrics/scoping/default"
4
+ require "influxer/metrics/scoping/named"
5
5
 
6
6
  if Influxer.active_model3?
7
- require 'influxer/metrics/scoping/old_current_scope'
7
+ require "influxer/metrics/scoping/old_current_scope"
8
8
  else
9
- require 'influxer/metrics/scoping/current_scope'
9
+ require "influxer/metrics/scoping/current_scope"
10
10
  end
11
11
 
12
12
  module Influxer
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/per_thread_registry'
3
+ require "active_support/per_thread_registry"
4
4
 
5
5
  module Influxer
6
6
  module Scoping
@@ -39,6 +39,7 @@ module Influxer
39
39
 
40
40
  def raise_invalid_scope_type!(scope_type)
41
41
  return if VALID_SCOPE_TYPES.include?(scope_type)
42
+
42
43
  raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. \
43
44
  Scope types must be included in VALID_SCOPE_TYPES"
44
45
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
3
+ require "active_support/concern"
4
4
 
5
5
  module Influxer
6
6
  module Scoping
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/concern'
3
+ require "active_support/concern"
4
4
 
5
5
  module Influxer
6
6
  module Scoping
@@ -10,6 +10,7 @@ module Influxer
10
10
  module ClassMethods
11
11
  def scope(name, scope)
12
12
  raise "Scope not defined: #{name}" if scope.nil? || !scope.respond_to?(:call)
13
+
13
14
  singleton_class.send(:define_method, name) do |*args|
14
15
  rel = all
15
16
  rel.merge!(rel.scoping { scope.call(*args) })
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support'
3
+ require "active_support"
4
4
 
5
5
  module Influxer
6
6
  # Add `has_metrics` method to AR::Base
@@ -8,9 +8,6 @@ module Influxer
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  module ClassMethods # :nodoc:
11
- # rubocop:disable Naming/PredicateName
12
- # rubocop:disable Metrics/MethodLength
13
- # rubocop:disable Metrics/AbcSize
14
11
  def has_metrics(*args, **params)
15
12
  metrics_name = args.empty? ? "metrics" : args.first.to_s
16
13
 
@@ -22,12 +19,10 @@ module Influxer
22
19
  foreign_key = params.fetch(:foreign_key, to_s.foreign_key)
23
20
 
24
21
  define_method(metrics_name) do
25
- rel_attrs = foreign_key ? { foreign_key => id } : {}
22
+ rel_attrs = foreign_key ? {foreign_key => id} : {}
26
23
 
27
- unless attrs.nil?
28
- attrs.each do |key|
29
- rel_attrs[key] = send(key)
30
- end
24
+ attrs&.each do |key|
25
+ rel_attrs[key] = send(key)
31
26
  end
32
27
  Relation.new klass, attributes: rel_attrs
33
28
  end
@@ -39,7 +39,7 @@ module Influxer
39
39
 
40
40
  # add prefix; remove whitespaces
41
41
  def normalized_cache_key(sql)
42
- "influxer:#{sql.gsub(/\s*/, '')}"
42
+ "influxer:#{sql.gsub(/\s*/, "")}"
43
43
  end
44
44
 
45
45
  def logger
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Influxer # :nodoc:
4
- VERSION = "1.1.6"
4
+ VERSION = "1.2.0"
5
5
  end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  describe DummyMetrics do
6
6
  before do
7
7
  stub_request(:get, "http://localhost:8086/query")
8
8
  .with(
9
- query: { q: 'select * from "dummy"', u: "root", p: "root", precision: 'ns', db: 'db' }
9
+ query: {q: 'select * from "dummy"', u: "root", p: "root", precision: "ns", db: "db"}
10
10
  )
11
11
  .to_return(body: fixture_file)
12
12
  end
13
13
 
14
14
  context "single_series" do
15
- let(:fixture_file) { File.read('./spec/fixtures/single_series.json') }
15
+ let(:fixture_file) { File.read("./spec/fixtures/single_series.json") }
16
16
 
17
17
  context "default format (values merged with tags)" do
18
18
  subject { described_class.all.to_a }
@@ -25,7 +25,7 @@ describe DummyMetrics do
25
25
  end
26
26
 
27
27
  context "empty result" do
28
- let(:fixture_file) { File.read('./spec/fixtures/empty_result.json') }
28
+ let(:fixture_file) { File.read("./spec/fixtures/empty_result.json") }
29
29
 
30
30
  subject { described_class.all.to_a }
31
31