mockba 0.2.2 → 0.3.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.
Files changed (3) hide show
  1. package/changes.md +8 -0
  2. package/index.js +180 -98
  3. package/package.json +3 -2
package/changes.md ADDED
@@ -0,0 +1,8 @@
1
+ ## 30 jan 2026
2
+
3
+ ### v0.3.0
4
+
5
+ - print each dashboard item in ru
6
+ - fetch moscow data with loading indicator
7
+
8
+ ### v 0.2.2
package/index.js CHANGED
@@ -1,65 +1,185 @@
1
- // var Moskva = require('moskva')
2
1
  var Moskva=require('moskva')
2
+ var indicatrix=require('indicatrix')
3
3
  var{error,log}=console
4
4
 
5
5
  class MOCKBA extends Moskva {
6
6
  /** @type {'ru'} */
7
7
  translate = ''
8
+ /** Do not print interacitve indicator of data loading */
9
+ disableIndicator = false
8
10
  /** @type {boolean} */
9
11
  logFetch = false
10
12
  printRu = false
11
-
12
13
  skip=[]
13
- // skip=['страна','регион','местоположение']
14
- printRuWeather(obj){
15
- var emojiMap={
14
+ период_осреднения=null
15
+ static get emojiMap() {
16
+ return new Map(Object.entries({ // does not have default?
16
17
  'страна':'🌍 Страна',
17
18
  'регион':'📍 Регион',
18
19
  'местоположение':'📌 Местоположение',
19
- 'время_наблюдения':'⏰ Время наблюдения',
20
+ 'время_наблюдения':'⏰ Дата и время', // units map also?
20
21
  'атмосферное_давление_мм_рт_ст':'🌡️ Атм. давление (мм рт.ст.)',
21
22
  'температура_°C':'🌡️ Температура (°C)',
22
23
  'относительная_влажность_процент':'💧 Влажность (%)',
23
24
  'направление_ветра':'🧭 Направление ветра',
24
25
  'средняя_скорость_ветра_м_с':'🌬️ Скорость ветра (м/с)',
25
26
  'горизонтальная_видимость_км':'👀 Видимость (км)',
26
- 'долгосрочные_наблюдения':'📊 Долгосрочные наблюдения',
27
- 'мин_температура_°C':'❄️ Мин. температура (°C)',
28
- 'год_мин_температуры':'📅 Год мин. температуры',
29
- 'макс_температура_°C':'☀️ Макс. температура (°C)',
30
- 'год_макс_температуры':'📅 Год макс. температуры',
31
- 'макс_осадки_мм':'🌧️ Макс. осадки (мм)',
32
- 'год_макс_осадков':'📅 Год макс. осадков',
33
- 'среднемесячные_показатели_январь':'📆 Среднемесячные показатели (январь)',
27
+ 'долгосрочные_наблюдения':' 📈 Долгосрочные наблюдения',
28
+ 'мин_температура_°C':'⛄️ Мин. температура (°C)',
29
+ 'год_мин_температуры':'☃️ Год мин. температуры',
30
+ 'макс_температура_°C':'🥵 Макс. температура (°C)',
31
+ 'год_макс_температуры':'🔥 Год макс. температуры',
32
+ 'макс_осадки_мм':' 🌧️ Макс. осадки',
33
+ 'год_макс_осадков':'🌊 Год макс. осадков',
34
+ 'среднемесячные_показатели':'📊 Среднемесячные показатели (январь)',
34
35
  'средняя_температура_°C':'🌡️ Средняя температура (°C)',
35
36
  'осадки_мм':'🌧️ Осадки (мм)',
36
- 'период_осреднения':'📅 Период осреднения'
37
- }
37
+ 'период_осреднения':'📊 Период осреднения'
38
+ }))
39
+ }
40
+ // skip=['страна','регион','местоположение']
41
+ printRuWeather(obj){
42
+ this.printObj(obj,'')
43
+ }
44
+ tempEmoji(t){
45
+ if(t<=-20) return '🥶'
46
+ if(t<=-10) return '🧊'
47
+ if(t<=0) return '😨'
48
+ if(t<=5) return '🧥'
49
+ if(t<=10) return '🌫️'
50
+ if(t<=15) return '🌥️'
51
+ if(t<=18) return '🌤️'
52
+ if(t<=22) return '🙂'
53
+ if(t<=25) return '😎'
54
+ if(t<=28) return '😅'
55
+ if(t<=32) return '🔥'
56
+ return '🥵'
57
+ }
38
58
 
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)
59
+ printObj(o,prefix){
60
+ // период_осреднения =
61
+ for(var k in o){
62
+ if(this.skip.includes(k)) {
63
+ continue
64
+ }
65
+ var logNl=console.log
66
+ var log=data=>{
67
+ process.stdout.write(data)
68
+ }
69
+ // var log1=process.stdout.write;
70
+ if(typeof o[k]=='object'&&o[k]!=null){
71
+ // console.log(321,k)
72
+ switch(k){
73
+ case 'среднемесячные_показатели':
74
+ logNl('┬ 📊 Среднемесячные показатели с '+o[k].период_осреднения+':')
75
+ this.printObj(o[k],prefix+' ')
76
+ break
77
+ default:
78
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k))
79
+ this.printObj(o[k],prefix+' ')
80
+ }
81
+ // logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+':')
82
+ }else{
83
+ // console.log(123,k)
84
+ switch(k){
85
+ case 'средняя_температура_°C':
86
+ var v=o[k]
87
+ logNl('├─🌡️ \tТемпература\t'+v+'°C')
88
+ break
89
+ case 'осадки_мм':
90
+ logNl('└─ 🌧️ \tОсадки\t\t'+o[k]+'мм')
91
+ break
92
+ case 'атмосферное_давление_мм_рт_ст':
93
+ // logNl('🌡️ Атм. давление\t\t'+o[k]+' мм рт.ст.')
94
+ logNl('⬇️ Атм. давление\t'+o[k]+' мм рт.ст.')
95
+ break
96
+ case 'температура_°C':
97
+ var температура=parseFloat(o[k])
98
+ logNl(this.tempEmoji(температура)+' Температура\t\t'+температура+'°C')
99
+ break
100
+ case 'период_осреднения':
101
+ // this.период_осреднения = o[k]
102
+ // logNl(' 💧 Влажность: '+o[k]+'%')
103
+ break
104
+ case 'относительная_влажность_процент':
105
+ logNl('💧 Влажность\t\t'+o[k]+'%')
106
+ break
107
+ case 'горизонтальная_видимость_км':
108
+ logNl('👀 Видимость\t\t'+o[k]+'км')
109
+ break
110
+ case 'средняя_скорость_ветра_м_с':
111
+ // convert english into ru
112
+ logNl('🌬️ Скорость ветра\t'+o[k]+' м/с')
113
+ break
114
+ case 'направление_ветра':
115
+ var windMap={
116
+ N:'северный',
117
+ NNE:'северо-северо-восточный',
118
+ NE:'северо-восточный',
119
+ ENE:'вост.-сев.-восточный',
120
+ E:'восточный',
121
+ ESE:'вост.-юго-восточный',
122
+ SE:'юго-восточный',
123
+ SSE:'юго-юго-восточный',
124
+ S:'южный',
125
+ SSW:'юго-юго-западный',
126
+ SW:'юго-западный',
127
+ WSW:'зап.-юго-западный',
128
+ W:'западный',
129
+ WNW:'зап.-сев.-западный',
130
+ NW:'северо-западный',
131
+ NNW:'сев.-сев.-западный'
132
+ }
133
+ // convert english into ru
134
+ // var V=o[k]
135
+ var V=o[k]
136
+ var ru=windMap[V]||V
137
+ logNl('🧭 Ветер\t\t'+ru)
138
+ break
139
+ case 'время_наблюдения':
140
+ let d_val=this.parseDate(o[k]) // store date on this
141
+ let val=this.printDateRu(d_val);
142
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+'\t\t'+val)
143
+ break
144
+ case 'макс_температура_°C': // need to see when was min
145
+ // let d_val=this.parseDate(o[k]) // store date on this
146
+ var V=`${o[k]}`.padStart(5,' ')
147
+ log('├─ 🥵\t'+V+'°C')
148
+ break
149
+ case 'макс_осадки_мм':
150
+ var V=`+${o[k]}`.padStart(5,' ')
151
+ log('└─ 🌧️ \t'+V+'мм')
152
+ break
153
+ case 'мин_температура_°C':
154
+ var V=`${o[k]}`.padStart(4,' ')
155
+ log('├─ ⛄️\t'+V+'°C')
156
+ break
157
+ case 'год_мин_температуры':
158
+ case 'год_макс_температуры':
159
+ case 'год_макс_осадков':
160
+ log(' в '+o[k])
161
+ let y_val=this.yearsAgo(o[k])
162
+ logNl(', '+y_val+' лет назад')
163
+ break
164
+ default:
165
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+': '+o[k])
54
166
  }
