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
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,23 @@
# Оглавление курса "Разработка на Ruby on Rails"

### Урок 1: Работа с командной строкой.
<<<<<<< HEAD
1. Командная строка Linux.
1. Справка по командам Linux.
1. Общие команды для работы с файлами и папками.
1. Домашняя директория пользователя.
1. Работа с текстовыми файлами в командной строке.
1. Права доступа на файлы и папки.
### Урок 2: IDE разработчика. Git.
=======
1. Командная строка Linux
1. Справка по командам Linux
1. Общие команды для работы с файлами и папками
1. Домашняя директория пользователя
1. Работа с текстовыми файлами в командной строке
1. Права доступа на файлы и папки
### Урок 2: IDE разработчика. Git. -my
>>>>>>> 7cce78481a5e178ab841910925ed3c77bf092c6e
1. Слепой метод печати.
1. IDE разработчика: RubyMine, Vim и другие.
1. Git. Git Flow.
Expand Down
11 changes: 11 additions & 0 deletions lesson04/homework/convertor/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM ruby:2.7.0

RUN gem install nokogiri -- --use-system-libraries

RUN mkdir -p /convertor
WORKDIR /convertor

COPY Gemfile Gemfile.lock ./
RUN bundle install --jobs 3

COPY . /convertor
8 changes: 8 additions & 0 deletions lesson04/homework/convertor/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

ruby '2.7.0'

gem 'rubocop', '~> 0.80.1', require: false
gem 'nokogiri'
gem 'require_all'
38 changes: 38 additions & 0 deletions lesson04/homework/convertor/Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
GEM
remote: https://rubygems.org/
specs:
ast (2.4.0)
jaro_winkler (1.5.4)
mini_portile2 (2.4.0)
nokogiri (1.10.9)
mini_portile2 (~> 2.4.0)
parallel (1.19.1)
parser (2.7.0.4)
ast (~> 2.4.0)
rainbow (3.0.0)
require_all (3.0.0)
rexml (3.2.4)
rubocop (0.80.1)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.7.0.1)
rainbow (>= 2.2.2, < 4.0)
rexml
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 1.7)
ruby-progressbar (1.10.1)
unicode-display_width (1.6.1)

PLATFORMS
ruby

DEPENDENCIES
nokogiri
require_all
rubocop (~> 0.80.1)

RUBY VERSION
ruby 2.7.0p0

BUNDLED WITH
2.1.4
15 changes: 15 additions & 0 deletions lesson04/homework/convertor/bin/converter
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/local/bin/ruby
require 'bundler/setup'
Bundler.require
require 'optparse'
require_rel '../main.rb'

options = {}
OptionParser.new do |opts|
opts.on("--output STRING", String)
opts.on("--input STRING", String)
opts.on("--sort STRING", String)
end.parse!(into: options)

main_program = Main.new(options)
main_program.run
20 changes: 20 additions & 0 deletions lesson04/homework/convertor/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: '3.7'

services:
web:
build: .
volumes:
- .:/convertor:cached
- ~/.bash_history:/root/.bash_history
- bundle_cache:/bundle_cache
environment:
- BUNDLE_PATH=/bundle_cache
- GEM_HOME=/bundle_cache
- GEM_PATH=/bundle_cache
bundle_cache:
image: busybox
volumes:
- bundle_cache:/bundle_cache

volumes:
bundle_cache:
1,803 changes: 1,803 additions & 0 deletions lesson04/homework/convertor/files/file.atom

Large diffs are not rendered by default.

1,402 changes: 1,402 additions & 0 deletions lesson04/homework/convertor/files/file.json

Large diffs are not rendered by default.

1,805 changes: 1,805 additions & 0 deletions lesson04/homework/convertor/files/file.rss

Large diffs are not rendered by default.

1,402 changes: 1,402 additions & 0 deletions lesson04/homework/convertor/json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions lesson04/homework/convertor/lib/convertors/converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Converter
def self.convert(inputData, output)
nameModule = output.capitalize + 'Converter';
Module.const_get(nameModule).convert inputData
end
end
19 changes: 19 additions & 0 deletions lesson04/homework/convertor/lib/convertors/ext/atom_converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module AtomConverter

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.

Видимо, код через rubocop не прогонялся..

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.

Или он реально пустую строчку вставляет?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Не прогонялся через рубокоп, в данной реализации было важно сам функционал) учту при дальнейшей разработке.

def self.convert(inputData)
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.feed('xml:lang' => 'ru') {
inputData.each do |item|
xml.entry {
xml.guid item[:guid]
xml.title item[:title]
xml.description item[:description]
xml.pubDate item[:pubDate]
xml.category item[:category]
}
end
}
end
builder.to_xml
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module JsonConverter

def self.convert(data)
result = JSON.pretty_generate(data)
result
end
end
21 changes: 21 additions & 0 deletions lesson04/homework/convertor/lib/convertors/ext/rss_converter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module RssConverter

