neuron-client 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/README.md +34 -8
  2. data/lib/neuron-client.rb +61 -12
  3. data/lib/neuron-client/{connection.rb → admin_connection.rb} +7 -7
  4. data/lib/neuron-client/api.rb +48 -31
  5. data/lib/neuron-client/membase_connection.rb +18 -0
  6. data/lib/neuron-client/model/admin/ad.rb +22 -0
  7. data/lib/neuron-client/model/admin/ad_zone.rb +15 -0
  8. data/lib/neuron-client/model/admin/base.rb +91 -0
  9. data/lib/neuron-client/model/admin/blocked_referer.rb +12 -0
  10. data/lib/neuron-client/model/admin/blocked_user_agent.rb +12 -0
  11. data/lib/neuron-client/model/admin/geo_target.rb +16 -0
  12. data/lib/neuron-client/model/admin/report.rb +15 -0
  13. data/lib/neuron-client/model/admin/s3_file.rb +12 -0
  14. data/lib/neuron-client/model/admin/zone.rb +15 -0
  15. data/lib/neuron-client/model/base.rb +38 -0
  16. data/lib/neuron-client/model/common/ad.rb +40 -0
  17. data/lib/neuron-client/model/common/ad_calculations.rb +329 -0
  18. data/lib/neuron-client/model/common/ad_zone.rb +17 -0
  19. data/lib/neuron-client/model/common/base.rb +67 -0
  20. data/lib/neuron-client/model/common/blocked_referer.rb +16 -0
  21. data/lib/neuron-client/model/common/blocked_user_agent.rb +16 -0
  22. data/lib/neuron-client/model/common/geo_target.rb +16 -0
  23. data/lib/neuron-client/model/common/report.rb +21 -0
  24. data/lib/neuron-client/model/common/s3_file.rb +16 -0
  25. data/lib/neuron-client/model/common/zone.rb +22 -0
  26. data/lib/neuron-client/model/common/zone_calculations.rb +41 -0
  27. data/lib/neuron-client/model/membase/ad.rb +31 -0
  28. data/lib/neuron-client/model/membase/ad_zone.rb +11 -0
  29. data/lib/neuron-client/model/membase/blocked_referer.rb +18 -0
  30. data/lib/neuron-client/model/membase/blocked_user_agent.rb +18 -0
  31. data/lib/neuron-client/model/membase/geo_target.rb +11 -0
  32. data/lib/neuron-client/model/membase/report.rb +11 -0
  33. data/lib/neuron-client/model/membase/s3_file.rb +11 -0
  34. data/lib/neuron-client/model/membase/zone.rb +19 -0
  35. data/lib/neuron-client/model/models.rb +14 -0
  36. data/lib/neuron-client/version.rb +1 -1
  37. data/neuron-client.gemspec +18 -11
  38. data/spec/fixtures/vcr_cassettes/s3_file.yml +186 -4
  39. data/spec/lib/admin_connection_spec.rb +82 -0
  40. data/spec/lib/api_spec.rb +80 -0
  41. data/spec/lib/membase_connection_spec.rb +27 -0
  42. data/spec/lib/model/admin/ad_spec.rb +34 -0
  43. data/spec/lib/model/admin/ad_zone_spec.rb +19 -0
  44. data/spec/lib/model/admin/base_spec.rb +11 -0
  45. data/spec/lib/model/admin/blocked_referer_spec.rb +11 -0
  46. data/spec/lib/model/admin/blocked_user_agent_spec.rb +11 -0
  47. data/spec/lib/model/admin/geo_target_spec.rb +30 -0
  48. data/spec/lib/model/admin/report_spec.rb +21 -0
  49. data/spec/lib/model/admin/s3_spec.rb +11 -0
  50. data/spec/lib/model/admin/zone_spec.rb +21 -0
  51. data/spec/lib/model/base_spec.rb +89 -0
  52. data/spec/lib/model/common/ad_calculations_spec.rb +1148 -0
  53. data/spec/lib/model/common/ad_spec.rb +11 -0
  54. data/spec/lib/model/common/ad_zone_spec.rb +11 -0
  55. data/spec/lib/model/common/base_spec.rb +11 -0
  56. data/spec/lib/model/common/blocked_referer_spec.rb +11 -0
  57. data/spec/lib/model/common/blocked_user_agent_spec.rb +11 -0
  58. data/spec/lib/model/common/geo_target_spec.rb +11 -0
  59. data/spec/lib/model/common/report_spec.rb +11 -0
  60. data/spec/lib/model/common/s3_spec.rb +11 -0
  61. data/spec/lib/model/common/zone_calculations_spec.rb +54 -0
  62. data/spec/lib/model/common/zone_spec.rb +11 -0
  63. data/spec/lib/model/membase/ad_spec.rb +50 -0
  64. data/spec/lib/model/membase/ad_zone_spec.rb +11 -0
  65. data/spec/lib/model/membase/base_spec.rb +11 -0
  66. data/spec/lib/model/membase/blocked_referer_spec.rb +30 -0
  67. data/spec/lib/model/membase/blocked_user_agent_spec.rb +30 -0
  68. data/spec/lib/model/membase/geo_target_spec.rb +11 -0
  69. data/spec/lib/model/membase/report_spec.rb +11 -0
  70. data/spec/lib/model/membase/s3_spec.rb +11 -0
  71. data/spec/lib/model/membase/zone_spec.rb +28 -0
  72. data/spec/lib/old_spec.rb +192 -149
  73. data/spec/lib/s3_file_spec.rb +45 -42
  74. data/spec/spec_helper.rb +2 -1
  75. metadata +296 -57
  76. data/lib/neuron-client/ad.rb +0 -39
  77. data/lib/neuron-client/ad_zone.rb +0 -16
  78. data/lib/neuron-client/blocked_referer.rb +0 -12
  79. data/lib/neuron-client/blocked_user_agent.rb +0 -12
  80. data/lib/neuron-client/connected.rb +0 -138
  81. data/lib/neuron-client/geo_target.rb +0 -16
  82. data/lib/neuron-client/real_time_stats.rb +0 -0
  83. data/lib/neuron-client/report.rb +0 -20
  84. data/lib/neuron-client/s3_file.rb +0 -10
  85. data/lib/neuron-client/zone.rb +0 -16
