mockba 0.2.2 → 0.3.1

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 (5) hide show
  1. package/MOCKBA +50 -6
  2. package/changes.md +9 -0
  3. package/index.js +212 -105
  4. package/package.json +3 -2
  5. package/readme.md +140 -23
package/MOCKBA CHANGED
@@ -1,11 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  var MOCKBA = require('.')
3
3
 
4
- // get certain args and pass them?
5
- var москва = new MOCKBA({
6
- translate: 'ru',
7
- printRu: true,
8
- skip:['страна','регион','местоположение'],
9
- })
4
+ var args=process.argv
5
+
6
+ var json=process.argv.find(a=>a=='-json')
7
+ var js=process.argv.find(a=>a=='-js')
8
+ var ru=process.argv.find(a=>a=='-ru')
9
+ // var json=process.argv.find(a=>a=='-ru')
10
+
11
+ if(json) {
12
+ var москва = new MOCKBA({
13
+ disableIndicator:true,
14
+ json:true,
15
+ ...(ru?{translate:'ru'}:void 0),
16
+ })
17
+ } else if(js) {
18
+ var москва = new MOCKBA({
19
+ disableIndicator:true,
20
+ js:true,
21
+ ...(ru?{translate:'ru'}:void 0),
22
+ })
23
+ } else {
24
+ var москва = new MOCKBA({
25
+ human:true,
26
+ ...(ru?{
27
+ skip:['страна','регион','местоположение'],
28
+ translate:'ru',
29
+ }:void 0),
30
+ })
31
+ }
32
+
33
+ // if(rujson) {
34
+ // var москва = new MOCKBA({
35
+ // translate: 'ru',
36
+ // json:true,
37
+ // disableIndicator:true,
38
+ // })
39
+ // } else if(rujs) {
40
+ // var москва = new MOCKBA({
41
+ // translate: 'ru',
42
+ // js:true,
43
+ // disableIndicator:true,
44
+ // })
45
+ // }
46
+ // else {
47
+ // var москва = new MOCKBA({
48
+ // translate: 'ru',
49
+ // printRu: true,
50
+ // skip:['страна','регион','местоположение'],
51
+ // })
52
+ // }
53
+
10
54
 
11
55
  москва()
package/changes.md ADDED
@@ -0,0 +1,9 @@
1
+ ## 30 jan 2026
2
+
3
+ ### v0.3.1
4
+
5
+ - print json and js formats, better cli
6
+ - print each dashboard item in ru
7
+ - fetch moscow data with loading indicator
8
+
9
+ ### v 0.2.2
package/index.js CHANGED
@@ -1,92 +1,241 @@
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
- printRu = false
11
-
12
+ // printRu = false
13
+ human = void 0
14
+ json = false
12
15
  skip=[]
