dailyrep 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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