55
167
  }
56
168
  }
57
-
58
- printObj(obj,'')
59
169
  }
170
+ yearsAgo(year){
171
+ if(!year) return null
172
+ var now=new Date().getFullYear()
173
+ return now-parseInt(year)
174
+ }
175
+
176
+ /** --- @arg {Date} _val */
60
177
  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
178
+ var val=_val?_val.toLocaleString('ru',{
179
+ year:'numeric',month:'short',day:'2-digit',hour:'2-digit',minute:'2-digit',
180
+ hour12:false,
181
+ }):_val
182
+ val=val.replace(',','')
63
183
  return val
64
184
  }
65
185
 
@@ -73,7 +193,11 @@ class MOCKBA extends Moskva {
73
193
  if(this.logFetch) {
74
194
  super._log=true
75
195
  }
76
- var t = await super.fetchMoscow()
196
+ if(!this.disableIndicator) {
197
+ var t = await indicatrix('Загружаем данные по Москве',super.fetchMoscow())
198
+ }else {
199
+ var t = await super.fetchMoscow()
200
+ }
77
201
  }finally {
78
202
  super._log = false
79
203
  }
@@ -144,8 +268,8 @@ class MOCKBA extends Moskva {
144
268
  }
145
269
 
146
270
  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)),
271
+ temperature_C: parseFloat(matchSingle(/<td>Temperature<\/td><td[^>]*>([^&]+)/i, html)),
272
+ precipitation_mm: parseFloat(matchSingle(/<td>Amount of precipitation<\/td><td[^>]*>([^ ]+)/i, html)),
149
273
  averaging_period: matchSingle(/The averaging period: ([^<]+)/i, html)
