octocore 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +117 -0
  4. data/README.md +50 -0
  5. data/Rakefile +138 -0
  6. data/bin/fakestream +258 -0
  7. data/lib/octocore.rb +141 -0
  8. data/lib/octocore/baseline.rb +131 -0
  9. data/lib/octocore/callbacks.rb +78 -0
  10. data/lib/octocore/config.rb +37 -0
  11. data/lib/octocore/config/config.yml +1 -0
  12. data/lib/octocore/config/search/index/user.yml +42 -0
  13. data/lib/octocore/counter.rb +265 -0
  14. data/lib/octocore/counter/helpers.rb +168 -0
  15. data/lib/octocore/helpers.rb +6 -0
  16. data/lib/octocore/helpers/api_consumer_helper.rb +371 -0
  17. data/lib/octocore/helpers/api_helper.rb +53 -0
  18. data/lib/octocore/helpers/api_logger.rb +14 -0
  19. data/lib/octocore/helpers/client_helper.rb +104 -0
  20. data/lib/octocore/helpers/kong_helper.rb +156 -0
  21. data/lib/octocore/helpers/sinatra_helper.rb +22 -0
  22. data/lib/octocore/kafka_bridge.rb +60 -0
  23. data/lib/octocore/kldivergence.rb +14 -0
  24. data/lib/octocore/models.rb +260 -0
  25. data/lib/octocore/models/contactus.rb +17 -0
  26. data/lib/octocore/models/enterprise.rb +76 -0
  27. data/lib/octocore/models/enterprise/api_event.rb +14 -0
  28. data/lib/octocore/models/enterprise/api_hit.rb +20 -0
  29. data/lib/octocore/models/enterprise/api_track.rb +13 -0
  30. data/lib/octocore/models/enterprise/app_init.rb +13 -0
  31. data/lib/octocore/models/enterprise/app_login.rb +12 -0
  32. data/lib/octocore/models/enterprise/app_logout.rb +12 -0
  33. data/lib/octocore/models/enterprise/authorization.rb +61 -0
  34. data/lib/octocore/models/enterprise/category.rb +14 -0
  35. data/lib/octocore/models/enterprise/category_baseline.rb +19 -0
  36. data/lib/octocore/models/enterprise/category_hit.rb +26 -0
  37. data/lib/octocore/models/enterprise/category_trend.rb +19 -0
  38. data/lib/octocore/models/enterprise/conversions.rb +69 -0
  39. data/lib/octocore/models/enterprise/ctr.rb +54 -0
  40. data/lib/octocore/models/enterprise/dimension_choice.rb +21 -0
  41. data/lib/octocore/models/enterprise/engagement_time.rb +43 -0
  42. data/lib/octocore/models/enterprise/funnel_data.rb +20 -0
  43. data/lib/octocore/models/enterprise/funnels.rb +126 -0
  44. data/lib/octocore/models/enterprise/gcm.rb +21 -0
  45. data/lib/octocore/models/enterprise/newsfeed_hit.rb +52 -0
  46. data/lib/octocore/models/enterprise/notification_hit.rb +42 -0
  47. data/lib/octocore/models/enterprise/page.rb +15 -0
  48. data/lib/octocore/models/enterprise/page_view.rb +14 -0
  49. data/lib/octocore/models/enterprise/pageload_time.rb +43 -0
  50. data/lib/octocore/models/enterprise/product.rb +22 -0
  51. data/lib/octocore/models/enterprise/product_baseline.rb +20 -0
  52. data/lib/octocore/models/enterprise/product_hit.rb +26 -0
  53. data/lib/octocore/models/enterprise/product_page_view.rb +13 -0
  54. data/lib/octocore/models/enterprise/product_trend.rb +18 -0
  55. data/lib/octocore/models/enterprise/push_key.rb +15 -0
  56. data/lib/octocore/models/enterprise/rules.rb +45 -0
  57. data/lib/octocore/models/enterprise/segment.rb +65 -0
  58. data/lib/octocore/models/enterprise/segment_data.rb +22 -0
  59. data/lib/octocore/models/enterprise/tag.rb +14 -0
  60. data/lib/octocore/models/enterprise/tag_baseline.rb +19 -0
  61. data/lib/octocore/models/enterprise/tag_hit.rb +26 -0
  62. data/lib/octocore/models/enterprise/tag_trend.rb +19 -0
  63. data/lib/octocore/models/enterprise/template.rb +18 -0
  64. data/lib/octocore/models/plans.rb +17 -0
  65. data/lib/octocore/models/subscribe.rb +12 -0
  66. data/lib/octocore/models/user.rb +22 -0
  67. data/lib/octocore/models/user/push_token.rb +15 -0
  68. data/lib/octocore/models/user/user_browser_details.rb +16 -0
  69. data/lib/octocore/models/user/user_location_history.rb +15 -0
  70. data/lib/octocore/models/user/user_persona.rb +101 -0
  71. data/lib/octocore/models/user/user_phone_details.rb +17 -0
  72. data/lib/octocore/models/user/user_profile.rb +20 -0
  73. data/lib/octocore/models/user/user_timeline.rb +111 -0
  74. data/lib/octocore/record.rb +20 -0
  75. data/lib/octocore/schedeuleable.rb +20 -0
  76. data/lib/octocore/scheduler.rb +59 -0
  77. data/lib/octocore/search.rb +5 -0
  78. data/lib/octocore/search/client.rb +33 -0
  79. data/lib/octocore/search/indexer.rb +0 -0
  80. data/lib/octocore/search/searchable.rb +18 -0
  81. data/lib/octocore/search/setup.rb +71 -0
  82. data/lib/octocore/segment.rb +285 -0
  83. data/lib/octocore/stats.rb +33 -0
  84. data/lib/octocore/trendable.rb +88 -0
  85. data/lib/octocore/trends.rb +158 -0
  86. data/lib/octocore/utils.rb +90 -0
  87. data/lib/octocore/version.rb +4 -0
  88. data/spec/lib/stats_spec.rb +20 -0
  89. data/spec/spec_helper.rb +103 -0
  90. metadata +436 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bcac24a9385b4c0d121884a5adeb0e82d00b1631
