mockba 0.1.2 → 0.2.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.
package/MOCKBA ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ var MOCKBA = require('.')
3
+
4
+ // get certain args and pass them?
5
+ var москва = new MOCKBA({
6
+ translate: 'ru',
7
+ printRu: true,
8
+ skip:['страна','регион','местоположение'],
9
+ })
10
+
11
+ москва()
package/index.js CHANGED
@@ -1 +1,269 @@
1
- module.exports=require('moskva')
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"[^>]*>([^<]+)&nbsp;/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.1.2",
4
+ "version": "0.2.1",
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
- class MOCKBA extends МОСКВА {
15
- вып() {
16
- super.вып()
17
- console.log('my moscow @ example')
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 -->
package/test/index.js CHANGED
@@ -1,4 +1,8 @@
1
1
  var MOCKBA = require('..')
2
2
 
3
- var МОСКВА=new MOCKBA()
4
- МОСКВА()
3
+ var москва = new MOCKBA({
4
+ translate: 'ru',
5
+ printRu: true,
6
+ skip:['страна','регион','местоположение'],
7
+ })
8
+ москва()