13
- // skip=['страна','регион','местоположение']
14
- printRuWeather(obj){
15
- var emojiMap={
16
+ период_осреднения=null
17
+ static get emojiMap() {
18
+ return new Map(Object.entries({ // does not have default?
16
19
  'страна':'🌍 Страна',
17
20
  'регион':'📍 Регион',
18
21
  'местоположение':'📌 Местоположение',
19
- 'время_наблюдения':'⏰ Время наблюдения',
22
+ 'время_наблюдения':'⏰ Дата и время', // units map also?
20
23
  'атмосферное_давление_мм_рт_ст':'🌡️ Атм. давление (мм рт.ст.)',
21
24
  'температура_°C':'🌡️ Температура (°C)',
22
25
  'относительная_влажность_процент':'💧 Влажность (%)',
23
26
  'направление_ветра':'🧭 Направление ветра',
24
27
  'средняя_скорость_ветра_м_с':'🌬️ Скорость ветра (м/с)',
25
28
  'горизонтальная_видимость_км':'👀 Видимость (км)',
26
- 'долгосрочные_наблюдения':'📊 Долгосрочные наблюдения',
27
- 'мин_температура_°C':'❄️ Мин. температура (°C)',
28
- 'год_мин_температуры':'📅 Год мин. температуры',
29
- 'макс_температура_°C':'☀️ Макс. температура (°C)',
30
- 'год_макс_температуры':'📅 Год макс. температуры',
31
- 'макс_осадки_мм':'🌧️ Макс. осадки (мм)',
32
- 'год_макс_осадков':'📅 Год макс. осадков',
33
- 'среднемесячные_показатели_январь':'📆 Среднемесячные показатели (январь)',
29
+ 'долгосрочные_наблюдения':' 📈 Долгосрочные наблюдения',
30
+ 'мин_температура_°C':'⛄️ Мин. температура (°C)',
31
+ 'год_мин_температуры':'☃️ Год мин. температуры',
32
+ 'макс_температура_°C':'🥵 Макс. температура (°C)',
33
+ 'год_макс_температуры':'🔥 Год макс. температуры',
34
+ 'макс_осадки_мм':' 🌧️ Макс. осадки',
35
+ 'год_макс_осадков':'🌊 Год макс. осадков',
36
+ 'среднемесячные_показатели':'📊 Среднемесячные показатели (январь)',
34
37
  'средняя_температура_°C':'🌡️ Средняя температура (°C)',
35
38
  'осадки_мм':'🌧️ Осадки (мм)',
36
- 'период_осреднения':'📅 Период осреднения'
37
- }
39
+ 'период_осреднения':'📊 Период осреднения'
40
+ }))
41
+ }
42
+ printWeather(obj){
43
+ return this.printRuWeather(obj)
44
+ }
45
+ printRuWeather(obj){
46
+ this.printObj(obj,'')
47
+ }
48
+ tempEmoji(t){
49
+ if(t<=-20) return '🥶'
50
+ if(t<=-10) return '🧊'
51
+ if(t<=0) return '😨'
52
+ if(t<=5) return '🧥'
53
+ if(t<=10) return '🌫️'
54
+ if(t<=15) return '🌥️'
55
+ if(t<=18) return '🌤️'
56
+ if(t<=22) return '🙂'
57
+ if(t<=25) return '😎'
58
+ if(t<=28) return '😅'
59
+ if(t<=32) return '🔥'
60
+ return '🥵'
61
+ }
38
62
 
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)
63
+ printObj(o,prefix){
64
+ // период_осреднения =
65
+ for(var k in o){
66
+ if(this.skip.includes(k)) {
67
+ continue
68
+ }
69
+ var logNl=console.log
70
+ var log=data=>{
71
+ process.stdout.write(data)
72
+ }
73
+ // var log1=process.stdout.write;
74
+ if(typeof o[k]=='object'&&o[k]!=null){
75
+ // console.log(321,k)
76
+ switch(k){
77
+ case 'среднемесячные_показатели':
78
+ logNl('┬ 📊 Среднемесячные показатели с '+o[k].период_осреднения+':')
79
+ this.printObj(o[k],prefix+' ')
80
+ break
81
+ default:
82
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k))
83
+ this.printObj(o[k],prefix+' ')
84
+ }
85
+ // logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+':')
86
+ }else{
87
+ // console.log(123,k)
88
+ switch(k){
89
+ case 'средняя_температура_°C':
90
+ var v=o[k]
91
+ logNl('├─🌡️ \tТемпература\t'+v+'°C')
92
+ break
93
+ case 'осадки_мм':
94
+ logNl('└─ 🌧️ \tОсадки\t\t'+o[k]+'мм')
95
+ break
96
+ case 'атмосферное_давление_мм_рт_ст':
97
+ // logNl('🌡️ Атм. давление\t\t'+o[k]+' мм рт.ст.')
98
+ logNl('⬇️ Атм. давление\t'+o[k]+' мм рт.ст.')
99
+ break
100
+ case 'температура_°C':
101
+ var температура=parseFloat(o[k])
102
+ logNl(this.tempEmoji(температура)+' Температура\t\t'+температура+'°C')
103
+ break
104
+ case 'период_осреднения':
105
+ // this.период_осреднения = o[k]
106
+ // logNl(' 💧 Влажность: '+o[k]+'%')
107
+ break
108
+ case 'относительная_влажность_процент':
109
+ logNl('💧 Влажность\t\t'+o[k]+'%')
110
+ break
111
+ case 'горизонтальная_видимость_км':
112
+ logNl('👀 Видимость\t\t'+o[k]+'км')
113
+ break
114
+ case 'средняя_скорость_ветра_м_с':
115
+ // convert english into ru
116
+ logNl('🌬️ Скорость ветра\t'+o[k]+' м/с')
117
+ break
118
+ case 'направление_ветра':
119
+ var windMap={
120
+ N:'северный',
121
+ NNE:'северо-северо-восточный',
122
+ NE:'северо-восточный',
123
+ ENE:'вост.-сев.-восточный',
124
+ E:'восточный',
125
+ ESE:'вост.-юго-восточный',
126
+ SE:'юго-восточный',
127
+ SSE:'юго-юго-восточный',
128
+ S:'южный',
129
+ SSW:'юго-юго-западный',
130
+ SW:'юго-западный',
131
+ WSW:'зап.-юго-западный',
132
+ W:'западный',
133
+ WNW:'зап.-сев.-западный',
134
+ NW:'северо-западный',
135
+ NNW:'сев.-сев.-западный'
136
+ }
137
+ // convert english into ru
138
+ // var V=o[k]
139
+ var V=o[k]
140
+ var ru=windMap[V]||V
141
+ logNl('🧭 Ветер\t\t'+ru)
142
+ break
143
+ case 'время_наблюдения':
144
+ let d_val=this.parseDate(o[k]) // store date on this
145
+ let val=this.printDateRu(d_val);
146
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+'\t\t'+val)
147
+ break
148
+ case 'макс_температура_°C': // need to see when was min
149
+ // let d_val=this.parseDate(o[k]) // store date on this
150
+ var V=`${o[k]}`.padStart(5,' ')
151
+ log('├─ 🥵\t'+V+'°C')
152
+ break
153
+ case 'макс_осадки_мм':
154
+ var V=`+${o[k]}`.padStart(5,' ')
155
+ log('└─ 🌧️ \t'+V+'мм')
156
+ break
157
+ case 'мин_температура_°C':
158
+ var V=`${o[k]}`.padStart(4,' ')
159
+ log('├─ ⛄️\t'+V+'°C')
160
+ break
161
+ case 'год_мин_температуры':
162
+ case 'год_макс_температуры':
163
+ case 'год_макс_осадков':
164
+ log(' в '+o[k])
165
+ let y_val=this.yearsAgo(o[k])
166
+ logNl(', '+y_val+' лет назад')
167
+ break
168
+ default:
169
+ logNl(prefix+(MOCKBA.emojiMap.get(k)||k)+': '+o[k])
54
170
  }