@@ -0,0 +1,17 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class AdZone
6
+ include Base
7
+
8
+ resource_name("ad_zone")
9
+ resources_name("ad_zones")
10
+
11
+ attr_accessor :ad_id, :zone_id, :priority, :weight,
12
+ :created_at, :updated_at
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,67 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ module Base
6
+ def initialize(attrs=nil)
7
+ (attrs || {}).each do |k,v|
8
+ next if k.to_s == 'id' && self.class.remote_id != 'id'
9
+ k = 'id' if k.to_s == self.class.remote_id
10
+ self.send("#{k}=", v) if self.respond_to?("#{k}=")
11
+ end
12
+ end
13
+
14
+ def self.included(base)
15
+ base.send(:attr_accessor, :id)
16
+ base.extend(ClassMethods)
17
+ end
18
+
19
+ module ClassMethods
20
+ def api
21
+ class_name_to_load = superclass.name.split('::').last
22
+ Neuron::Client::Model.const_get(class_name_to_load).api
23
+ end
24
+
25
+ def connection
26
+ api.connection
27
+ end
28
+
29
+ def attr_accessor(*vars)
30
+ @attributes ||= []
31
+ @attributes += vars
32
+ super(*vars)
33
+ end
34
+
35
+ def attributes
36
+ @attributes
37
+ end
38
+
39
+ def resource_name(res=nil)
40
+ if res
41
+ @resource_name = res.to_s
42
+ end
43
+ @resource_name
44
+ end
45
+
46
+ def resources_name(res=nil)
47
+ if res
48
+ @resources_name = res.to_s.downcase
49
+ end
50
+ if @resources_name.nil? && !@resource_name.nil?
51
+ @resources_name = "#{@resource_name}s"
52
+ end
53
+ @resources_name
54
+ end
55
+
56
+ def remote_id(remote_id=nil)
57
+ if remote_id
58
+ @remote_id = remote_id.to_s
59
+ end
60
+ @remote_id || 'id'
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,16 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class BlockedReferer
6
+ include Base
7
+
8
+ resource_name("blocked_referer")
9
+ resources_name("blocked_referers")
10
+
11
+ attr_accessor :referer, :reversed_referer, :created_at, :updated_at
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class BlockedUserAgent
6
+ include Base
7
+
8
+ resource_name("blocked_user_agent")
9
+ resources_name("blocked_user_agents")
10
+
11
+ attr_accessor :user_agent, :description, :created_at, :updated_at
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class GeoTarget
6
+ include Base
7
+
8
+ resource_name("geo_target")
9
+ resources_name("geo_targets")
10
+
11
+ attr_accessor :geo_type, :full_name, :name, :abbreviation, :updated_at
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class Report
6
+ include Base
7
+
8
+ resource_name("report")
9
+ resources_name("reports")
10
+
11
+ attr_accessor :errors
12
+ attr_accessor :template, :parameters, :state
13
+
14
+ def status
15
+ @state
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class S3File
6
+ include Base
7
+
8
+ resource_name("s3_file")
9
+ resources_name("s3_files")
10
+
11
+ attr_accessor :bucket, :filename, :purpose, :filesize, :created_at, :updated_at
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ class Zone
6
+ include Base
7
+ include ZoneCalculations
8
+
9
+ resource_name("zone")
10
+ resources_name("zones")
11
+
12
+ attr_accessor :slug, :response_type, :template_slug, :parameters,
13
+ :created_at, :updated_at, :ad_links
14
+
15
+ def find_ad(ad_id)
16
+ Neuron::Client::Model::Ad.find(ad_id)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Common
5
+ module ZoneCalculations
6
+ # This module expects the following methods to be defined:
7
+ #
8
+ # ad_links (Hash, keys are ad IDs, values are a sub-hash: {'priority' => p, 'weight' => w})
9
+ # find_ad(ad_id) (nil, or an object that responds to :active? and :pressure)
10
+
11
+ def ads_by_priority
12
+ calculate_ads_by_priority
13
+ end
14
+
15
+ def calculate_ads_by_priority
16
+ entries = {}
17
+ ad_links.each do |ad_id, link|
18
+ next unless ad = find_ad(ad_id)
19
+ next unless ad.active?
20
+ weight = link['weight'].to_f
21
+ priority = link['priority'].to_f
22
+ entries[priority] ||= []
23
+ entries[priority] << [ad_id, weighted_pressure(weight, ad.pressure)]
24
+ end
25
+ entries.sort_by do |priority, entry|
26
+ priority
27
+ end.map do |priority, entry|
28
+ entry.sort_by(&:first)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def weighted_pressure(weight, pressure)
35
+ [( [weight, 0.0].max * [pressure, 1.0].max ), 1.0].max.to_f
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,31 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class Ad < Common::Ad
6
+ def total_impressed
7
+ key = "count_delivery_ad_#{self.id}"
8
+ self.class.connection.get(key).to_f
9
+ end
10
+
11
+ def today_impressed
12
+ now_adjusted_for_ad_time_zone = Time.now.in_time_zone(self.time_zone)
13
+ formatted_date = now_adjusted_for_ad_time_zone.strftime('%Y%m%d') # format to YYYYMMDD
14
+ key = "count_delivery_#{formatted_date}_ad_#{self.id}"
15
+ self.class.connection.get(key).to_f
16
+ end
17
+
18
+ class << self
19
+ def find(id)
20
+ ad = nil
21
+ membase_key = "Ad:#{id}"
22
+ cached_json = self.connection.get(membase_key)
23
+ ad = self.new(Yajl.load(cached_json)[superclass.resource_name]) if cached_json.present?
24
+ ad
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class AdZone < Common::AdZone
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class BlockedReferer < Common::BlockedReferer
6
+ class << self
7
+ def all
8
+ blocked_referers = []
9
+ cached_json = self.connection.get('blocked_referers')
10
+ blocked_referers = Yajl.load(cached_json).collect{|item| self.new(item[superclass.resource_name])} if cached_json.present?
11
+ blocked_referers
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class BlockedUserAgent < Common::BlockedUserAgent
6
+ class << self
7
+ def all
8
+ blocked_user_agents = []
9
+ cached_json = self.connection.get('blocked_user_agents')
10
+ blocked_user_agents = Yajl.load(cached_json).collect{|item| self.new(item[superclass.resource_name])} if cached_json.present?
11
+ blocked_user_agents
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class GeoTarget < Common::GeoTarget
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class Report < Common::Report
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class S3File < Common::S3File
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ module Membase
5
+ class Zone < Common::Zone
6
+ class << self
7
+ def find(id)
8
+ zone = nil
9
+ membase_key = "Zone:#{id}"
10
+ cached_json = self.connection.get(membase_key)
11
+ zone = self.new(Yajl.load(cached_json)[superclass.resource_name]) if cached_json.present?
12
+ zone
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module Neuron
2
+ module Client
3
+ module Model
4
+ class Ad < Base; end
5
+ class AdZone < Base; end
6
+ class BlockedReferer < Base; end
7
+ class BlockedUserAgent < Base; end
8
+ class GeoTarget < Base; end
9
+ class Report < Base; end
10
+ class S3File < Base; end
11
+ class Zone < Base; end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module Neuron
2
2
  module Client
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -5,7 +5,7 @@ require "neuron-client/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "neuron-client"
7
7
  s.version = Neuron::Client::VERSION