4
+ data.tar.gz: bcc0bcf99db9de3cf2b5072bc2d4df75caf09311
5
+ SHA512:
6
+ metadata.gz: a0070adb0ba6bac071e6416f6588b4749bf445dba882a2a2a90ec1c3730c7adb2638dc561f4e7224b19bd2a2e3ef9c0c81407be98fd4423e39cba738a6a59d24
7
+ data.tar.gz: 8eb6efe92b8d54bc435d967268e608a4735e3d12fd2d6c20cb9262ed2f659d41993c09796f51fd8cdb8bcdd6b3cc7a5529c2da7082c87653bbb7ea0fedf35f34
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,117 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ octocore (0.0.1)
5
+ cequel (~> 1.9, >= 1.9.0)
6
+ descriptive_statistics (~> 2.5.1, >= 2.5.0)
7
+ elasticsearch (~> 1.0.17, >= 1.0.17)
8
+ faraday (~> 0.9.2, >= 0.9.2)
9
+ hiredis (~> 0.6.1, >= 0.6.0)
10
+ hooks (~> 0.4.1, >= 0.4.1)
11
+ json (~> 1.8.1, >= 1.8.1)
12
+ rake (~> 11.1.0, >= 11.1.0)
13
+ redis (~> 3.2.2, >= 3.2.0)
14
+ resque (~> 1.26.0, >= 1.26.0)
15
+ resque-scheduler (~> 4.1.0, >= 4.1.0)
16
+ ruby-kafka (~> 0.3.2, >= 0.3.2)
17
+ statsd-ruby (~> 1.3.0, >= 1.3.0)
18
+
19
+ GEM
20
+ remote: https://rubygems.org/
21
+ specs:
22
+ activemodel (4.2.7)
23
+ activesupport (= 4.2.7)
24
+ builder (~> 3.1)
25
+ activesupport (4.2.7)
26
+ i18n (~> 0.7)
27
+ json (~> 1.7, >= 1.7.7)
28
+ minitest (~> 5.1)
29
+ thread_safe (~> 0.3, >= 0.3.4)
30
+ tzinfo (~> 1.1)
31
+ builder (3.2.2)
32
+ cassandra-driver (2.1.6)
33
+ ione (~> 1.2)
34
+ cequel (1.10.0)
35
+ activemodel (~> 4.0)
36
+ cassandra-driver (~> 2.0)
37
+ descriptive_statistics (2.5.1)
38
+ diff-lcs (1.2.5)
39
+ elasticsearch (1.0.18)
40
+ elasticsearch-api (= 1.0.18)
41
+ elasticsearch-transport (= 1.0.18)
42
+ elasticsearch-api (1.0.18)
43
+ multi_json
44
+ elasticsearch-transport (1.0.18)
45
+ faraday
46
+ multi_json
47
+ faraday (0.9.2)
48
+ multipart-post (>= 1.2, < 3)
49
+ hiredis (0.6.1)
50
+ hooks (0.4.1)
51
+ uber (~> 0.0.14)
52
+ i18n (0.7.0)
53
+ ione (1.2.3)
54
+ json (1.8.3)
55
+ minitest (5.9.0)
56
+ mono_logger (1.1.0)
57
+ multi_json (1.12.1)
58
+ multipart-post (2.0.0)
59
+ parallel (1.9.0)
60
+ parallel_tests (2.5.0)
61
+ parallel
62
+ rack (1.6.4)
63
+ rack-protection (1.5.3)
64
+ rack
65
+ rake (11.1.2)
66
+ redis (3.2.2)
67
+ redis-namespace (1.5.2)
68
+ redis (~> 3.0, >= 3.0.4)
69
+ resque (1.26.0)
70
+ mono_logger (~> 1.0)
71
+ multi_json (~> 1.0)
72
+ redis-namespace (~> 1.3)
73
+ sinatra (>= 0.9.2)
74
+ vegas (~> 0.1.2)
75
+ resque-scheduler (4.1.0)
76
+ mono_logger (~> 1.0)
77
+ redis (~> 3.0)
78
+ resque (~> 1.25)
79
+ rufus-scheduler (~> 3.0)
80
+ rspec (3.4.0)
81
+ rspec-core (~> 3.4.0)
82
+ rspec-expectations (~> 3.4.0)
83
+ rspec-mocks (~> 3.4.0)
84
+ rspec-core (3.4.4)
85
+ rspec-support (~> 3.4.0)
86
+ rspec-expectations (3.4.0)
87
+ diff-lcs (>= 1.2.0, < 2.0)
88
+ rspec-support (~> 3.4.0)
89
+ rspec-mocks (3.4.1)
90
+ diff-lcs (>= 1.2.0, < 2.0)
91
+ rspec-support (~> 3.4.0)
92
+ rspec-support (3.4.1)
93
+ ruby-kafka (0.3.10)
94
+ rufus-scheduler (3.2.1)
95
+ sinatra (1.4.7)
96
+ rack (~> 1.5)
97
+ rack-protection (~> 1.4)
98
+ tilt (>= 1.3, < 3)
99
+ statsd-ruby (1.3.0)
100
+ thread_safe (0.3.5)
101
+ tilt (2.0.5)
102
+ tzinfo (1.2.2)
103
+ thread_safe (~> 0.1)
104
+ uber (0.0.15)
105
+ vegas (0.1.11)
106
+ rack (>= 1.0.0)
107
+
108
+ PLATFORMS
109
+ ruby
110
+
111
+ DEPENDENCIES
112
+ octocore!
113
+ parallel_tests (~> 2.5.0, >= 2.5.0)
114
+ rspec (~> 3.4.0, >= 3.4.0)
115
+
116
+ BUNDLED WITH
117
+ 1.11.2
@@ -0,0 +1,50 @@
1
+ # octo-core
2
+
3
+ This is the Octomatic Enterprise Core gem. It provides most of the ORM stuff. Class and modules for different tables.
4
+
5
+
6
+ **Rake Tasks**
7
+
8
+ ```bash
9
+ rake cequel:keyspace:create # Initialize Cassandra keyspace
10
+ rake cequel:keyspace:drop # Drop Cassandra keyspace
11
+ rake octo:init # Create keyspace and tables for all defined models
12
+ rake octo:migrate # Synchronize all models defined in `lib/octocore/models' with Cassandra database schema
13
+ rake octo:reset # Drop keyspace if exists, then create and migrate
14
+ rake spec # Run RSpec code examples
15
+ ```
16
+
17
+ # Building
18
+
19
+ ```bash
20
+ ./bin/clean_setup.sh
21
+ ```
22
+
23
+ # Specs
24
+
25
+ ```
26
+ lang=bash
27
+ rake spec
28
+ ```
29
+
30
+ # Verifying connectivity
31
+
32
+ You can use the following set of commands in `irb` to verify all things working with this gem. Execute it from irb in PROJ_DIR.
33
+
34
+ ```ruby
35
+ require 'octocore';config_dir = 'lib/octocore/config/';Octo.connect_with(config_dir);nil
36
+ ```
37
+
38
+ # Creating fake stream
39
+
40
+ It ships with a utility called `fakestream`. It will automatically stream random data. To use just open your console and type
41
+
42
+ ```
43
+ fakestream
44
+ ```
45
+
46
+ Optionally provide a config file for octo to connect as
47
+
48
+ ```
49
+ fakestream /path/to/octo_config.yml
50
+ ```
@@ -0,0 +1,138 @@
1
+ require 'cequel'
2
+ require 'yaml'
3
+ require 'redis'
4
+ require 'rspec/core/rake_task'
5
+
6
+ require 'octocore/helpers/kong_helper'
7
+ require 'octocore/config'
8
+
9
+ RSpec::Core::RakeTask.new('spec')
10
+
11
+ task :environment do
12
+ config_dir = 'lib/octocore/config/'
13
+ config = {}
14
+ Dir[config_dir + '**{,/*/**}/*.yml'].each do |file|
15
+ _config = YAML.load_file(file)
16
+ if _config
17
+ puts "loading from file: #{ file }"
18
+ config = config.merge(_config.deep_symbolize_keys)
19
+ end
20
+ end
21
+ Octo.load_config config
22
+ connection = Cequel.connect(Octo.get_config(:cassandra))
23
+ Cequel::Record.connection = connection
24
+ end
25
+
26
+ # Load default tasks from Cequel
27
+ spec = Gem::Specification.find_by_name 'cequel'
28
+ load "#{spec.gem_dir}/lib/cequel/record/tasks.rb"
29
+
30
+ # Remove those tasks from cequel which we shall override
31
+ %w(cequel:init cequel:migrate cequel:reset).each do |t|
32
+ Rake.application.instance_variable_get('@tasks').delete(t)
33
+ end
34
+
35
+ # Overriding rake actions
36
+ namespace :octo do
37
+
38
+ desc 'Create keyspace and tables for all defined models'
39
+ task :init => %w(cequel:keyspace:create octo:migrate)
40
+
41
+ desc 'Drop keyspace if exists, then create and migrate'
42
+ task :reset => :environment do
43
+ kong_delete
44
+ clear_cache
45
+ if Cequel::Record.connection.schema.exists?
46
+ task('cequel:keyspace:drop').invoke
47
+ end
48
+ task('cequel:keyspace:create').invoke
49
+ migrate
50
+ end
51
+
52
+ desc "Synchronize all models defined in `lib/octocore/models' with Cassandra " \
53
+ "database schema"
54
+ task :migrate => :environment do
55
+ migrate
56
+ end
57
+ end
58
+
59
+ # Delete Kong Consumers and Apis
60
+ def kong_delete
61
+ Octo::Helpers::KongBridge.delete_all
62
+ puts 'Kong Cleaned'
63
+ end
64
+
65
+ # Clear Cache
66
+ def clear_cache
67
+ default_cache = {
68
+ host: '127.0.0.1', port: 6379
69
+ }
70
+ redis = Redis.new(default_cache.merge(driver: :hiredis))
71
+ redis.flushall
72
+ puts 'Cache Cleaned'
73
+ end
74
+
75
+ def migrate
76
+ watch_stack = ActiveSupport::Dependencies::WatchStack.new
77
+
78
+ migration_table_names = Set[]
79
+
80
+ classes = Set[]
81
+
82
+ project_root = Dir.pwd
83
+ models_dir_path = "#{File.expand_path('lib/octocore/models', project_root)}/"
84
+ model_files = Dir.glob(File.join(models_dir_path, '**', '*.rb'))
85
+
86
+ model_files.sort.each do |file|
87
+ watch_namespaces = ["Object"]
88
+ model_file_name = file.sub(/^#{Regexp.escape(models_dir_path)}/, "")
89
+ dirname = File.dirname(model_file_name)
90
+ watch_namespaces << dirname.classify unless dirname == "."
91
+ watch_stack.watch_namespaces(watch_namespaces)
92
+
93
+ require_dependency(file)
94
+
95
+ new_constants = watch_stack.new_constants
96
+ if new_constants.empty?
97
+ _new = model_file_name.sub(/\.rb$/, "")
98
+ if Octo.constants.include?_new.classify.to_sym
99
+ new_constants << "Octo"
100
+ else
101
+ new_constants << "Octo"
102
+ #new_constants << _new.classify
103
+ end
104
+ end
105
+
106
+ new_constants.each do |class_name|
107
+ begin
108
+ clazz = class_name.constantize
109
+ rescue LoadError, RuntimeError, NameError => e
110
+ puts e
111
+ else
112
+ if clazz.is_a?(Class)
113
+ if clazz.ancestors.include?(Cequel::Record) &&
114
+ !migration_table_names.include?(clazz.table_name.to_sym)
115
+ clazz.synchronize_schema
116
+ migration_table_names << clazz.table_name.to_sym
117
+ puts "** Synchronized schema for #{class_name}"
118
+ end
119
+ elsif clazz.is_a?(Module)
120
+ method_name = :constants
121
+ clazzes = clazz.public_send(method_name) if clazz.respond_to? method_name
122
+ clazzes.each do |_clazz|
123
+ _cls = clazz.const_get(_clazz)
124
+ if _cls.is_a?(Class) and !classes.include?_cls
125
+ if _cls.ancestors.include?(Cequel::Record) &&
126
+ !migration_table_names.include?(_cls.table_name.to_sym)
127
+ _cls.synchronize_schema
128
+ migration_table_names << _cls.table_name.to_sym
129
+ puts "Synchronized schema for #{_cls}"
130
+ classes << _cls
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # A simple utility to generate fake stream of data
4
+ #
5
+ # Usage:
6
+ # ./fakestream
7
+
8
+ require 'net/http'
9
+ require 'json'
10
+
11
+ require 'octocore'
12
+
13
+ module Octo
14
+ class FakeStream
15
+
16
+ BASE_URL = 'http://127.0.0.1:8000'
17
+
18
+ MAX_USERS = 100
19
+
20
+ MAX_PAGES = 30
21
+ MAX_PRODUCTS = 200
22
+
23
+ MAX_CATEGORIES = 10
24
+
25
+ MAX_TAGS = 15
26
+
27
+
28
+
29
+
30
+ #How many no. of pages to view before going to product page
31
+ MAX_PAGES_TO_VISIT = 3
32
+
33
+ # Initialize with the URL
34
+ def initialize
35
+ @_apikeys = {}
36
+ end
37
+
38
+ def stream
39
+ user = fakeuser
40
+
41
+ # simulate an app login
42
+ app_init user
43
+
44
+ # simulate a random number of page views before going to product
45
+ for i in 1..(1+rand(MAX_PAGES_TO_VISIT))
46
+ pv user, fakepage(user.enterprise)
47
+ end
48
+
49
+ # simulate a product page view
50
+ ppv user, fakeproduct(user.enterprise)
51
+
52
+ #visit a page or not after going to the product page
53
+ for i in 0..rand(2)
54
+ pv user, fakepage(user.enterprise)
55
+ end
56
+
57
+ end
58
+
59
+ def stream_forever
60
+ while 1
61
+ stream
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ # Create an APP INIT request
68
+ def app_init(user)
69
+ payload = {
70
+ userId: user.id,
71
+ phoneDetails: phonedetails
72
+ }
73
+ key = apikey(user.enterprise)
74
+ url = '/events/app.init/'
75
+ post(url, key, payload)
76
+ end
77
+
78
+ # Create a page view request
79
+ def pv(user, page)
80
+ payload = {
81
+ userId: user.id,
82
+ phoneDetails: phonedetails,
83
+ routeUrl: page.routeurl,
84
+ categories: fakecategories,
85
+ tags: faketags,
86
+ }
87
+ key = apikey user.enterprise
88
+ url = '/events/page.view/'
89
+ post(url, key, payload)
90
+ end
91
+
92
+
93
+ # Create a product page view request
94
+ def ppv(user, product)
95
+ payload = {
96
+ userId: user.id,
97
+ phoneDetails: phonedetails,
98
+ routeUrl: product.routeurl,
99
+ categories: fakecategories,
100
+ tags: faketags,
101
+ productId: product.id,
102
+ productName: product.name,
103
+ price: product.price
104
+ }
105
+ key = apikey user.enterprise
106
+ url = '/events/productpage.view/'
107
+ post(url, key, payload)
108
+ end
109
+
110
+ # Hash containing phone details
111
+ # @return [Hash]
112
+ def phonedetails
113
+ {
114
+ deviceId: 'FCDBD8EF-62FC-4ECB-B2F5-92C9E79AC7F9',
115
+ manufacturer: 'Apple',
116
+ model: 'iPhone 6',
117
+ latitude: 28.6139,
118
+ longitude: 77.209
119
+ }
120
+ end
121
+
122
+ # Creates a fake user for the enterprise on the fly
123
+ # @param [Octo::Enterprise] enterprise
124
+ # @return [Octo::User]
125
+ def fakeuser(enterprise = enterprises.to_a.sample)
126
+ Octo::User.new(enterprise_id: enterprise.id,
127
+ id: rand(MAX_USERS))
128
+ end
129
+
130
+ # Generates a fake page for the enterprise
131
+ # @param [Octo::Enterprise] enterprise
132
+ # @return [Octo::Product]
133
+ def fakepage(enterprise)
134
+ id = rand(MAX_PAGES)
135
+ Octo::Page.new(
136
+ enterprise_id: enterprise.id,
137
+ routeurl: "/PageUrl/#{ id }",
138
+ categories: fakecategories,
139
+ tags: faketags
140
+ )
141
+ end
142
+
143
+
144
+ # Generates a fake product for the enterprise
145
+ # @param [Octo::Enterprise] enterprise
146
+ # @return [Octo::Product]
147
+ def fakeproduct(enterprise)
148
+ id = rand(MAX_PRODUCTS)
149
+ Octo::Product.new(
150
+ enterprise_id: enterprise.id,
151
+ id: id,
152
+ price: rand(10000).to_f,
153
+ name: "Fake Product #{ id }",
154
+ routeurl: "/Some/Url/#{ id }",
155
+ categories: fakecategories,
156
+ tags: faketags
157
+ )
158
+ end
159
+
160
+ # Generates fake categories
161
+ # @return [Array<String>] Array of fake categories
162
+ def fakecategories(count = 2)
163
+ (0..MAX_CATEGORIES).to_a.sample(count).collect { |x| "Fake Category #{ x }"}
164
+ end
165
+
166
+ # Generates fake tags
167
+ # @return [Array<String>] Array of fake tags
168
+ def faketags(count = 2)
169
+ (0..MAX_TAGS).to_a.sample(count).collect { |x| "Fake Tag #{ x }"}
170
+ end
171
+
172
+ # Fetches the APIKey for the enterprise
173
+ def apikey(enterprise)
174
+ unless @_apikeys.has_key?(enterprise.id)
175
+ @_apikeys[enterprise.id] = Octo::Authorization.find_by_username(enterprise.name).apikey
176
+ end
177
+ @_apikeys[enterprise.id]
178
+ end
179
+
180
+ # Creates the URI
181
+ def uri(url = BASE_URL)
182
+ URI(url)
183
+ end
184
+
185
+ # Find all enterprises
186
+ # @return [Cequel::RecordSet]
187
+ def enterprises
188
+ Octo::Enterprise.all.select { |x| !x.name.nil? and x.fakedata? }
189
+ end
190
+
191
+ # Make the POST call
192
+ # @param [String] url The endpoint url
193
+ # @param [String] apikey The API Key
194
+ # @param [Hash] payload The payload
195
+ def post(url, apikey, payload)
196
+ headers = {
197
+ 'Content-Type' => 'application/json',
198
+ 'Accept' => 'application/json',
199
+ 'apikey' => apikey
200
+ }
201
+
202
+ _uri = uri(BASE_URL + url)
203
+ req = Net::HTTP::Post.new(_uri, headers)
204
+ req.content_type = 'application/json'
205
+ req.body = payload.to_json
206
+
207
+ res = Net::HTTP.start(_uri.hostname, _uri.port) do |http|
208
+ http.request(req)
209
+ end
210
+
211
+ case res
212
+ when Net::HTTPSuccess, Net::HTTPRedirection
213
+ puts res.body
214
+ else
215
+ puts res.value
216
+ end
217
+
218
+ end
219
+
220
+ end
221
+ end
222
+
223
+ # All the main Job
224
+ def _main(config_file)
225
+
226
+ # setup signal trap
227
+ Signal.trap('INT') {
228
+ puts 'Halting on user request'
229
+ exit
230
+ }
231
+
232
+ # connect Octo and start the show
233
+ Octo.connect_with config_file
234
+ streamer = Octo::FakeStream.new
235
+ streamer.stream_forever
236
+ end
237
+
238
+ def main
239
+ config_file = if ARGV[0]
240
+ ARGV[0]
241
+ else
242
+ spec = Gem::Specification.find_by_name('octocore')
243
+ gem_root = spec.gem_dir
244
+ File.join(gem_root, 'lib', 'octocore' ,'config')
245
+ end
246
+ puts config_file
247
+ if File.exist?config_file
248
+ _main(config_file)
249
+ else
250
+ puts "Config file '#{ config_file }' does not exist. Exiting..."
251
+ end
252
+ end
253
+
254
+ main
255
+
256
+ if __FILE__ == $0
257
+ main
258
+ end