mockba 0.1.2 → 0.2.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.
- package/MOCKBA +11 -0
- package/index.js +269 -1
- package/package.json +2 -1
- package/readme.md +36 -7
- package/test/index.js +6 -2
package/MOCKBA
ADDED
package/index.js
CHANGED
|
@@ -1 +1,269 @@
|
|
|
1
|
-
|
|
1
|
+
// var Moskva = require('moskva')
|
|
2
|
+
var Moskva=require('moskva')
|
|
3
|
+
var{error,log}=console
|
|
4
|
+
|
|
5
|
+
class MOCKBA extends Moskva {
|
|
6
|
+
/** @type {'ru'} */
|
|
7
|
+
translate = ''
|
|
8
|
+
/** @type {boolean} */
|
|
9
|
+
logFetch = false
|
|
10
|
+
printRu = false
|
|
11
|
+
|
|
12
|
+
skip=[]
|
|
13
|
+
// skip=['страна','регион','местоположение']
|
|
14
|
+
printRuWeather(obj){
|
|
15
|
+
var emojiMap={
|
|
16
|
+
'страна':'🌍 Страна',
|
|
17
|
+
'регион':'📍 Регион',
|
|
18
|
+
'местоположение':'📌 Местоположение',
|
|
19
|
+
'время_наблюдения':'⏰ Время наблюдения',
|
|
20
|
+
'атмосферное_давление_мм_рт_ст':'🌡️ Атм. давление (мм рт.ст.)',
|
|
21
|
+
'температура_°C':'🌡️ Температура (°C)',
|
|
22
|
+
'относительная_влажность_процент':'💧 Влажность (%)',
|
|
23
|
+
'направление_ветра':'🧭 Направление ветра',
|
|
24
|
+
'средняя_скорость_ветра_м_с':'🌬️ Скорость ветра (м/с)',
|
|
25
|
+
'горизонтальная_видимость_км':'👀 Видимость (км)',
|
|
26
|
+
'долгосрочные_наблюдения':'📊 Долгосрочные наблюдения',
|
|
27
|
+
'мин_температура_°C':'❄️ Мин. температура (°C)',
|
|
28
|
+
'год_мин_температуры':'📅 Год мин. температуры',
|
|
29
|
+
'макс_температура_°C':'☀️ Макс. температура (°C)',
|
|
30
|
+
'год_макс_температуры':'📅 Год макс. температуры',
|
|
31
|
+
'макс_осадки_мм':'🌧️ Макс. осадки (мм)',
|
|
32
|
+
'год_макс_осадков':'📅 Год макс. осадков',
|
|
33
|
+
'среднемесячные_показатели_январь':'📆 Среднемесячные показатели (январь)',
|
|
34
|
+
'средняя_температура_°C':'🌡️ Средняя температура (°C)',
|
|
35
|
+
'осадки_мм':'🌧️ Осадки (мм)',
|
|
36
|
+
'период_осреднения':'📅 Период осреднения'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var printObj=(o,prefix)=>{
|
|
40
|
+
for(var k in o){
|
|
41
|
+
if(this.skip.includes(k)) {
|
|
42
|
+
continue
|
|
43
|
+
}
|
|
44
|
+
if(typeof o[k]=='object'&&o[k]!=null){
|
|
45
|
+
console.log(prefix+(emojiMap[k]||k)+':')
|
|
46
|
+
printObj(o[k],prefix+' ')
|
|
47
|
+
}else{
|
|
48
|
+
var val=o[k]
|
|
49
|
+
if(k=='время_наблюдения') {
|
|
50
|
+
var _val=this.parseDate(o[k])
|
|
51
|
+
var val=this.printDateRu(_val);
|
|
52
|
+
}
|
|
53
|
+
console.log(prefix+(emojiMap[k]||k)+': '+val)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
printObj(obj,'')
|
|
59
|
+
}
|
|
60
|
+
printDateRu(_val){
|
|
61
|
+
var val=_val?_val.toLocaleString('ru',{year:'numeric',month:'short',day:'2-digit',hour:'2-digit',minute:'2-digit',hour12:false}):_val
|
|
62
|
+
val=val.replace(',','') // remove extra comma
|
|
63
|
+
return val
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async вып() {
|
|
68
|
+
if(!this.printRu){
|
|
69
|
+
super.вып()
|
|
70
|
+
log('🔺МОСКВА🔺 runtime on Moskva')
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
if(this.logFetch) {
|
|
74
|
+
super._log=true
|
|
75
|
+
}
|
|
76
|
+
var t = await super.fetchMoscow()
|
|
77
|
+
}finally {
|
|
78
|
+
super._log = false
|
|
79
|
+
}
|
|
80
|
+
var data = this.process(t)
|
|
81
|
+
// послеВып
|
|
82
|
+
if(this.translate=='ru') {
|
|
83
|
+
data= this.convertToRussianFull(data)
|
|
84
|
+
}
|
|
85
|
+
if(this.printRu) {
|
|
86
|
+
this.printRuWeather(data)
|
|
87
|
+
}else {
|
|
88
|
+
log(data)
|
|
89
|
+
}
|
|
90
|
+
// return data // if print then show print
|
|
91
|
+
}
|
|
92
|
+
parseDate(str){
|
|
93
|
+
// var str='January, 30 15:00'
|
|
94
|
+
var parts=str.match(/([a-zA-Z]+),\s*(\d+)\s+(\d+):(\d+)/)
|
|
95
|
+
if(parts){
|
|
96
|
+
var month=parts[1]
|
|
97
|
+
var day=parseInt(parts[2])
|
|
98
|
+
var hour=parseInt(parts[3])
|
|
99
|
+
var minute=parseInt(parts[4])
|
|
100
|
+
var monthIndex=new Date(Date.parse(month +" 1, 2000")).getMonth() // 0-based
|
|
101
|
+
var date=new Date()
|
|
102
|
+
date.setMonth(monthIndex)
|
|
103
|
+
date.setDate(day)
|
|
104
|
+
date.setHours(hour)
|
|
105
|
+
date.setMinutes(minute)
|
|
106
|
+
date.setSeconds(0)
|
|
107
|
+
date.setMilliseconds(0)
|
|
108
|
+
// console.log(date)
|
|
109
|
+
return date
|
|
110
|
+
}
|
|
111
|
+
return null
|
|
112
|
+
}
|
|
113
|
+
matchSingle(re, str) {
|
|
114
|
+
var m = str.match(re)
|
|
115
|
+
return m ? m[1].trim() : null
|
|
116
|
+
}
|
|
117
|
+
process(html) {
|
|
118
|
+
var matchSingle = this.matchSingle.bind(null)
|
|
119
|
+
|
|
120
|
+
var country = matchSingle(/<option value="russia\/moscow-area\/moscow" selected>([^<]+)<\/option>/i, html)
|
|
121
|
+
var region = matchSingle(/<option value="russia\/moscow-area\/moscow" selected>([^<]+)<\/option>/i, html)
|
|
122
|
+
var location = matchSingle(/<option value="russia\/moscow-area\/moscow" selected>([^<]+)<\/option>/i, html)
|
|
123
|
+
var observation_time = matchSingle(/<td colspan="2" align="right"[^>]*>([^<]+) /i, html)
|
|
124
|
+
// var atmospheric_pressure_mm = parseFloat(matchSingle(/Atmospheric pressure,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
125
|
+
// Atmospheric pressure, <nobr>mm</td><td width="40%" style="border-bottom: 1px solid #D3D3D3;" align="center">750</td>
|
|
126
|
+
// var atmospheric_pressure_mm=parseFloat(matchSingle(/Atmospheric pressure,[^<]*(?:<nobr>[^<]*<\/nobr>)?<\/td><td[^>]*>([^<]+)/i,html))
|
|
127
|
+
// var atmospheric_pressure_mm=parseFloat(matchSingle(/Atmospheric pressure,[^<]*<\/td><td[^>]*>(\d+)/i,html))
|
|
128
|
+
var atmospheric_pressure_mm = parseFloat(matchSingle(/<td[^>]*>Atmospheric pressure,[^<]*<nobr>mm<\/td><td[^>]*>(\d+)/i, html))
|
|
129
|
+
|
|
130
|
+
// var atmospheric_pressure_mm = parseFloat(matchSingle(/Atmospheric pressure,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
131
|
+
var temperature_C = parseFloat(matchSingle(/Temperature,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
132
|
+
var relative_humidity_percent = parseFloat(matchSingle(/Relative humidity,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
133
|
+
var wind_direction = matchSingle(/Wind direction<\/td><td[^>]*>([^<]+)/i, html)
|
|
134
|
+
var wind_speed_m_s = parseFloat(matchSingle(/Wind speed,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
135
|
+
var horizontal_visibility_km = parseFloat(matchSingle(/Horizontal visibility,[^<]*<\/td><td[^>]*>([^<]+)/i, html))
|
|
136
|
+
|
|
137
|
+
var long_term_obs = {
|
|
138
|
+
min_temperature: parseFloat(matchSingle(/Minimum temperature<\/td><td[^>]*>([^&]+)/i, html)),
|
|
139
|
+
min_temp_year: matchSingle(/Minimum temperature<\/td><td[^>]*>[^<]+<\/td><td[^>]*>(\d+)/i, html),
|
|
140
|
+
max_temperature: parseFloat(matchSingle(/Maximum temperature<\/td><td[^>]*>([^&]+)/i, html)),
|
|
141
|
+
max_temp_year: matchSingle(/Maximum temperature<\/td><td[^>]*>[^<]+<\/td><td[^>]*>(\d+)/i, html),
|
|
142
|
+
max_precipitation_mm: parseFloat(matchSingle(/Maximum amount of precipitation<\/td><td[^>]*>([^ ]+)/i, html)),
|
|
143
|
+
max_precip_year: matchSingle(/Maximum amount of precipitation<\/td><td[^>]*>[^<]+<\/td><td[^>]*>(\d+)/i, html)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
var monthly_averages = {
|
|
147
|
+
temperature_C: parseFloat(matchSingle(/Temperature<\/td><td[^>]*>([^&]+)/i, html)),
|
|
148
|
+
precipitation_mm: parseFloat(matchSingle(/Amount of precipitation<\/td><td[^>]*>([^ ]+)/i, html)),
|
|
149
|
+
averaging_period: matchSingle(/The averaging period: ([^<]+)/i, html)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
var result = {
|
|
153
|
+
country, region, location, observation_time,
|
|
154
|
+
atmospheric_pressure_mm, temperature_C, relative_humidity_percent,
|
|
155
|
+
wind_direction, wind_speed_m_s, horizontal_visibility_km,
|
|
156
|
+
long_term_obs, monthly_averages
|
|
157
|
+
}
|
|
158
|
+
return result
|
|
159
|
+
// console.log(JSON.stringify(data, null, 2))
|
|
160
|
+
|
|
161
|
+
}
|
|
162
|
+
convertToRussianFull(eng){
|
|
163
|
+
var dict={
|
|
164
|
+
country:'страна',
|
|
165
|
+
region:'регион',
|
|
166
|
+
location:'местоположение',
|
|
167
|
+
observation_time:'время_наблюдения',
|
|
168
|
+
atmospheric_pressure_mm:'атмосферное_давление_мм_рт_ст',
|
|
169
|
+
temperature_C:'температура_°C',
|
|
170
|
+
relative_humidity_percent:'относительная_влажность_процент',
|
|
171
|
+
wind_direction:'направление_ветра',
|
|
172
|
+
wind_speed_m_s:'средняя_скорость_ветра_м_с',
|
|
173
|
+
horizontal_visibility_km:'горизонтальная_видимость_км',
|
|
174
|
+
long_term_obs:'долгосрочные_наблюдения',
|
|
175
|
+
monthly_averages:'среднемесячные_показатели_январь'
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var innerDicts={
|
|
179
|
+
long_term_obs:{
|
|
180
|
+
min_temperature:'мин_температура_°C',
|
|
181
|
+
min_temp_year:'год_мин_температуры',
|
|
182
|
+
max_temperature:'макс_температура_°C',
|
|
183
|
+
max_temp_year:'год_макс_температуры',
|
|
184
|
+
max_precipitation_mm:'макс_осадки_мм',
|
|
185
|
+
max_precip_year:'год_макс_осадков'
|
|
186
|
+
},
|
|
187
|
+
monthly_averages:{
|
|
188
|
+
temperature_C:'средняя_температура_°C',
|
|
189
|
+
precipitation_mm:'осадки_мм',
|
|
190
|
+
averaging_period:'период_осреднения'
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function translate(obj,d){
|
|
195
|
+
var out={}
|
|
196
|
+
for(var key in d){
|
|
197
|
+
if(obj[key]!=null){
|
|
198
|
+
if(typeof obj[key]=='object'&&!Array.isArray(obj[key])&&innerDicts[key]!=null){
|
|
199
|
+
out[d[key]]={}
|
|
200
|
+
for(var sub in obj[key]){
|
|
201
|
+
if(innerDicts[key][sub]!=null) out[d[key]][innerDicts[key][sub]]=obj[key][sub]
|
|
202
|
+
else out[d[key]][sub]=obj[key][sub]
|
|
203
|
+
}
|
|
204
|
+
}else{
|
|
205
|
+
out[d[key]]=obj[key]
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return out
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return translate(eng,dict)
|
|
213
|
+
}
|
|
214
|
+
// convertToRu(eng) {
|
|
215
|
+
// var dict = {
|
|
216
|
+
// country: 'страна',
|
|
217
|
+
// region: 'регион',
|
|
218
|
+
// location: 'местоположение',
|
|
219
|
+
// observation_time: 'время_наблюдения',
|
|
220
|
+
// atmospheric_pressure_mm: 'атмосферное_давление_мм_рт_ст',
|
|
221
|
+
// temperature_C: 'температура_°C',
|
|
222
|
+
// relative_humidity_percent: 'относительная_влажность_процент',
|
|
223
|
+
// wind_direction: 'направление_ветра',
|
|
224
|
+
// wind_speed_m_s: 'средняя_скорость_ветра_м_с',
|
|
225
|
+
// horizontal_visibility_km: 'горизонтальная_видимость_км',
|
|
226
|
+
// long_term_obs: 'долгосрочные_наблюдения',
|
|
227
|
+
// monthly_averages: 'среднемесячные_показатели_январь'
|
|
228
|
+
// }
|
|
229
|
+
|
|
230
|
+
// var ru = {}
|
|
231
|
+
// for (var key in dict) {
|
|
232
|
+
// if (eng[key] != null) {
|
|
233
|
+
// if (typeof eng[key] == 'object' && !Array.isArray(eng[key])) {
|
|
234
|
+
// ru[dict[key]] = {}
|
|
235
|
+
// for (var sub in eng[key]) {
|
|
236
|
+
// ru[dict[key]][sub] = eng[key][sub]
|
|
237
|
+
// }
|
|
238
|
+
// } else {
|
|
239
|
+
// ru[dict[key]] = eng[key]
|
|
240
|
+
// }
|
|
241
|
+
// }
|
|
242
|
+
// }
|
|
243
|
+
// return ru
|
|
244
|
+
// }
|
|
245
|
+
// #convertToRu(engWeather) {
|
|
246
|
+
// // пример использования
|
|
247
|
+
// var ruWeather = this.convertToRussianAuto(engWeather)
|
|
248
|
+
// return ruWeather
|
|
249
|
+
// }
|
|
250
|
+
// перевод(engWeather){
|
|
251
|
+
// return this.#convertToRu(engWeather)
|
|
252
|
+
// }
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
module.exports = MOCKBA
|
|
256
|
+
|
|
257
|
+
Object.defineProperties(module.exports,{
|
|
258
|
+
москва:{
|
|
259
|
+
get() {
|
|
260
|
+
var москва = new MOCKBA({
|
|
261
|
+
translate: 'ru',
|
|
262
|
+
})
|
|
263
|
+
return москва
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
// // i thought the proxy was smarter?
|
|
269
|
+
// москва()
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mockba",
|
|
3
3
|
"homepage": "https://рантайм.москва",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"license": "CC-BY-ND-4.0",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"moskva": "^0.1.3"
|
|
8
8
|
},
|
|
9
|
+
"bin": "MOCKBA",
|
|
9
10
|
"scripts": {
|
|
10
11
|
"t": "git tag MOCKBA-v$(node -p \"require('./package.json').version\") && git push --tags"
|
|
11
12
|
},
|
package/readme.md
CHANGED
|
@@ -11,14 +11,43 @@ yarn add mockba
|
|
|
11
11
|
```js
|
|
12
12
|
var МОСКВА=require('MOCKBA')
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
var москва=new MOCKBA()
|
|
14
|
+
var москва = new MOCKBA({
|
|
15
|
+
translate: 'ru',
|
|
16
|
+
printRu:true,
|
|
17
|
+
skip:['страна','регион','местоположение'],
|
|
18
|
+
})
|
|
21
19
|
москва()
|
|
22
20
|
```
|
|
23
21
|
|
|
22
|
+
The package outputs the relevant meteorological information about the location.
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
⏰ Время наблюдения: 30 янв. 15:00
|
|
26
|
+
🌡️ Атм. давление (мм рт.ст.): 751
|
|
27
|
+
🌡️ Температура (°C): -12.7
|
|
28
|
+
💧 Влажность (%): 73.2
|
|
29
|
+
🧭 Направление ветра: N-W
|
|
30
|
+
🌬️ Скорость ветра (м/с): 3
|
|
31
|
+
👀 Видимость (км): 19
|
|
32
|
+
📊 Долгосрочные наблюдения:
|
|
33
|
+
❄️ Мин. температура (°C): -35.7
|
|
34
|
+
📅 Год мин. температуры: 1956
|
|
35
|
+
☀️ Макс. температура (°C): 3
|
|
36
|
+
📅 Год макс. температуры: 2016
|
|
37
|
+
🌧️ Макс. осадки (мм): 10
|
|
38
|
+
📅 Год макс. осадков: 1983
|
|
39
|
+
📆 Среднемесячные показатели (январь):
|
|
40
|
+
🌡️ Средняя температура (°C): -35.7
|
|
41
|
+
🌧️ Осадки (мм): 10
|
|
42
|
+
📅 Период осреднения: 1981-2010
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Dependencies
|
|
46
|
+
|
|
47
|
+
The package depends on `moskva` for the apis of fetching the data.
|
|
48
|
+
|
|
49
|
+
## Todo:
|
|
50
|
+
|
|
51
|
+
- [ ] Possibly data could be printed in JSON format.
|
|
52
|
+
|
|
24
53
|
<!-- https://xn--80aa1amcqq.xn--80adxhks/img/MOCKBA-npm.jpg -->
|