55
171
  }
56
172
  }
57
-
58
- printObj(obj,'')
59
173
  }
174
+ yearsAgo(year){
175
+ if(!year) return null
176
+ var now=new Date().getFullYear()
177
+ return now-parseInt(year)
178
+ }
179
+
180
+ /** --- @arg {Date} _val */
60
181
  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
182
+ var val=_val?_val.toLocaleString('ru',{
183
+ year:'numeric',month:'short',day:'2-digit',hour:'2-digit',minute:'2-digit',
184
+ hour12:false,
185
+ }):_val
186
+ val=val.replace(',','')
63
187
  return val
64
188
  }
65
189
 
66
190
 
67
191
  async вып() {
68
192
  if(!this.printRu){
69
- super.вып()
70
- log('🔺МОСКВА🔺 runtime on Moskva')
193
+ // super.вып()
194
+ // log('🔺МОСКВА🔺 runtime on Moskva')
71
195
  }
72
196
  try {
73
197
  if(this.logFetch) {
74
198
  super._log=true
75
199
  }
76
- var t = await super.fetchMoscow()
200
+ if(!this.disableIndicator) {
201
+ var t = await indicatrix('Загружаем данные по Москве',super.fetchMoscow())
202
+ }else {
203
+ var t = await super.fetchMoscow()
204
+ }
77
205
  }finally {
78
206
  super._log = false
79
207
  }
80
208
  var data = this.process(t)
81
209
  // послеВып
82
210
  if(this.translate=='ru') {
83
- data= this.convertToRussianFull(data)
211
+ data=this.convertToRussianFull(data)
84
212
  }
85
- if(this.printRu) {
86
- this.printRuWeather(data)
87
- }else {
213
+
214
+ // if(this.human) {
215
+ // if(!this.translate) {
216
+ // this.printWeather(data)
217
+ // }else if(this.translate=='ru') {
218
+ // this.printRuWeather(data)
219
+ // }else {
220
+ // throw new Error('Translate not supported '+this.translate)
221
+ // }
222
+ // }else
223
+ if (this.json) {
224
+ log(JSON.stringify(data,null,1))
225
+ } else if (this.js) {
88
226
  log(data)
227
+ } else {
228
+ if(!this.translate) {
229
+ this.printWeather(data)
230
+ }else if(this.translate=='ru') {
231
+ this.printRuWeather(data)
232
+ }else {
233
+ throw new Error('Translate not supported '+this.translate)
234
+ }
89
235
  }
236
+ // else {
237
+ // // log(JSON.stringify(data,null,1))
238
+ // }
90
239
  // return data // if print then show print
91
240
  }
92
241
  parseDate(str){
@@ -144,8 +293,8 @@ class MOCKBA extends Moskva {
144
293
  }
145
294
 
146
295
  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)),
