dailyrep 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e5aabaa849a78b02083adc92b191856b2bf181ce
4
+ data.tar.gz: b6de563b3d158016848d724bb2f3cb0e5e35b1a5
5
+ SHA512:
6
+ metadata.gz: 100ca07e97d514fe1e99ac7ae11c0ef8ca81806747c170b770adc79df78e8a6e9a991b574b845af891a8d6317cf3c3aacec0dc007e799384217aa7b19a947896
7
+ data.tar.gz: 5c9c4a4bc461672499a24a40d83b00afdec6d840f93082ddc2a334888eaf4bfdc53c2b8d7fad6e082eb9ed996bc087b8c7ea58cab884b88e33a58b22396b8834
@@ -0,0 +1,21 @@
1
+ log
2
+ db/
3
+
4
+ .idea/
5
+ config/index.html
6
+ config/config.json
7
+
8
+ # cache files for sublime text
9
+ *.tmlanguage.cache
10
+ *.tmPreferences.cache
11
+ *.stTheme.cache
12
+
13
+ # workspace files are user-specific
14
+ *.sublime-workspace
15
+
16
+ # project files should be checked into the repository, unless a significant
17
+ # proportion of contributors will probably not be using SublimeText
18
+ *.sublime-project
19
+
20
+ # sftp configuration file
21
+ sftp-config.json
@@ -0,0 +1,17 @@
1
+ This is Ruby App collects the information you need (currency, new torrents, etc) from various web sites.
2
+
3
+ Main features:
4
+ - local SQlite3 database to store history info
5
+ - devices notification over PushBullet service
6
+ - recent information visualization via html
7
+ - flexible configuration using json file
8
+
9
+ Currently available web site notificattions:
10
+ - http://minfin.com.ua - UAH/USD currency
11
+ - http://micex.ru/ - RUB/USD currency
12
+ - http://dou.ua/ - new IT job opportunities
13
+ - http://kinozal.tv/ - new movies available on torrent
14
+ - http://news.yandex.ru/ - Breny Oil rate
15
+
16
+ As the example (app reloads index.html file that is shared thought Google Drive):
17
+ www.googledrive.com/host/0Byb1mtPn4ZEAVm9zTUJQbHM2U0U
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "test"
5
+ t.test_files = FileList["test/**/*_test.rb"]
6
+ end
7
+
8
+ task default: :test
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ p "Daily rep stared at #{Time.now}"
3
+
4
+ require 'rubygems'
5
+ require 'active_record'
6
+ require 'json'
7
+ require 'hashdiff'
8
+
9
+ Dir.chdir(File.expand_path(File.dirname(__FILE__)))
10
+
11
+ CONFIG_FILE = '../config/config.json'
12
+ if not File.exist?(CONFIG_FILE) then
13
+ p "Please create config.json file \n For more info: https://github.com/yurii-kurylenko/DailyRep"
14
+ abort "config.json is missing"
15
+ end
16
+
17
+ DATABASE = '../db/db.sql3' #sets production/development database
18
+
19
+ require_relative '../lib/dailyrep/Loadconfig.rb'
20
+ # require_relative '../lib/dailyrep/IBrowser'
21
+ # require_relative '../lib/dailyrep/Micex'
22
+ # require_relative '../lib/dailyrep/IndexWriter'
23
+ # require_relative '../lib/dailyrep/Doujob'
24
+ # require_relative '../lib/dailyrep/Kinozal'
25
+ # require_relative '../lib/dailyrep/Yanoil'
26
+ # require_relative '../lib/dailyrep/Minfin'
27
+
28
+ require_relative '../lib/dailyrep/AppContainer'
29
+
30
+
31
+ #creating tracking objects container
32
+ @app_container = DailyRep::AppContainer.new
33
+ #create index writer object
34
+ @app_container.start!
35
+ #tracking objects preparing
36
+ @app_container.write_html
37
+ #starts
38
+ @app_container.start!
39
+ #write html changes to index.html
40
+
41
+
42
+ p "Finished at #{Time.now}!. Has been ran for #{(Time.now - DailyRep::START_TIME).round(2)} seconds"
File without changes
@@ -0,0 +1,57 @@
1
+ {
2
+ "Vesrion": "1.1.0",
3
+ "Push clients":{
4
+ // In this line you should add your app token from pushbullet service
5
+ "username": "user token"
6
+ },
7
+ "Raise errors": "true",
8
+ "Push title": "DailyRep notification",
9
+ "Index path": "./index.html",
10
+ "app_cycle": {
11
+ "write_to_db": "true",
12
+ "notify": "false",
13
+ "web_reload": "true",
14
+ "write_html": "true"
15
+ },
16
+ "Entities": {
17
+ "micex": {
18
+ "source": "http://www.micex.ru/issrpc/marketdata/currency/selt/daily/short/result.json?boardid=CETS&secid=USD000UTSTOM",
19
+ "enabled": "true",
20
+ "time frame": "0..23",
21
+ "delta": "3"
22
+ },
23
+ "doujob": {
24
+ "source": "http://jobs.dou.ua/vacancies/?search=",
25
+ "enabled": "true",
26
+ "time frame": "0..23",
27
+ "searchStr": [
28
+ "Ruby"
29
+ ]
30
+ },
31
+ "kinozal": {
32
+ "source": "http://kinozal.tv/browse.php?s=",
33
+ "enabled": "true",
34
+ "time frame": "0..23",
35
+ "filters": "&g=0&c=0&v=3&d=0&w=0&t=0&f=0",
36
+ "searchStr": [
37
+ "Hobbit Battle",
38
+ "Interstellar",
39
+ "Seventh Son",
40
+ "Paddington",
41
+ "American Sniper"
42
+ ]
43
+ },
44
+ "yanoil": {
45
+ "source": "http://news.yandex.ru/quotes/1006.html",
46
+ "enabled": "true",
47
+ "time frame": "0..23",
48
+ "delta": "0.05"
49
+ },
50
+ "minfin": {
51
+ "source": "http://minfin.com.ua/currency/mb/",
52
+ "enabled": "true",
53
+ "time frame": "0..23",
54
+ "delta": "2"
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,189 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
5
+ <title>
6
+ Daily Report
7
+ </title>
8
+ <style type="text/css">
9
+ .content {
10
+ margin-top: 5em;
11
+ margin-left: 2em;
12
+ margin-right: 2em;
13
+ }
14
+ a span {
15
+ font-weight: bold;
16
+ }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <header class="navbar navbar-inverse navbar-fixed-top bs-docs-nav" role="banner">
21
+ <div class="container">
22
+ <div class="navbar-header">
23
+ <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
24
+ <span class="sr-only">Toggle navigation</span>
25
+ <span class="icon-bar"></span>
26
+ <span class="icon-bar"></span>
27
+ <span class="icon-bar"></span>
28
+ </button>
29
+ <a href="./" class="navbar-brand">Daily Report</a>
30
+ </div>
31
+ <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
32
+ <ul class="nav navbar-nav">
33
+ <li>
34
+ <a href="#">Last refresh:
35
+ <span class="badge" id="refresh">2015-01-25 12:54:07 +0200</span>
36
+ </a>
37
+ </li>
38
+ <li>
39
+ <a href="#">App version:
40
+ <span id="vesrion">1.0.0</span>
41
+ </a>
42
+ </li>
43
+ <li>
44
+ <a href="#"> Written by Yurii Kurylenko</a>
45
+ </li>
46
+ </ul>
47
+ </nav>
48
+ </div>
49
+ </header>
50
+ <div class="content">
51
+ <div class="row">
52
+ <div class="col-md-6">
53
+ <div class="row">
54
+ <div class="col-md-6">
55
+ <div class="panel panel-primary">
56
+ <div class="panel-heading">
57
+ <h3 class="panel-title">Micex USD/RUB rate</h3>
58
+ </div>
59
+ <div class="panel-body">
60
+ <div class="list-group">
61
+ <a class="list-group-item" href="#">
62
+ Current value:
63
+ <span id="micex_last">64.1605</span>
64
+ </a>
65
+ <a class="list-group-item" href="#">
66
+ Open value:
67
+ <span id="micex_open">63.7515</span>
68
+ </a>
69
+ <a class="list-group-item" href="#">
70
+ Delta percent:
71
+ <span id="micex_delta" class="val_color">0.64</span>
72
+ </a>
73
+ </div>
74
+ </div>
75
+ <div class="panel-footer">
76
+ <div>
77
+ Refreshed: <span class="badge" id="micex_refresh">2015-01-25 12:54:05 +0200</span>
78
+ </div>
79
+ <div>
80
+ Last notified:<span class="badge" id="micex_notif">2015-01-13 16:00:26 +0200</span>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ <div class="col-md-6">
86
+ <div class="panel panel-primary">
87
+ <div class="panel-heading">
88
+ <h3 class="panel-title">Minfin UAH/USD rate</h3>
89
+ </div>
90
+ <div class="panel-body">
91
+ <div class="list-group">
92
+ <a class="list-group-item" href="#">
93
+ Current value:
94
+ <span id="minfin_current">20.8500</span>
95
+ </a>
96
+ <a class="list-group-item" href="#">
97
+ Delta percent:
98
+ <span id="minfin_delta" class="val_color">0.0</span>
99
+ </a>
100
+ </div>
101
+ </div>
102
+ <div class="panel-footer">
103
+ <div>
104
+ Refreshed: <span class="badge" id="minfin_refresh">2015-01-25 12:54:05 +0200</span>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ <div class="row">
111
+ <div class="col-md-6">
112
+ <div class="panel panel-primary">
113
+ <div class="panel-heading">
114
+ <h3 class="panel-title">Brent oil rate</h3>
115
+ </div>
116
+ <div class="panel-body">
117
+ <div class="list-group">
118
+ <a class="list-group-item" href="#">
119
+ Current value:
120
+ <span id="yanoil_current">48.55</span>
121
+ </a>
122
+ <a class="list-group-item" href="#">
123
+ Delta percent:
124
+ <span id="yanoil_delta" class="val_color">-0.27</span>
125
+ </a>
126
+ </div>
127
+ </div>
128
+ <div class="panel-footer">
129
+ <div>
130
+ Refreshed: <span class="badge" id="yanoil_refresh">2015-01-25 12:54:05 +0200</span>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ <div class="col-md-3">
138
+ <div class="panel panel-primary">
139
+ <div class="panel-heading">
140
+ <h3 class="panel-title">New Movies</h3>
141
+ </div>
142
+ <div id="kinozal" class="panel-body">
143
+ <div class="list-group"></div>
144
+ </div>
145
+ <div class="panel-footer">
146
+ <div>
147
+ Refreshed: <span class="badge" id="kinozal_refresh">2015-01-25 12:54:06 +0200</span>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ </div>
152
+ <div class="col-md-3">
153
+ <div class="panel panel-primary">
154
+ <div class="panel-heading">
155
+ <h3 class="panel-title">Dou vacancies</h3>
156
+ </div>
157
+ <div id="doujobs" class="panel-body">
158
+ <div class="list-group"></div>
159
+ </div>
160
+ <div class="panel-footer">
161
+ <div>
162
+ Refreshed:
163
+ <span id="doujob_refresh" class="badge">2015-01-25 12:54:07 +0200</span>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
170
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
171
+ <script>
172
+ (function() {
173
+ return $(".list-group-item .val_color").each((function(_this) {
174
+ return function(index, element) {
175
+ var float, str;
176
+ str = $(element).text();
177
+ float = parseFloat(str);
178
+ if (float > 0) {
179
+ return $(element).css("color", "green");
180
+ } else {
181
+ return $(element).css("color", "red");
182
+ }
183
+ };
184
+ })(this));
185
+ })();
186
+ </script>
187
+ </div>
188
+ </body>
189
+ </html>
@@ -0,0 +1,27 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require "dailyrep/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'dailyrep'
7
+ s.licenses = ['MIT']
8
+ s.version = DailyRep::VERSION
9
+ s.summary = "Ruby app that provides values checking on particular websites and performs notification"
10
+ s.description = File.read(File.join(File.dirname(__FILE__), 'README.md'))
11
+ s.authors = "Yurii Kurylenko"
12
+ s.email = "yuriy.kurilenko7@gmail.com"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test}/*`.split("\n")
16
+ s.executables = ['dailyrep']
17
+
18
+ s.add_dependency "hashdiff", ">= 0.0.2"
19
+ s.add_dependency "activerecord"
20
+ s.add_dependency "sqlite3"
21
+ s.add_dependency "rake"
22
+ s.add_dependency "nokogiri"
23
+ s.add_dependency "washbullet"
24
+
25
+
26
+ s.required_ruby_version = '>=2.0'
27
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'IBrowser'
2
+ Dir["../lib/dailyrep/entities/*.rb"].each {|file|require file }
3
+
4
+ module DailyRep
5
+ class AppContainer
6
+ def initialize
7
+ @track_array = []
8
+ Configer.enabled_entities.each { |entity|
9
+ @track_array.concat(DailyRep::Entities::const_get(entity.capitalize).create)
10
+ }
11
+ end
12
+
13
+
14
+ def start!
15
+ #all objects running
16
+ @track_array.each { |obj|
17
+ obj.run
18
+ }
19
+ end
20
+
21
+ def write_html
22
+ IBrowser.write_html if Configer.is_phase_enabled? "write_html"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module DailyRep
2
+ module Changable
3
+ def track_change value, delta
4
+ value = value.to_f
5
+ delta = delta.to_f
6
+ push = 0
7
+ if value.abs > delta then
8
+ a_r_out = self.check_history_notif(self.entity.to_s, :delta.to_s)
9
+ if a_r_out.nil? then
10
+ push = 1
11
+ else
12
+ if (a_r_out.to_f - value).abs > delta.to_i then
13
+ push = 1
14
+ end
15
+ end
16
+ end
17
+ return push
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ module DailyRep
2
+ module Dbops
3
+ def check_history_notif entity, parameter, timescope=(Time.now - 6.hour)
4
+ sql = History.select("val").where(entity: entity, parameter: parameter, notified: 'Y').where('created_at > ?', timescope).order('id desc').first
5
+ if !sql.nil? then
6
+ sql.val
7
+ else
8
+ nil
9
+ end
10
+ end
11
+
12
+ def check_row_exists entity, parameter, val, timescope=(Time.now - 99.years)
13
+ count = History.where(entity: entity, parameter: parameter, val: val).where('created_at > ?', timescope).count
14
+ if count == 0 then false else true end
15
+ end
16
+
17
+ def write_hist entity, parameter, val, notified=0
18
+ case notified
19
+ when 1 then
20
+ notified = 'Y'
21
+ else
22
+ notified = 'N'
23
+ end
24
+ History.create(entity: entity, parameter: parameter, val: val, notified: notified)
25
+ end
26
+
27
+ end
28
+ end