Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kirill Hryvicki - 0 #20

Open
wants to merge 23 commits into
base: master
Choose a base branch
from
18 changes: 18 additions & 0 deletions Hryvicki Kirill/0/loadFiles.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
require 'mechanize'
require 'open-uri'
require 'uri'

agent = Mechanize.new
page = agent.get('http://www.belstat.gov.by/ofitsialnaya-statistika/makroekonomika-i-okruzhayushchaya-sreda/tseny/operativnaya-informatsiya_4/srednie-tseny-na-potrebitelskie-tovary-i-uslugi-po-respublike-belarus')
page.links_with(:href => /.xls/).each do |link|

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/HashSyntax: Use the new Ruby 1.9 hash syntax.

str_link = link.href.to_s
str_link = URI.unescape(str_link)
str_link = URI.escape(str_link)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lint/UriEscapeUnescape: URI.escape method is obsolete and should not be used. Instead, use CGI.escape, URI.encode_www_form or URI.encode_www_form_component depending on your specific use case.

if /http:\/\/www.belstat.gov.by/ === str_link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/ConditionalAssignment: Use the return of the conditional for variable assignment and comparison.
Performance/RegexpMatch: Use match? instead of === when MatchData is not used.
Style/RegexpLiteral: Use %r around regular expression.
Style/CaseEquality: Avoid the use of the case equality operator ===.

f_link = str_link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/IndentationWidth: Use 2 (not 4) spaces for indentation.

else
f_link = 'http://www.belstat.gov.by' + str_link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/IndentationWidth: Use 2 (not 4) spaces for indentation.

end
download = open(f_link)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security/Open: The use of Kernel#open is a serious security risk.

IO.copy_stream(download, "./data/#{download.base_uri.to_s.split('/')[-1]}")
end

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingBlankLines: Final newline missing.

241 changes: 241 additions & 0 deletions Hryvicki Kirill/0/run.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
require 'roo'
RGBD marked this conversation as resolved.
Show resolved Hide resolved
require 'roo-xls'

def getFileInstance(filePath)
ext = filePath.split(".")[2]
fileInstance = nil

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingWhitespace: Trailing whitespace detected.

if ext == "xls" || ext == "xlsx"
fileInstance = Roo::Spreadsheet.open(filePath)
case ext
when "xls"
fileInstance = Roo::Excel.new(filePath)
when "xlsx"
fileInstance = Roo::Excelx.new(filePath)
end
else
puts "unsupported file type: " + filePath
end

return fileInstance
end

def findKeys(word, products)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming/MethodName: Use snake_case for method names.

result = []

products.keys.each { |key|

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/BlockDelimiters: Avoid using {...} for multi-line blocks.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно использовать select, и обойтись без объявления result

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

if(key.include?(word))
result.push(key)
end
}
return result

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/RedundantReturn: Redundant return detected.

end

def fetchProductsData(fileInstance, products, regions)

for n in 9..fileInstance.last_row
if fileInstance.cell("E", n) == nil
next
end

year = fileInstance.cell("A", 3).split(" ")[2]
month = fileInstance.cell("A", 3).split(" ")[1]

key = fileInstance.cell("A", n).strip.downcase

if !products[key]
products[key] = Hash.new
end
if !products[key][year]
products[key][year] = Hash.new
end

products[key][year][month] = {
regions[0] => formatValue(fileInstance.cell("G", n), year),
regions[1] => formatValue(fileInstance.cell("I", n), year),
regions[2] => formatValue(fileInstance.cell("K", n), year),
regions[3] => formatValue(fileInstance.cell("M", n), year),
regions[4] => formatValue(fileInstance.cell("O", n), year),
regions[5] => formatValue(fileInstance.cell("Q", n), year),
regions[6] => formatValue(fileInstance.cell("S", n), year)
}
end
end

def formatValue(val, year)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming/MethodName: Use snake_case for method names.

if val

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.

result = val.to_f

if year.to_i < 2017
result = result / 10000
end

return result.round(2)
end
end

def getRecentPriceData(key, products, monthMap)
currentYear = Time.now.strftime("%Y").to_s

currentMonth = Time.now.strftime("%m")

monthMap.each { |month, monthNumber|
if monthNumber == currentMonth
currentMonth == month
end
}

productYearData = products[key];

if productYearData[currentYear]
yearKey = currentYear
else
begin
yearKey = productYearData.keys.max{ |a,b| a.to_i <=> b.to_i}
rescue
puts productYearData.keys
end

end

productMonthData = productYearData[yearKey]

if productMonthData[currentMonth]
monthKey = currentMonth
else
monthKey = productMonthData.keys.max{ |a,b| monthMap[a].to_i <=> monthMap[b].to_i}
end