def self.convert(inputData)
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.rss(version: "2.0") {
xml.channel {
inputData.each do |item|
xml.item {
xml.guid item[:guid]
xml.title item[:title]
xml.description item[:description]
xml.pubDate item[:pubDate]
xml.category item[:category]
}
end
}
}
end
builder.to_xml
end
end
8 changes: 8 additions & 0 deletions lesson04/homework/convertor/lib/name_files.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module NameFiles
def self.find(path)
files = Dir[path]
files.map!{ |file| file.split('/').last.split('.').first }
files.map!{|name| name.split('_').map(&:capitalize).join('')}
files
end
end
24 changes: 24 additions & 0 deletions lesson04/homework/convertor/lib/parsers/ext/atom_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module AtomParser

def self.parse(inputData)
data = []
xml_doc = Nokogiri::XML(inputData)
xml_doc.remove_namespaces!
doc = xml_doc.xpath("//entry")
doc.each do |item|
obj = {
guid: item.at('id').text,
title: item.at('title').text,
description: item.at('summary').text,
pubDate: item.at('published').text,
category: item.at('category').text,
}
data << obj
end
data
end

def self.can?(data)

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.

Не понятно, что can? Надо бы по-яснее метод описывать.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

С названиями у меня всегда проблема))

Nokogiri::XML(data).errors.empty? && data.include?('</feed>')
end
end
23 changes: 23 additions & 0 deletions lesson04/homework/convertor/lib/parsers/ext/json_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module JsonParser

def self.parse(inputData)
data = [];
JSON.parse(inputData).each do |item|
data << {
guid: item['guid'],
title: item['title'],
description: item['description'],
pubDate: item['pubDate'],
category: item['category']
}
end
data
end

def self.can?(data)
JSON.parse(data)
return true
rescue JSON::ParserError => e
return false
end
end
23 changes: 23 additions & 0 deletions lesson04/homework/convertor/lib/parsers/ext/rss_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module RssParser

def self.parse(data)
xml_doc = Nokogiri::XML(data)
data = [];
doc = xml_doc.xpath("//item")
doc.each do |item|
obj = {
guid: item.at('guid').text,
title: item.at('title').text,
description: item.at('description').text,
pubDate: item.at('pubDate').text,
category: item.at('category').text,
}
data << obj
end
data
end

def self.can?(data)
Nokogiri::XML(data).errors.empty? && !data.include?('</feed>')
end
end
13 changes: 13 additions & 0 deletions lesson04/homework/convertor/lib/parsers/parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Parser

def self.parse(inputData)
filesNamed = NameFiles.find('lib/parsers/ext/*.rb')
data = []
filesNamed.each do |nameModule|
if (Module.const_get(nameModule).can? (inputData))
data = Module.const_get(nameModule).parse inputData
end
end
data
end
end
13 changes: 13 additions & 0 deletions lesson04/homework/convertor/lib/readers/ext/file_reader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module FileReader
def self.read(input)
data = ''
open(input) { |f|
f.each_line {|line| data += line}
}
data
end

def self.can?(input)
File.file? input
end
end
18 changes: 18 additions & 0 deletions lesson04/homework/convertor/lib/readers/ext/link_reader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module LinkReader
def self.read(input)
data = ''
OpenURI.open_uri(input) { |f|
f.each_line {|line| data += line}
}
data
end

def self.can?(input)
uri = URI.parse(input)
%w( http https ).include?(uri.scheme)
rescue URI::BadURIError

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.

rescue URI::BadURIError, URI::InvalidURIError
попробуй так сделать

false
rescue URI::InvalidURIError
false
end
end
13 changes: 13 additions & 0 deletions lesson04/homework/convertor/lib/readers/reader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Reader
def self.read(input)
files = NameFiles.find('lib/readers/ext/*.rb')

data = ''
files.each do |nameModule|
if (Module.const_get(nameModule).can? (input))
data = Module.const_get(nameModule).read input
end
end
data
end
end
6 changes: 6 additions & 0 deletions lesson04/homework/convertor/lib/sorters/asc_sorter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module AscSorter

def self.sort(data)
result = data.sort_by {|x| x[:pubDate] }
end
end
9 changes: 9 additions & 0 deletions lesson04/homework/convertor/lib/write_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module WriteFile

def self.write(data, output)
path = 'files/file.' + output
File.open(path, 'w') do |file|
file.puts data
end
end
end
26 changes: 26 additions & 0 deletions lesson04/homework/convertor/main.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require 'bundler/setup'
Bundler.require
require 'nokogiri'
require 'open-uri'
require 'rubocop'
require 'json'
require 'require_all'
require 'uri'
require_all 'lib'

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

def run
data = Reader.read(@input)
parsed_data = Parser.parse(data)
sorted_data = @sort == 'desc' ? DescSorter.sort(parsed_data) : AscSorter.sort(parsed_data)
converted_data = Converter.convert(sorted_data, @output)
WriteFile.write(converted_data, @output)
end

end
Loading