16. Git, част 1

16. Git, част 1

16. Git, част 1

7 декември 2016

Днес

Интерполация в регулярни изрази

Между другото, регулярните изрази поддържат интерполация:

name  = /[^@]+/
host  = /\w+\.(com|net|org)/

email = /#{name}@#{host}/ # => /(?-mix:[^@]+)@(?-mix:\w+\.(com|net|org))/

Работа с MatchData-обекти

Най-полезни методи на MatchData-обектите

/(\w+)/.match('Some words')[1]              # => "Some"
/(\w+)/.match('Some words').begin(1)        # => 0
/(?<id>\d+)/.match('ID: 12345')[:id]        # => "12345"
/(?<id>\d+)/.match('ID: 12345').begin(:id)  # => 4

#pre_match и #post_match методи

на MatchData-обектите

match = /(?<number>\d+)/.match 'ID: 12345 (new)'

match[:number]    # => "12345"
match.pre_match   # => "ID: "
match.post_match  # => " (new)"

Специалните променливи

case с регулярни изрази

работи благодарение на Regexp#===

html = '<h1>Header</h1>' # или:
html = '<img src="http://my/image.src" alt="Kartman Makes Burgers" />'

case html
  when /(<h(\d)>)(.+)<\/h\2>/
    {header: $3, size: $2}
  when /<a\s+href="([^"]+)">([^<]+)<\/a>/
    {url: $1, text: $2}
  when /<img\s+src="([^"]+)"\s+alt="([^"]+)"\s*\/>/
    {image: $1, alt: $2}
  else
    'unrecognized tag'
end

# {:image=>"http://my/image.src", :alt=>"Kartman Makes Burgers"}

Методи в String

свързани с регулярни изрази

Пример със String#gsub

плюс групи и блок

'SomeTitleCase'.gsub /(^|[[:lower:]])([[:upper:]])/ do
  [$1, $2.downcase].reject(&:empty?).join('_')
end

# "some_title_case"

Encoding

Цитат от документацията:

A regexp can be matched against a string when they either share an encoding, or the regexp’s encoding is US-ASCII and the string’s encoding is ASCII-compatible.

Encoding & Unicode

Rubyのお父さんはまつもとゆきひろさんです。
unicode_test = 'Rubyのお父さんはまつもとゆきひろさんです。'

/は[[:alpha:]]+さん/.match unicode_test # #<MatchData "はまつもとゆきひろさん">

Граници на думи в Unicode-текст

Граници на думи в Unicode-текст

пример

Например:

'Ruby no otousan ha Matsumoto Yukihiro san desu.'.gsub(/(\b[[:alpha:]]+\b)/) { "[#{$1}]" }
# "[Ruby] [no] [otousan] [ha] [Matsumoto] [Yukihiro] [san] [desu]."

Но:

'Rubyのお父さんはまつもとゆきひろさんです。'.gsub(/(\b[[:alpha:]]+\b)/) { "[#{$1}]" }
# "[Rubyのお父さんはまつもとゆきひろさんです]。"

Флагове на шаблоните

Условия в шаблоните (if)

Ново в Ruby 2.0

regexp = /^(number)?\s*(?(1)\d+|[a-zA-Z]+)$/

regexp =~ "number 123"   # => 0
regexp =~ "foo"          # => 0
regexp =~ "number baz"   # => nil

Документация

Валидация на просто число с регулярен израз

Да се напише кратък Ruby expression, който проверява дали дадено число е просто или не, посредством употреба на регулярен израз. Резултатът от изпълнението му трябва да е true за прости числа и false за всички останали. Неща, които можете да ползвате:
  • Самото число, разбира се.
  • Произволни методи от класа Regexp
  • Подходящ регулярен израз (шаблон)
  • Текстовия низ '1'.
  • String#*.
  • Някакъв условен оператор (например if-else или ? … : …)
  • true, false, ...

Решение на проверката за просто число с РИ

Въпроси?

Like any...

Git

Защо отделяме време, за да говорим за Git?

Version Control System (VCS)

Не просто система, следяща промени в код!

Познавате ли този човек?

Linus Torvalds

Бащата на Linux

Създател на Git

Малко история

Linux kernel

Какво е нужно?

Централизирана VCS

Децентрализирана VCS

Защо точно git?

В началото беше git init

git init

Създава празно хранилище в текущата директория.

Виждате папката .git - съхранява всичко, което е нужно за историята.

Клониране на хранилище

git clone https://github.com/fmi/ruby-lectures.git

Работната директория (working directory)

Хранилището

Staging област

Отдалечено хранилище

Четирите области

Четирите области

4 състояния на файл

4 състояния на файл

Staging областта

добавяне на файлове

git add new_or_modified.rb
git add lectures/11
git add .

Staging областта

информация

git status

Staging областта

промени

git diff

Staging областта

изтриване на файлове

git rm old.rb

Staging областта

премахване на промени

git reset new_or_modified.rb
git reset lectures/11

Типове обекти

Commit

Конкретна версия на дърво (snapshot)

Една конкретна версия на кода.

Състои се от:

История на промените

git log
git log --stat
git log --since=2.weeks
git log --since=5.days.15.minutes
git log --until=2013-11-30
git log --grep 'Proc.new'
git log --author 'Dimitar Dimitrov'
git log lectures/01-introduction-to-ruby.slim

Commit

Да разгледаме

git show 5fae69568cd5420e13a34c06f6f495ea9bcb9a4e
git show 5fae695
git show HEAD
git show HEAD^
git show HEAD^^^
git show HEAD~3
git diff HEAD~3..HEAD

Commit

Всичко е просто файл

git cat-file -p 5fae695

Commit

git commit
git commit -m "Fix a typo on slide 3"

Commit-вайте възможно най-малките, логически свързани промени, които не чупят нищо.

Въпроси