ensuppar 0.1.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8eb5b4d09a78d790db2fad1e548fef8dd2409bfca87d55c3a4428fe0885b7e22
4
- data.tar.gz: 2bf394b2c5f67559a036f4cc0ffd9620d3143b8a53da32f8559d3080d8a23309
3
+ metadata.gz: b07e512171277fff8347b3eeb9f108d23f71dcb8b9ce1552648234b0abbec391
4
+ data.tar.gz: 01d611a95d88ba81698f48ca41ef449105c19b7b095039defd9f942bb9c253eb
5
5
  SHA512:
6
- metadata.gz: 515faf14ec4d94a10694bc575a963dcfb5fb771728fe64527341b504c6b54cc01503a582f3c7a8ec81df97c14082d3a2d51e6ebcdd3961900e84a7ec7fde1738
7
- data.tar.gz: 60243c058120f5f5eff96f1aac0fe99881a0e2bd32fe56ed004628eda17559fa661f6e08b0fbdf147bb6499673ed858e116faa58d02ee018107d4b3d69b66bc1
6
+ metadata.gz: f9bed5ae50dea3f07b02648a536b25e25bc8c2248770ae195ef82ad84234f8175bf6dc86536ff35fea21b8c0db75608d6b48a9f980a196932d5e113ff8faaee5
7
+ data.tar.gz: 21c1700cba1f813aa3afb3160a43f1b080d24c7a5b88714bce41342cf0c5e21bfdc8836663644896c878b4a1d5b17c41b6f7cbd0bd0a7d67b4549360d8b45b7f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0.0] - 2022-11-26
4
+
5
+ - Added database
6
+ - Added logic for fetching result from server
7
+ - Added parcing logic
8
+ - Buildings can have many energy schedules
9
+ - Added filtering by street and number
10
+
3
11
  ## [0.1.0] - 2022-11-26
4
12
 
