accern 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c0b2c2c71d0eca4b6579e04ff4cf0f43362706d7
4
+ data.tar.gz: 1b135afac801603e0f34083eb7cfcd431ce74523
5
+ SHA512:
6
+ metadata.gz: 31936421224235e271cafe80f3307cf5756429dd80fd7025d882e7cc4939ac43704ef8884976595625f347f4294506797d9164482eddddf9d3f7eb4d8a0e7e8c
7
+ data.tar.gz: 17eea7a7ac38ecebeaa13efa9e3ce2d172adfc326fd7a954ce4053b0bb97d08aae48710fcb26ffcf37493f0161865bd396cfa38b0fcf4aecee34e714cde9e028
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .DS_Store
11
+ /.DS_Store
12
+ # rspec failure tracking
13
+ .rspec_status
14
+ test_home
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.3
5
+ before_install: gem install bundler -v 1.14.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in accern.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,70 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+
27
+ guard :rspec, cmd: "bundle exec rspec" do
28
+ require "guard/rspec/dsl"
29
+ dsl = Guard::RSpec::Dsl.new(self)
30
+
31
+ # Feel free to open issues for suggestions and improvements
32
+
33
+ # RSpec files
34
+ rspec = dsl.rspec
35
+ watch(rspec.spec_helper) { rspec.spec_dir }
36
+ watch(rspec.spec_support) { rspec.spec_dir }
37
+ watch(rspec.spec_files)
38
+
39
+ # Ruby files
40
+ ruby = dsl.ruby
41
+ dsl.watch_spec_files_for(ruby.lib_files)
42
+
43
+ # Rails files
44
+ rails = dsl.rails(view_extensions: %w(erb haml slim))
45
+ dsl.watch_spec_files_for(rails.app_files)
46
+ dsl.watch_spec_files_for(rails.views)
47
+
48
+ watch(rails.controllers) do |m|
49
+ [
50
+ rspec.spec.call("routing/#{m[1]}_routing"),
51
+ rspec.spec.call("controllers/#{m[1]}_controller"),
52
+ rspec.spec.call("acceptance/#{m[1]}")
53
+ ]
54
+ end
55
+
56
+ # Rails config changes
57
+ watch(rails.spec_helper) { rspec.spec_dir }
58
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
59
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
60
+
61
+ # Capybara features specs
62
+ watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
63
+ watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
64
+
65
+ # Turnip features and steps
66
+ watch(%r{^spec/acceptance/(.+)\.feature$})
67
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
68
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
69
+ end
70
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Carlos Espejo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Accern
2
+
3
+ A command line interface for the Accern API. Which is used for streaming the realtime data feed.
4
+
5
+ ## Installation
6
+
7
+ ```shell
8
+ gem install accern
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ To get started run the `accern` command and follow the prompts.
14
+
15
+ ```shell
16
+ $ accern
17
+ $ Please enter your API Token:
18
+ $ Your client is now configured and settings saved to ~/.accern.rc.yml.
19
+ ```
20
+ The the next time you run `accern` the client will begin streaming the full data feed to `./feed.jsonl`
21
+
22
+ ## Advanced usage
23
+
24
+ To reset and bring up the getting started prompts run:
25
+
26
+ ```shell
27
+ accern --init
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ 1. Create an issue and describe your idea
33
+ 2. Fork it
34
+ 3. Create your feature branch (`git checkout -b my-new-feature`)
35
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
36
+ 5. Push to the branch (`git push origin my-new-feature`)
37
+ 6. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/accern.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'accern/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'accern'
8
+ spec.version = Accern::VERSION
9
+ spec.authors = ['Carlos Espejo']
10
+ spec.email = ['vendors@accern.com']
11
+ spec.summary = 'A command line interface for the Accern API.'
12
+ spec.homepage = 'https://github.com/Accern/accern'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+ spec.required_ruby_version = '>= 2.0'
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.14'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.0'
26
+ spec.add_development_dependency 'pry', '~> 0.10'
27
+ spec.add_development_dependency 'guard-rspec', '~> 4.7'
28
+ end
data/bin/console ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'accern'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require 'pry'
11
+
12
+ # require "irb"
13
+ # IRB.start(__FILE__)
14
+
15
+ args = ['-h']
16
+ args = []
17
+
18
+ c = Accern::Cli.new(args: args)
19
+
20
+ binding.pry
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/accern ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'accern'
3
+
4
+ Accern::Cli.new(args: ARGV).start
data/lib/accern.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'accern/version'
2
+ require 'accern/cli'
3
+ require 'accern/alpha'
4
+ require 'accern/flatner'
5
+ require 'optparse'
6
+ require 'yaml'
7
+ require 'json'
8
+ require 'net/http'
@@ -0,0 +1,147 @@
1
+ module Accern
2
+ class Alpha
3
+ attr_reader :token, :base_url, :uri, :last_id, :new_id, :docs,
4
+ :format, :flat, :params
5
+
6
+ def initialize(options)
7
+ @token = options.fetch(:token)
8
+ @format = options.fetch(:format, :json)
9
+ @params = options.fetch(:params, {})
10
+ @base_url = 'http://feed.accern.com/v3/alphas'
11
+ @uri = URI(base_url)
12
+ read_last_id
13
+ @flat = Flatner.new
14
+ end
15
+
16
+ def download(path)
17
+ uri.query = URI.encode_www_form(last_id: last_id) if last_id
18
+ puts uri
19
+
20
+ format_response(
21
+ Net::HTTP.new(uri.host, uri.port).request_get(uri, header)
22
+ )
23
+
24
+ return if new_id == last_id
25
+
26
+ save_last_id
27
+
28
+ generate_csv_header(path) if format == :csv
29
+
30
+ File.open(path, 'a') do |f|
31
+ if format == :json
32
+ docs.reverse_each { |d| f.puts d.to_json }
33
+ end
34
+
35
+ if format == :csv
36
+ docs.reverse_each { |d| f.puts flat.process(d) }
37
+ end
38
+ end
39
+
40
+ rescue => e
41
+ puts e.message
42
+ puts e.backtrace
43
+ end
44
+
45
+ def download_loop(path)
46
+ loop do
47
+ download(path)
48
+ sleep 8
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def header
55
+ { 'Authorization' => %(Token token="#{token}") }
56
+ end
57
+
58
+ def save_last_id
59
+ @last_id = docs.first['id']
60
+ File.write('./alpha_last_id.yml', last_id.to_yaml)
61
+ end
62
+
63
+ def format_response(response)
64
+ @docs = JSON.parse(response.body)
65
+ @new_id = docs.first.to_h.fetch('id', last_id)
66
+ end
67
+
68
+ def read_last_id
69
+ if File.exists?('./alpha_last_id.yml')
70
+ @last_id = YAML.load_file('./alpha_last_id.yml')
71
+ end
72
+ end
73
+
74
+ def generate_csv_header(path)
75
+ unless File.exists?(path)
76
+ File.open(path, 'a') { |f| f.puts csv_header }
77
+ end
78
+ end
79
+
80
+ def csv_header
81
+ %w(
82
+ article_id
83
+ story_id
84
+ harvested_at
85
+ entities_name_1
86
+ entities_ticker_1
87
+ entities_global_id_1
88
+ entities_entity_id_1
89
+ entities_type_1
90
+ entities_exchange_1
91
+ entities_sector_1
92
+ entities_industry_1
93
+ entities_country_1
94
+ entities_region_1
95
+ entities_index_1
96
+ entities_competitors_1
97
+ entities_name_2
98
+ entities_ticker_2
99
+ entities_global_id_2
100
+ entities_entity_id_2
101
+ entities_type_2
102
+ entities_exchange_2
103
+ entities_sector_2
104
+ entities_industry_2
105
+ entities_country_2
106
+ entities_region_2
107
+ entities_index_2
108
+ entities_competitors_2
109
+ event_groups_group_1
110
+ event_groups_type_1
111
+ event_groups_group_2
112
+ event_groups_type_2
113
+ story_sentiment
114
+ story_saturation
115
+ story_volume
116
+ story_traffic
117
+ story_shares
118
+ first_mention
119
+ article_type
120
+ article_sentiment
121
+ article_traffic
122
+ source_id
123
+ overall_source_rank
124
+ event_source_rank_1
125
+ event_source_rank_2
126
+ author_id
127
+ overall_author_rank
128
+ event_author_rank_1
129
+ event_author_rank_2
130
+ event_impact_score_overall
131
+ event_impact_score_entity_1
132
+ event_impact_score_entity_2
133
+ avg_day_sentiment_1
134
+ avg_day_sentiment_2
135
+ correlations_max_positive_ticker_1
136
+ correlations_max_positive_value_1
137
+ correlations_max_negative_ticker_1
138
+ correlations_max_negative_value_1
139
+ correlations_max_positive_ticker_2
140
+ correlations_max_positive_value_2
141
+ correlations_max_negative_ticker_2
142
+ correlations_max_negative_value_2
143
+ article_url
144
+ ).join(',')
145
+ end
146
+ end
147
+ end
data/lib/accern/cli.rb ADDED
@@ -0,0 +1,97 @@
1
+ module Accern
2
+ class Cli
3
+ attr_reader :stdout, :stdin, :token, :filetype, :valid_types, :config_path,
4
+ :options, :args, :feed
5
+
6
+ def initialize(stdout: $stdout, stdin: $stdin, args: [], feed: Alpha)
7
+ @stdout = stdout
8
+ @stdin = stdin
9
+ @args = args
10
+ @options = {}
11
+ @filetype = 'json'
12
+ @valid_types = %w(json csv)
13
+ @config_path = "#{ENV['HOME']}/.accern.rc.yml"
14
+ @feed = feed
15
+ end
16
+
17
+ def start
18
+ load_config
19
+ parse_options
20
+
21
+ if options[:init]
22
+ ask_for_info
23
+ else
24
+ feed.new(token: token, format: filetype.to_sym)
25
+ .download_loop('./feed.jsonl')
26
+ end
27
+ end
28
+
29
+ def ask_for_token
30
+ ask_question('Please enter your API Token: ', :token)
31
+ end
32
+
33
+ def ask_for_filetype
34
+ ask_question('Please enter the file type (JSON or CSV): ', :filetype)
35
+ valid_filetype?
36
+ end
37
+
38
+ def load_config
39
+ if File.exist?(config_path)
40
+ config = YAML.load_file(config_path)
41
+ @token = config[:token]
42
+ @filetype = config[:filetype]
43
+ else
44
+ ask_for_info
45
+ end
46
+ end
47
+
48
+ def parse_options
49
+ parser = OptionParser.new do |opts|
50
+ opts.banner = 'A command line interface for the Accern API'
51
+
52
+ opts.on('--init', 'Display the getting started prompts.') do
53
+ options[:init] = true
54
+ end
55
+
56
+ opts.on('--version', 'Show version') do
57
+ options[:version] = Accern::VERSION
58
+ puts Accern::VERSION
59
+ exit
60
+ end
61
+ end
62
+
63
+ parser.parse!(args)
64
+ end
65
+
66
+ private
67
+
68
+ def ask_for_info
69
+ ask_for_token
70
+ # ask_for_filetype
71
+ save_config
72
+ end
73
+
74
+ def ask_question(text, field)
75
+ stdout.print text
76
+ instance_variable_set(
77
+ "@#{field}", stdin.gets.to_s.chomp.downcase.delete('.', '')
78
+ )
79
+ end
80
+
81
+ def valid_filetype?
82
+ return if valid_types.include?(filetype)
83
+ stdout.puts 'Invalid file type, defaulting to JSON'
84
+ @filetype = 'json'
85
+ end
86
+
87
+ def save_config
88
+ config = {
89
+ token: token,
90
+ filetype: filetype
91
+ }
92
+
93
+ File.write(config_path, config.to_yaml)
94
+ stdout.puts 'Your client is now configured and settings saved to ~/.accern.rc.yml.'
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,253 @@
1
+ module Accern
2
+ class Flatner
3
+ def process(x)
4
+ article_id = x['article_id']
5
+ story_id = x['story_id']
6
+ harvested_at = x['harvested_at']
7
+ delivered_at = x['delivered_at']
8
+
9
+ entities_name_1 = x['entities'].first['name'].to_s.tr(',', ' ')
10
+ entities_ticker_1 = x['entities'].first['ticker'].to_s.tr(',', ' ')
11
+
12
+ if x['entities'].first['global_id'].nil?
13
+ x['entities'].first['global_id'] = []
14
+ end
15
+ if x['entities'].first['entity_id'].nil?
16
+ x['entities'].first['entity_id'] = []
17
+ end
18
+
19
+ entities_global_id_1 = x['entities'].first['global_id']
20
+ .join(' ').to_s.tr(',', ' ')
21
+
22
+ entities_entity_id_1 = x['entities'].first['entity_id']
23
+ .join(' ').to_s.tr(',', ' ')
24
+
25
+ entities_type_1 = x['entities'].first['type'].to_s.tr(',', ' ')
26
+ entities_exchange_1 = x['entities'].first['exchange'].to_s.tr(',', ' ')
27
+ entities_sector_1 = x['entities'].first['sector'].to_s.tr(',', ' ')
28
+ entities_industry_1 = x['entities'].first['industry'].to_s.tr(',', ' ')
29
+ entities_country_1 = x['entities'].first['country'].to_s.tr(',', ' ')
30
+ entities_region_1 = x['entities'].first['region'].to_s.tr(',', ' ')
31
+ entities_index_1 = x['entities'].first['index'].to_s.tr(',', ' ')
32
+ entities_competitors_1 = x['entities'].first['competitors']
33
+ .to_s.tr(',', ' ')
34
+
35
+ entities_name_2 = ''
36
+ entities_ticker_2 = ''
37
+ entities_global_id_2 = ''
38
+ entities_entity_id_2 = ''
39
+ entities_type_2 = ''
40
+ entities_exchange_2 = ''
41
+ entities_sector_2 = ''
42
+ entities_industry_2 = ''
43
+ entities_country_2 = ''
44
+ entities_region_2 = ''
45
+ entities_index_2 = ''
46
+ entities_competitors_2 = ''
47
+
48
+ if x['entities'].length > 1
49
+ entities_name_2 = x['entities'][1]['name'].to_s.tr(',', ' ')
50
+ entities_ticker_2 = x['entities'][1]['ticker'].to_s.tr(',', ' ')
51
+ if x['entities'][1]['global_id'].nil?
52
+ x['entities'][1]['global_id'] = []
53
+ end
54
+ if x['entities'][1]['entity_id'].nil?
55
+ x['entities'][1]['entity_id'] = []
56
+ end
57
+
58
+ entities_global_id_2 = x['entities'][1]['global_id']
59
+ .join(' ').to_s.tr(',', ' ')
60
+
61
+ entities_entity_id_2 = x['entities'][1]['entity_id']
62
+ .join(' ').to_s.tr(',', ' ')
63
+
64
+ entities_type_2 = x['entities'][1]['type'].to_s.tr(',', ' ')
65
+ entities_exchange_2 = x['entities'][1]['exchange'].to_s.tr(',', ' ')
66
+ entities_sector_2 = x['entities'][1]['sector'].to_s.tr(',', ' ')
67
+ entities_industry_2 = x['entities'][1]['industry'].to_s.tr(',', ' ')
68
+ entities_country_2 = x['entities'][1]['country'].to_s.tr(',', ' ')
69
+ entities_region_2 = x['entities'][1]['region'].to_s.tr(',', ' ')
70
+ entities_index_2 = x['entities'][1]['index'].to_s.tr(',', ' ')
71
+ entities_competitors_2 = x['entities'][1]['competitors'].to_s.tr(',', ' ')
72
+ end
73
+
74
+ event_groups_group_1 = x['event_groups'].first['group'].to_s.tr(',', ' ')
75
+ event_groups_type_1 = x['event_groups'].first['type'].to_s.tr(',', ' ')
76
+ event_groups_group_2 = ''
77
+ event_groups_type_2 = ''
78
+
79
+ if x['event_groups'].length > 1
80
+ event_groups_group_2 = x['event_groups'][1]['group'].to_s.tr(',', ' ')
81
+ event_groups_type_2 = x['event_groups'][1]['type'].to_s.tr(',', ' ')
82
+ end
83
+
84
+ story_sentiment = x['story_sentiment']
85
+ story_saturation = x['story_saturation']
86
+ story_volume = x['story_volume']
87
+ story_traffic = x['story_traffic']
88
+ story_shares = x['story_shares']
89
+ first_mention = x['first_mention']
90
+ article_type = x['article_type']
91
+ article_sentiment = x['article_sentiment']
92
+ article_traffic = x['article_traffic']
93
+ article_url = x['article_url']
94
+
95
+ if article_url.nil?
96
+ article_url = ''
97
+ end
98
+
99
+ article_url = article_url.to_s.tr(',', '')
100
+
101
+ author_id = x['author_id']
102
+ source_id = x['source_id']
103
+
104
+ overall_source_rank = x['overall_source_rank']
105
+ event_source_rank_1 = ''
106
+ if x['event_source_rank'].length > 0
107
+ event_source_rank_1 = x['event_source_rank'].first['source_rank']
108
+ end
109
+ event_source_rank_2 = ''
110
+ if x['event_source_rank'].length > 1
111
+ event_source_rank_2 = x['event_source_rank'][1]['source_rank']
112
+ end
113
+
114
+ overall_author_rank = x['overall_author_rank']
115
+ event_author_rank_1 = ''
116
+ if x['event_author_rank'].length > 0
117
+ event_author_rank_1 = x['event_author_rank'].first['author_rank']
118
+ end
119
+ event_author_rank_2 = ''
120
+ if x['event_author_rank'].length > 1
121
+ event_author_rank_2 = x['event_author_rank'][1]['author_rank']
122
+ end
123
+
124
+ event_impact_score_overall = x['event_impact_score']['overall']
125
+ event_impact_score_entity_1 = ''
126
+ event_impact_score_entity_2 = ''
127
+
128
+ event_impact_score_entity_1 = x['event_impact_score']['on_entities']
129
+ .first['on_entity']
130
+
131
+ if x['event_impact_score']['on_entities'].length > 1
132
+ event_impact_score_entity_2 =
133
+ x['event_impact_score']['on_entities'][1]['on_entity']
134
+ end
135
+
136
+ avg_day_sentiment_1 = ''
137
+ avg_day_sentiment_2 = ''
138
+ if x['avg_day_sentiment'].nil?
139
+ x['avg_day_sentiment'] = []
140
+ end
141
+ if x['avg_day_sentiment_1'] && x['avg_day_sentiment_1'].length > 0
142
+ avg_day_sentiment_1 = x['avg_day_sentiment_1'].first['value']
143
+ end
144
+ if x['avg_day_sentiment_1'] && x['avg_day_sentiment_1'].length > 1
145
+ avg_day_sentiment_2 = x['avg_day_sentiment_1'][1]['value']
146
+ end
147
+
148
+ correlations_max_positive_ticker_1 = ''
149
+ correlations_max_positive_value_1 = ''
150
+ correlations_max_negative_ticker_1 = ''
151
+ correlations_max_negative_value_1 = ''
152
+ correlations_max_positive_ticker_2 = ''
153
+ correlations_max_positive_value_2 = ''
154
+ correlations_max_negative_ticker_2 = ''
155
+ correlations_max_negative_value_2 = ''
156
+
157
+ if x['correlations'].length > 0
158
+ cors = x['correlations'].first['with_entity']
159
+ cors.each do |c|
160
+ if c['type'] == 'max_positive'
161
+ correlations_max_positive_ticker_1 = c['ticker'].to_s.tr(',', ' ')
162
+ correlations_max_positive_value_1 = c['value']
163
+ else
164
+ correlations_max_negative_ticker_1 = c['ticker'].to_s.tr(',', ' ')
165
+ correlations_max_negative_value_1 = c['value']
166
+ end
167
+ end
168
+ end
169
+
170
+ if x['correlations'].length > 1
171
+ cors = x['correlations'][1]['with_entity']
172
+ cors.each do |c|
173
+ if c['type'] == 'max_positive'
174
+ correlations_max_positive_ticker_2 = c['ticker'].to_s.tr(',', ' ')
175
+ correlations_max_positive_value_2 = c['value']
176
+ else
177
+ correlations_max_negative_ticker_2 = c['ticker'].to_s.tr(',', ' ')
178
+ correlations_max_negative_value_2 = c['value']
179
+ end
180
+ end
181
+ end
182
+
183
+ [
184
+ article_id,
185
+ story_id,
186
+ harvested_at,
187
+ entities_name_1,
188
+ entities_ticker_1,
189
+ entities_global_id_1,
190
+ entities_entity_id_1,
191
+ entities_type_1,
192
+ entities_exchange_1,
193
+ entities_sector_1,
194
+ entities_industry_1,
195
+ entities_country_1,
196
+ entities_region_1,
197
+ entities_index_1,
198
+ entities_competitors_1,
199
+ entities_name_2,
200
+ entities_ticker_2,
201
+ entities_global_id_2,
202
+ entities_entity_id_2,
203
+ entities_type_2,
204
+ entities_exchange_2,
205
+ entities_sector_2,
206
+ entities_industry_2,
207
+ entities_country_2,
208
+ entities_region_2,
209
+ entities_index_2,
210
+ entities_competitors_2,
211
+ event_groups_group_1,
212
+ event_groups_type_1,
213
+ event_groups_group_2,
214
+ event_groups_type_2,
215
+ story_sentiment,
216
+ story_saturation,
217
+ story_volume,
218
+ story_traffic,
219
+ story_shares,
220
+ first_mention,
221
+ article_type,
222
+ article_sentiment,
223
+ article_traffic,
224
+ source_id,
225
+ overall_source_rank,
226
+ event_source_rank_1,
227
+ event_source_rank_2,
228
+ author_id,
229
+ overall_author_rank,
230
+ event_author_rank_1,
231
+ event_author_rank_2,
232
+ event_impact_score_overall,
233
+ event_impact_score_entity_1,
234
+ event_impact_score_entity_2,
235
+ avg_day_sentiment_1,
236
+ avg_day_sentiment_2,
237
+ correlations_max_positive_ticker_1,
238
+ correlations_max_positive_value_1,
239
+ correlations_max_negative_ticker_1,
240
+ correlations_max_negative_value_1,
241
+ correlations_max_positive_ticker_2,
242
+ correlations_max_positive_value_2,
243
+ correlations_max_negative_ticker_2,
244
+ correlations_max_negative_value_2,
245
+ "\"#{article_url}\""
246
+ ].join(',')
247
+
248
+ rescue => e
249
+ puts e
250
+ puts e.backtrace
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,3 @@
1
+ module Accern
2
+ VERSION = '3.0.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: accern
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Carlos Espejo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-02-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.7'
83
+ description:
84
+ email:
85
+ - vendors@accern.com
86
+ executables:
87
+ - accern
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - Guardfile
96
+ - LICENSE.txt
97
+ - README.md
98
+ - Rakefile
99
+ - accern.gemspec
100
+ - bin/console
101
+ - bin/setup
102
+ - exe/accern
103
+ - lib/accern.rb
104
+ - lib/accern/alpha.rb
105
+ - lib/accern/cli.rb
106
+ - lib/accern/flatner.rb
107
+ - lib/accern/version.rb
108
+ homepage: https://github.com/Accern/accern
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '2.0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.5.2
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: A command line interface for the Accern API.
132
+ test_files: []