Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions Converter/bin/converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require "optparse"
require "optparse/time"
require "require_all"
require_all "../main.rb"

options = {}
parser = OptionParser.new do |opt|
opt.on("-i", "--input [url]", String) do |input|
options[:input] = input
end
opt.on("-o", "--output-format [rss | json | atom]", String) do |output|
options[:output] = output
end
end.parse!

p options
main_program = Main.new(options)
main_program.run

#ruby converter.rb -i http://lenta.ru/rss -o json
2 changes: 2 additions & 0 deletions Converter/lib/converters/converter_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module ConverterType
end
22 changes: 22 additions & 0 deletions Converter/lib/converters/ext/atom_converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module AtomConverter
def self.convert(data)
puts 'atom_converter'
result_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<feed version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n"
data.each do |item|
result_xml += "<entry>\n"
result_xml += "<id> #{item[:id]} </id>\n"
result_xml += "<title> #{item[:title]} </title>\n"
result_xml += "<updated'> #{item[:links]} </updated'>\n"
result_xml += "<published> #{item[:description]} </published>\n"
result_xml += "<rights> #{item[:rights]} </rights>\n"
result_xml += "<link> #{item[:link]} </link>\n"
result_xml += "<summary> #{item[:summary]} </summary>\n"
result_xml += "<category> #{item[:category]} </category>\n"
result_xml += "</entry>\n"
end
result_xml += "</feed>"
File.open("../test/fixtures/file.atom", "w") do |file|
file.puts result_xml
end
end
end
11 changes: 11 additions & 0 deletions Converter/lib/converters/ext/json_converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
require "json"

module JsonConverter
def self.convert(data)
puts "json_converter"
result = JSON.pretty_generate(data)
File.open("../test/fixtures/file.json", "w") do |file|
file.puts result
end
end
end
21 changes: 21 additions & 0 deletions Converter/lib/converters/ext/rss_converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module RssConverter
def self.convert(data)
puts 'rss_converter'
result_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n"
data.each do |item|
result_xml += "<item>\n"
result_xml += "<guid> #{item[:guid]} </guid>\n"
result_xml += "<title> #{item[:title]} </title>\n"
result_xml += "<links> #{item[:links]} </links>\n"
result_xml += "<description> #{item[:description]} </description>\n"
result_xml += "<pubDate> #{item[:pubDate]} </pubDate>\n"
result_xml += "<enclosure> #{item[:enclosure]} </enclosure>\n"
result_xml += "<category> #{item[:category]} </category>\n"
result_xml += "</item>\n"
end
result_xml += "</rss>"
File.open("../test/fixtures/file.rss", "w") do |file|
file.puts result_xml
end
end
end
36 changes: 36 additions & 0 deletions Converter/lib/parsers/ext/atom_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
require "nokogiri"

module AtomParser
def self.parse(data)
puts 'atom_parser working'

parse_data = []
doc = Nokogiri::XML(data)
doc.remove_namespaces!
doc.xpath("//entry").each do |item|
parse_data << {
id: item.at("id").text,
title: item.at("title").text,
updated: item.at("updated").text,
published: item.at("published").text,
rights: item.at("rights").text,
link: item.at("link").text,
summary: item.at("summary").text,
category: item.at("category").text,
}
end
parse_data
end

def self.can_parce?(data)
doc = Nokogiri::XML(data).xpath("//feed")
has_feed = doc.first.element?
has_id = self.first_element?(doc.first, "id")
has_title = self.first_element?(doc.first, "title")
has_updated = self.first_element?(doc.first, "updated")
result = has_id && has_title && has_updated && has_id
result
rescue => e
false
end
end
27 changes: 27 additions & 0 deletions Converter/lib/parsers/ext/json_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
require "json"

module JsonParser
def self.parse(data)
puts 'json_parser working'

parse_data = []
JSON.parse(data).each do |item|
parse_data << {
guid: item["guid"],
title: item["title"],
links: item["links"],
description: item["description"],
pubDate: item["pubDate"],
enclosure: item["enclosure"],
category: item["category"],
}
end
parse_data
end

def self.can_parse?(data)
!!JSON.parse(data)
rescue JSON::ParserError => _e
false
end
end
30 changes: 30 additions & 0 deletions Converter/lib/parsers/ext/rss_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require "nokogiri"

module RssParser
def self.parse(data)
puts 'rss_parser working'

parse_data = []
xmlfeed = Nokogiri::XML(data)
doc = xmlfeed.xpath("//item")
doc.each do |el|
parse_data << {
guid: el.at("guid").text,
title: el.at("title").text,
links: el.at("link").text,
description: el.at("description").text,
pub_date: el.at("pubDate").text,
enclosure: el.at("enclosure").text,
category: el.at("category").text,
}
end
parse_data
end

def self.can_parse?(data)
doc = Nokogiri::XML(data).xpath("//rss")
doc.first.element? && doc.first.children.filter("channel").first.element?
rescue
false
end
end
17 changes: 17 additions & 0 deletions Converter/lib/parsers/parser_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class ParserType
def self.parse(data)
parsers = choise_parsers()
parsers.each do |parser|
parser_class = Module.const_get(parser)
can_parse = parser_class.can_parse?(data)
return parser_class.parse(data) if can_parse
end
end

def self.choise_parsers

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

choice или choose?

parsers = Dir["../lib/parsers/ext/*.rb"].map do |file|
File.basename(file, ".*").split("_").map { |t| t.capitalize }.join()
end
parsers
end
end
12 changes: 12 additions & 0 deletions Converter/lib/readers/reader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require 'open-uri'

module Reader
def self.read(input)
data = ''
contents = open(input)
contents.each do |line|
data += line
end
data
end
end
23 changes: 23 additions & 0 deletions Converter/main.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require 'open-uri'
require 'require_all'
require_rel 'lib'

class Main
def initialize(options)
@input = options[:input]
@output = options[:output]
end

def run
data = Reader.read(@input)
parsed_data = ParserType.parse(data)

if @output == "json"
JsonConverter.convert(parsed_data)
elsif @output == "atom"
AtomConverter.convert(parsed_data)
elsif @output == "rss"
RssConverter.convert(parsed_data)
end
end
end
Empty file.
Loading