5
13
  - Initial release
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ensuppar (1.0.0)
5
+ httparty
6
+ nokogiri
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ coderay (1.1.3)
12
+ diff-lcs (1.5.0)
13
+ httparty (0.20.0)
14
+ mime-types (~> 3.0)
15
+ multi_xml (>= 0.5.2)
16
+ method_source (1.0.0)
17
+ mime-types (3.4.1)
18
+ mime-types-data (~> 3.2015)
19
+ mime-types-data (3.2022.0105)
20
+ multi_xml (0.6.0)
21
+ nokogiri (1.13.9-x86_64-linux)
22
+ racc (~> 1.4)
23
+ pry (0.13.1)
24
+ coderay (~> 1.1)
25
+ method_source (~> 1.0)
26
+ racc (1.6.0)
27
+ rake (13.0.6)
28
+ rspec (3.11.0)
29
+ rspec-core (~> 3.11.0)
30
+ rspec-expectations (~> 3.11.0)
31
+ rspec-mocks (~> 3.11.0)
32
+ rspec-core (3.11.0)
33
+ rspec-support (~> 3.11.0)
34
+ rspec-expectations (3.11.0)
35
+ diff-lcs (>= 1.2.0, < 2.0)
36
+ rspec-support (~> 3.11.0)
37
+ rspec-mocks (3.11.1)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.11.0)
40
+ rspec-support (3.11.0)
41
+
42
+ PLATFORMS
43
+ x86_64-linux
44
+
45
+ DEPENDENCIES
46
+ ensuppar!
47
+ pry (~> 0.13.1)
48
+ rake (~> 13.0)
49
+ rspec (~> 3.0)
50
+
51
+ BUNDLED WITH
52
+ 2.3.24
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Ensuppar
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ensuppar`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Ensuppar is a gem that allows fetch data from energy website, parse it and return collection of objects for manipulating of them.
6
4
 
7
5
  ## Installation
8
6
 
@@ -16,7 +14,27 @@ If bundler is not being used to manage dependencies, install the gem by executin
16
14
 
17
15
  ## Usage
18
16
 
19
- TODO: Write usage instructions here
17
+ #### Put this gem at your Gemfile
18
+
19
+ ```
20
+ gem 'ensuppar'
21
+ ```
22
+
23
+ #### Configure it
24
+
25
+ ```
26
+ Ensuppar.confiure do |conf|
27
+ host = "host/to/server"
28
+ end
29
+ ```
30
+
31
+ #### Get entities
32
+
33
+ ```
34
+ Ensuppar.get_schedule(city: "Івано-Франківськ", street: "Незалежності", number: 40)
35
+ ```
36
+
37
+ Parameters `street` and `number` is not required.
20
38
 
21
39
  ## Development
22
40
 
@@ -0,0 +1,15 @@
1
+ module Ensuppar
2
+ class Configuration
3
+ attr_writer :host
4
+
5
+ def initialize
6
+ @host = nil
7
+ end
8
+
9
+ def host
10
+ raise Errors::Configuration, "URL of Energy Supplying website is missing!" unless @host
11
+
12
+ @host
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ [
2
+ {
3
+ "city": "Івано-Франківськ",
4
+ "city_id": 31107,
5
+ "rem_id": "iv-fr_p"
6
+ }
7
+ ]
@@ -0,0 +1,30 @@
1
+ module Ensuppar
2
+ module Detectors
3
+ class CityDetector
4
+ DB_PATH = 'lib/ensuppar/db/cities.json'
5
+
6
+ attr_reader :city
7
+
8
+ def initialize(city:)
9
+ @city = city
10
+ end
11
+
12
+ def city_data
13
+ @city_data ||= (get_db_cities.find do |city_data|
14
+ city_data['city'] == city
15
+ end || {}).transform_keys(&:to_sym)
16
+ end
17
+
18
+ private
19
+
20
+ def get_db_cities
21
+ file = File.open DB_PATH
22
+ data = JSON.load file
23
+
24
+ file.close
25
+
26
+ data
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ module Ensuppar
2
+ module Entities
3
+ class Building
4
+ attr_reader :city, :street, :number, :energy_schedules
5
+
6
+ def initialize(city:, street:, number:, energy_schedules: [])
7
+ @city = city
8
+ @street = street
9
+ @number = number
10
+ @energy_schedules = energy_schedules
11
+ end
12
+
13
+ def info
14
+ "#{city}, #{street} #{number}: #{energy_schedules.map(&:info).join(", ")}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module Ensuppar
2
+ module Entities
3
+ class EnergySchedule
4
+ attr_reader :start_date, :end_date
5
+
6
+ def initialize(start_date: nil, end_date: nil)
7
+ @start_date = start_date
8
+ @end_date = end_date
9
+ end
10
+
11
+ def info
12
+ " [ #{start_date} - #{end_date} ] "
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module Ensuppar
2
+ module Errors
3
+ class Configuration < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module Ensuppar
2
+ module Services
3
+ module EnergySuplyService
4
+ class Client
5
+ def self.city_filter_report(city_id:, rem_id:)
6
+ path = "GAVTurnOff/CityFilterPReport"
7
+ options = "cityList=#{city_id}&remList=#{rem_id}&dBegin=&dEnd=&allRem=false"
8
+ response = HTTParty.get("https://#{Ensuppar.configuration.host}/#{path}?#{options}")
9
+
10
+ Ensuppar::Services::EnergySuplyService::Parser.new(body: response.body).entities
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ module Ensuppar
2
+ module Services
3
+ module EnergySuplyService
4
+ class Parser
5
+ attr_reader :body
6
+
7
+ def initialize(body: "")
8
+ @body = body
9
+ end
10
+
11
+ def parsed_body
12
+ @parsed_body ||= Nokogiri::HTML.parse(body) || ""
13
+ end
14
+
15
+ def entities
16
+ @entities ||= begin
17
+ parsed_body.xpath("//tbody").first.children.select do
18
+ |c| c.name == "tr"
19
+ end.map{|c| c.children}.map do |td|
20
+ data = td.select{|c| c.name == "td"}.map do |tdd|
21
+ tdd.children.first.text
22
+ end
23
+
24
+ energy_schedule = Ensuppar::Entities::EnergySchedule.new(start_date: data[4], end_date: data[5])
25
+
26
+ Ensuppar::Entities::Building.new(
27
+ city: data[1], street: data[2], number: data[3], energy_schedules: [energy_schedule]
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ensuppar
4
- VERSION = "0.1.0"
4
+ VERSION = "1.0.0"
5
5
  end
data/lib/ensuppar.rb CHANGED
@@ -1,8 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
4
+ require 'httparty'
5
+ require 'nokogiri'
6
+
3
7
  require_relative "ensuppar/version"
8
+ require_relative "ensuppar/configuration"
9
+ require_relative "ensuppar/errors/configuration"
10
+ require_relative "ensuppar/detectors/city_detector"
11
+ require_relative "ensuppar/entities/energy_schedule"
12
+ require_relative "ensuppar/entities/building"
13
+ require_relative "ensuppar/services/energy_suply_service/parser"
14
+ require_relative "ensuppar/services/energy_suply_service/client"
4
15
 
5
16
  module Ensuppar
6
- class Error < StandardError; end
7
- # Your code goes here...
17
+ class << self
18
+ def get_schedule(city:, street: "", number: nil)
19
+ city_data = Detectors::CityDetector.new(city: city).city_data
20
+
21
+ entities = Services::EnergySuplyService::Client.city_filter_report(
22
+ city_id: city_data[:city_id],
23
+ rem_id: city_data[:rem_id]
24
+ )
25
+
26
+ entities.select do |b|
27
+ cond = b.street == street || street == ""
28
+
29
+ (number.nil? && cond) || (number.to_s == b.number && cond)
30
+ end
31
+ end
32
+
33
+ def configuration
34
+ @configuration ||= Configuration.new
35
+ end
36
+
37
+ def reset
38
+ @configuration = Configuration.new
39
+ end
40
+
41
+ def configure
42
+ yield(configuration)
43
+ end
44
+ end
8
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ensuppar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Misha Marusyk
@@ -9,7 +9,49 @@ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
11
  date: 2022-11-26 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.13.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.13.1
13
55
  description: Ensuppar is a parser for energy supplying website.
14
56
  email:
15
57
  - misha.marusyk@gmail.com
@@ -21,10 +63,19 @@ files:
21
63
  - CHANGELOG.md
22
64
  - CODE_OF_CONDUCT.md
23
65
  - Gemfile
66
+ - Gemfile.lock
24
67
  - LICENSE.txt
25
68
  - README.md
26
69
  - Rakefile
27
70
  - lib/ensuppar.rb
71
+ - lib/ensuppar/configuration.rb
72
+ - lib/ensuppar/db/cities.json
73
+ - lib/ensuppar/detectors/city_detector.rb
74
+ - lib/ensuppar/entities/building.rb
75
+ - lib/ensuppar/entities/energy_schedule.rb
76
+ - lib/ensuppar/errors/configuration.rb
77
+ - lib/ensuppar/services/energy_suply_service/client.rb
78
+ - lib/ensuppar/services/energy_suply_service/parser.rb
28
79
  - lib/ensuppar/version.rb
29
80
  - sig/ensuppar.rbs
30
81
  homepage: https://github.com/mmarusyk/ensuppar