296
+ temperature_C: parseFloat(matchSingle(/<td>Temperature<\/td><td[^>]*>([^&]+)/i, html)),
297
+ precipitation_mm: parseFloat(matchSingle(/<td>Amount of precipitation<\/td><td[^>]*>([^ ]+)/i, html)),
149
298
  averaging_period: matchSingle(/The averaging period: ([^<]+)/i, html)
150
299
  }
151
300
 
@@ -156,8 +305,6 @@ class MOCKBA extends Moskva {
156
305
  long_term_obs, monthly_averages
157
306
  }
158
307
  return result
159
- // console.log(JSON.stringify(data, null, 2))
160
-
161
308
  }
162
309
  convertToRussianFull(eng){
163
310
  var dict={
@@ -172,7 +319,7 @@ class MOCKBA extends Moskva {
172
319
  wind_speed_m_s:'средняя_скорость_ветра_м_с',
173
320
  horizontal_visibility_km:'горизонтальная_видимость_км',
174
321
  long_term_obs:'долгосрочные_наблюдения',
175
- monthly_averages:'среднемесячные_показатели_январь'
322
+ monthly_averages:'среднемесячные_показатели'
176
323
  }
177
324
 
178
325
  var innerDicts={
@@ -191,67 +338,30 @@ class MOCKBA extends Moskva {
191
338
  }
192
339
  }
193
340
 
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]
341
+
342
+ return this.$translate(eng,dict,innerDicts)
343
+ }
344
+
345
+ $translate(obj,d,innerDicts){
346
+ var out={}
347
+ for(var key in d){
348
+ if(obj[key]!=null){
349
+ if(typeof obj[key]=='object'&&!Array.isArray(obj[key])&&innerDicts[key]!=null){
350
+ out[d[key]]={}
351
+ for(var sub in obj[key]){
352
+ if(innerDicts[key][sub]!=null) out[d[key]][innerDicts[key][sub]]=obj[key][sub]
353
+ else out[d[key]][sub]=obj[key][sub]
206
354
  }
355
+ }else{
356
+ out[d[key]]=obj[key]
207
357
  }
208
358
  }
209
- return out
210
359
  }
211
-
212
- return translate(eng,dict)
360
+ return out
213
361
  }
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
362
  }
254
363
 
364
+
255
365
  module.exports = MOCKBA
256
366
 
257
367
  Object.defineProperties(module.exports,{
@@ -264,6 +374,3 @@ Object.defineProperties(module.exports,{
264
374
  }
265
375
  }
266
376
  })
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.1",
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"
package/readme.md CHANGED
@@ -6,8 +6,13 @@
6
6
 
7
7
  ```sh
8
8
  yarn add mockba
9
+ yarn MOCKBA # use
9
10
  ```
10
11
 
12
+ ###
13
+
14
+ The package can be imported directly and run with configuration:
15
+
11
16
  ```js
12
17
  var МОСКВА=require('MOCKBA')
13
18
 
@@ -19,35 +24,147 @@ var москва = new MOCKBA({
19
24
  москва()
20
25
  ```
21
26
 
22
- The package outputs the relevant meteorological information about the location.
27
+ ## CLI
28
+
29
+ By default, the package' binary MOCKBA outputs the relevant meteorological
30
+ information about the city in the local human-readable format which is
31
+ equivalent to invoking the API example above.
23
32
 
24
33
  ```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
34
+ Дата и время 30 янв. 2026 г. 21:00
35
+ ⬇️ Атм. давление 752 мм рт.ст.
36
+ 🧊 Температура -15.8°C
37
+ 💧 Влажность 76.4%
38
+ 🧭 Ветер северный
39
+ 🌬️ Скорость ветра 1 м/с
40
+ 👀 Видимость 20км
41
+ 📈 Долгосрочные наблюдения
42
+ ├─ ⛄️ -35.7°C в 1956, 70 лет назад
43
+ ├─ 🥵 3°C в 2016, 10 лет назад
44
+ └─ 🌧️ +10мм в 1983, 43 лет назад
45
+ 📊 Среднемесячные показатели с 1981-2010:
46
+ ├─🌡️ Температура -6.5°C
47
+ └─ 🌧️ Осадки 52мм
43
48
  ```
44
49
 
45
- ## Dependencies
50
+ ### MOCKBA -json
46
51
 