8
- s.authors = ["Mark Simoneau", "Chris Johnson"]
8
+ s.authors = ["RMM Online"]
9
9
  s.email = ["devteam@rmmonline.com"]
10
10
  s.homepage = "http://github.com/rmm/neuron-client"
11
11
  s.summary = "Neuron Admin Client Gem"
@@ -17,14 +17,21 @@ Gem::Specification.new do |s|
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
- s.add_dependency "rest-client", ">= 1.6.3"
21
- s.add_dependency "yajl-ruby", ">= 0.8.2"
22
- s.add_development_dependency "rspec", ">= 2.6.0"
23
- s.add_development_dependency "simplecov", ">= 0.4.2"
24
- s.add_development_dependency("rb-fsevent", ">= 0.4.1") if RUBY_PLATFORM =~ /darwin/i
25
- s.add_development_dependency "guard", ">= 0.5.1"
26
- s.add_development_dependency "guard-bundler", ">= 0.1.3"
27
- s.add_development_dependency "guard-rspec", ">= 0.4.0"
28
- s.add_development_dependency "fakeweb", ">= 1.3.0"
29
- s.add_development_dependency "vcr", ">= 1.10.2"
20
+ s.add_dependency "rest-client", "~> 1.6.3"
21
+ s.add_dependency "yajl-ruby", "~> 0.8.2"
22
+ s.add_dependency "activesupport", "~> 3.0.10"
23
+ s.add_dependency "tzinfo", "~> 0.3.29"
24
+ s.add_dependency "i18n", "~> 0.6.0"
25
+ s.add_dependency "dalli", "~> 1.0.5"
26
+
27
+ s.add_development_dependency "rspec", "~> 2.6.0"
28
+ s.add_development_dependency "simplecov", "~> 0.4.2"
29
+ s.add_development_dependency("rb-fsevent", "~> 0.4.3") if RUBY_PLATFORM =~ /darwin/i
30
+ s.add_development_dependency "guard", "~> 0.6.2"
31
+ s.add_development_dependency "guard-bundler", "~> 0.1.3"
32
+ s.add_development_dependency "guard-rspec", "~> 0.4.2"
33
+ s.add_development_dependency "fakeweb", "~> 1.3.0"
34
+ s.add_development_dependency "vcr", "~> 1.11.1"
35
+ s.add_development_dependency "timecop", "~> 0.3.5"
36
+ s.add_development_dependency "chronic", "~> 0.6.2"
30
37
  end