return {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/RedundantReturn: Redundant return detected.

"price" => productMonthData[monthKey]["Minsk"],
"year" => yearKey,
"month" => monthKey,
"product" => key
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingWhitespace: Trailing whitespace detected.

end

def getMinPrice(hash)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/MethodLength: Method has too many lines. [19/10]
Naming/MethodName: Use snake_case for method names.

result = Hash.new
minYearPrice = 9999999999999

hash.each { |year, yearHash|
minMonthPrice = 9999999999999
yearHash.each { |month, monthHash|
price = monthHash['Minsk']
if !price
next
end
if(price < minMonthPrice)
minMonthPrice = price
result['month'] = month
end
}
if(minMonthPrice < minYearPrice)
minYearPrice = minMonthPrice
result['year'] = year
result['price'] = minYearPrice
end
}
return result

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/RedundantReturn: Redundant return detected.

end

def getMaxPrice(hash)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/MethodLength: Method has too many lines. [19/10]
Naming/MethodName: Use snake_case for method names.

result = Hash.new
maxYearPrice = 0

hash.each { |year, yearHash|
maxMonthPrice = 0
yearHash.each { |month, monthHash|
price = monthHash['Minsk']
if !price
next
end
if(price > maxMonthPrice)
maxMonthPrice = price
result['month'] = month
end
}
if(maxMonthPrice > maxYearPrice)
maxYearPrice = maxMonthPrice
result['year'] = year
result['price'] = maxYearPrice
end
}
return result

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/RedundantReturn: Redundant return detected.

end

def getSimilarPriceProducts(data, products)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/AbcSize: Assignment Branch Condition size for getSimilarPriceProducts is too high. [17.23/15]
Metrics/MethodLength: Method has too many lines. [11/10]
Naming/MethodName: Use snake_case for method names.

result = []
price = data["price"]
year = data["year"]
month = data["month"]
originProduct = data["product"]

products.each { |product, productData|
if !productData[year]
next
end
if !productData[year][month]
next
end
if productData[year][month]["Minsk"] == price && product != originProduct
result.push(product)
end
}
return result

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/RedundantReturn: Redundant return detected.

end

def main

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/AbcSize: Assignment Branch Condition size for main is too high. [61.07/15]
Metrics/MethodLength: Method has too many lines. [50/10]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/AbcSize: Assignment Branch Condition size for main is too high. [60.09/15]
Metrics/MethodLength: Method has too many lines. [48/10]

monthMap = {
'январь' => 1,
'февраль' => 2,
'март' => 3,
'апрель' => 4,
'май' => 5,
'июнь' => 6,
'июль' => 7,
'авуст' => 8,
'сентябрь' => 9,
'октябрь' => 10,
'ноябрь' => 11,
'декабрь' => 12,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/TrailingCommaInHashLiteral: Avoid comma after the last item of a hash.

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingWhitespace: Trailing whitespace detected.

regions = ['Brest', 'Vitebsk', 'Gomel', 'Grodno', 'Minsk', 'Minsk Region', 'Mogilyov']
products = Hash.new

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/EmptyLiteral: Use hash literal {} instead of Hash.new.

filePaths = Dir["./data/*"]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingWhitespace: Trailing whitespace detected.

filePaths.each { |filePath|
fileInstance = getFileInstance(filePath)
if fileInstance
fetchProductsData(fileInstance, products, regions)
end

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/TrailingWhitespace: Trailing whitespace detected.

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/EmptyLines: Extra blank line detected.

while true

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/InfiniteLoop: Use Kernel#loop for infinite loops.
Lint/LiteralAsCondition: Literal true appeared as a condition.

puts "What price are you looking for?"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

word = gets.chomp.downcase
keys = findKeys(word, products)
if keys.length == 0

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/NumericPredicate: Use keys.length.zero? instead of keys.length == 0.
Style/ZeroLengthPredicate: Use empty? instead of length == 0.

puts word.capitalize + " can not be found in database"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

else
keys.each { |key|

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/BlockDelimiters: Avoid using {...} for multi-line blocks.

recentPriceData = getRecentPriceData(key, products, monthMap)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/IndentationWidth: Use 2 (not -2) spaces for indentation.
Naming/VariableName: Use snake_case for variable names.

puts "\n" + key.capitalize + " is " + recentPriceData["price"].to_s + " BYN in Minsk these days."

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

minPrice = getMinPrice(products[key])

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming/VariableName: Use snake_case for variable names.

puts "Lowest was on " + minPrice["year"] + "/" + monthMap[minPrice["month"]].to_s + " at price " + minPrice["price"].to_s + " BYN"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
Metrics/LineLength: Line is too long. [136/120]

maxPrice = getMaxPrice(products[key])

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming/VariableName: Use snake_case for variable names.

puts "Maximum was on " + maxPrice["year"] + "/" + monthMap[maxPrice["month"]].to_s + " at price " + maxPrice["price"].to_s + " BYN"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
Metrics/LineLength: Line is too long. [137/120]

similarProducts = getSimilarPriceProducts(recentPriceData, products)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming/VariableName: Use snake_case for variable names.

if similarProducts.empty? == 0

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/NumericPredicate: Use similarProducts.empty?.zero? instead of similarProducts.empty? == 0.

puts "No products for similar price"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

else
puts "For similar price you also can afford"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

puts similarProducts
end
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layout/BlockAlignment: } at 236, 8 is not aligned with keys.each { |key| at 222, 6.

end
end
end

main