47
- The package depends on `moskva` for the apis of fetching the data.
52
+ ```json
53
+ {
54
+ "country": "RUSSIA",
55
+ "region": "RUSSIA",
56
+ "location": "RUSSIA",
57
+ "observation_time": "January, 30 21:00",
58
+ "atmospheric_pressure_mm": 752,
59
+ "temperature_C": -15.8,
60
+ "relative_humidity_percent": 76.4,
61
+ "wind_direction": "N",
62
+ "wind_speed_m_s": 1,
63
+ "horizontal_visibility_km": 20,
64
+ "long_term_obs": {
65
+ "min_temperature": -35.7,
66
+ "min_temp_year": "1956",
67
+ "max_temperature": 3,
68
+ "max_temp_year": "2016",
69
+ "max_precipitation_mm": 10,
70
+ "max_precip_year": "1983"
71
+ },
72
+ "monthly_averages": {
73
+ "temperature_C": -6.5,
74
+ "precipitation_mm": 52,
75
+ "averaging_period": "1981-2010"
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### MOCKBA -json -ru
81
+
82
+ ```json
83
+ {
84
+ "страна": "RUSSIA",
85
+ "регион": "RUSSIA",
86
+ "местоположение": "RUSSIA",
87
+ "время_наблюдения": "January, 30 21:00",
88
+ "атмосферное_давление_мм_рт_ст": 752,
89
+ "температура_°C": -15.9,
90
+ "относительная_влажность_процент": 75,
91
+ "направление_ветра": "N",
92
+ "средняя_скорость_ветра_м_с": 1,
93
+ "горизонтальная_видимость_км": 20,
94
+ "долгосрочные_наблюдения": {
95
+ "мин_температура_°C": -35.7,
96
+ "год_мин_температуры": "1956",
97
+ "макс_температура_°C": 3,
98
+ "год_макс_температуры": "2016",
99
+ "макс_осадки_мм": 10,
100
+ "год_макс_осадков": "1983"
101
+ },
102
+ "среднемесячные_показатели": {
103
+ "средняя_температура_°C": -6.5,
104
+ "осадки_мм": 52,
105
+ "период_осреднения": "1981-2010"
106
+ }
107
+ }
108
+ ```
48
109
 
49
- ## Todo:
110
+ ### MOCKBA -js
50
111
 
51
- - [ ] Possibly data could be printed in JSON format.
112
+ ```js
113
+ {
114
+ country: 'RUSSIA',
115
+ region: 'RUSSIA',
116
+ location: 'RUSSIA',
117
+ observation_time: 'January, 30 21:00',
118
+ atmospheric_pressure_mm: 752,
119
+ temperature_C: -15.9,
120
+ relative_humidity_percent: 75,
121
+ wind_direction: 'N',
122
+ wind_speed_m_s: 1,
123
+ horizontal_visibility_km: 20,
124
+ long_term_obs: {
125
+ min_temperature: -35.7,
126
+ min_temp_year: '1956',
127
+ max_temperature: 3,
128
+ max_temp_year: '2016',
129
+ max_precipitation_mm: 10,
130
+ max_precip_year: '1983'
131
+ },
132
+ monthly_averages: {
133
+ temperature_C: -6.5,
134
+ precipitation_mm: 52,
135
+ averaging_period: '1981-2010'
136
+ }
137
+ }
138
+ ```
139
+
140
+ ### MOCKBA -js -ru
141
+
142
+ ```js
143
+ {
144
+ 'страна': 'RUSSIA',
145
+ 'регион': 'RUSSIA',
146
+ 'местоположение': 'RUSSIA',
147
+ 'время_наблюдения': 'January, 30 21:00',
148
+ 'атмосферное_давление_мм_рт_ст': 752,
149
+ 'температура_°C': -15.8,
150
+ 'относительная_влажность_процент': 76.4,
151
+ 'направление_ветра': 'N',
152
+ 'средняя_скорость_ветра_м_с': 1,
153
+ 'горизонтальная_видимость_км': 20,
154
+ 'долгосрочные_наблюдения': {
155
+ 'мин_температура_°C': -35.7,
156
+ 'год_мин_температуры': '1956',
157
+ 'макс_температура_°C': 3,
158
+ 'год_макс_температуры': '2016',
159
+ 'макс_осадки_мм': 10,
160
+ 'год_макс_осадков': '1983'
161
+ },
162
+ 'среднемесячные_показатели': {
163
+ 'средняя_температура_°C': -6.5,
164
+ 'осадки_мм': 52,
165
+ 'период_осреднения': '1981-2010'
166
+ }
167
+ }
168
+ ```
52
169
 
53
170
  <!-- https://xn--80aa1amcqq.xn--80adxhks/img/MOCKBA-npm.jpg -->