150
274
  }
151
275
 
@@ -156,8 +280,6 @@ class MOCKBA extends Moskva {
156
280
  long_term_obs, monthly_averages
157
281
  }
158
282
  return result
159
- // console.log(JSON.stringify(data, null, 2))
160
-
161
283
  }
162
284
  convertToRussianFull(eng){
163
285
  var dict={
@@ -172,7 +294,7 @@ class MOCKBA extends Moskva {
172
294
  wind_speed_m_s:'средняя_скорость_ветра_м_с',
173
295
  horizontal_visibility_km:'горизонтальная_видимость_км',
174
296
  long_term_obs:'долгосрочные_наблюдения',
175
- monthly_averages:'среднемесячные_показатели_январь'
297
+ monthly_averages:'среднемесячные_показатели'
176
298
  }
177
299
 
178
300
  var innerDicts={
@@ -191,67 +313,30 @@ class MOCKBA extends Moskva {
191
313
  }
192
314
  }
193
315
 
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]
316
+
317
+ return this.$translate(eng,dict,innerDicts)
318
+ }
319
+
320
+ $translate(obj,d,innerDicts){
321
+ var out={}
322
+ for(var key in d){
323
+ if(obj[key]!=null){
324
+ if(typeof obj[key]=='object'&&!Array.isArray(obj[key])&&innerDicts[key]!=null){
325
+ out[d[key]]={}
326
+ for(var sub in obj[key]){
327
+ if(innerDicts[key][sub]!=null) out[d[key]][innerDicts[key][sub]]=obj[key][sub]
328
+ else out[d[key]][sub]=obj[key][sub]
206
329
  }
330
+ }else{
331
+ out[d[key]]=obj[key]
207
332
  }
208
333
  }
209
- return out
210
334
  }
211
-
212
- return translate(eng,dict)
335
+ return out
213
336
  }
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
337
  }
254
338
 
339
+
255
340
  module.exports = MOCKBA
256
341
 
257
342
  Object.defineProperties(module.exports,{
@@ -264,6 +349,3 @@ Object.defineProperties(module.exports,{
264
349
  }
265
350
  }
266
351
  })
267
-
268
- // // i thought the proxy was smarter?
269
- // москва()
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "mockba",
3
3
  "homepage": "https://рантайм.москва",
4
- "version": "0.2.2",
4
+ "version": "0.3.0",
5
5
  "license": "CC-BY-ND-4.0",
6
6
  "dependencies": {
7
- "moskva": "^0.1.3"
7
+ "indicatrix": "^1.4.1",
8
+ "moskva": "^0.1.4"
8
9
  },
9
10
  "bin": {
10
11
  "MOCKBA": "MOCKBA"