From 7fce3d67e8fb4932c8da9084a79718f1688421a5 Mon Sep 17 00:00:00 2001
From: Adrien Waksberg
Date: Sun, 5 Aug 2018 12:37:35 +0200
Subject: [PATCH] feat: add branches
---
app/models/branch.rb | 6 +++++
app/models/software.rb | 2 +-
app/models/version.rb | 4 +--
app/views/softwares/show.html.erb | 5 +++-
db/migrate/20180804072602_create_branches.rb | 10 +++++++
...80805081706_change_reference_to_version.rb | 8 ++++++
db/schema.rb | 15 ++++++++---
lib/tasks/repositories.rake | 26 +++++++++++++++----
test/fixtures/branches.yml | 9 +++++++
test/fixtures/versions.yml | 4 +--
test/models/branch_test.rb | 7 +++++
11 files changed, 82 insertions(+), 14 deletions(-)
create mode 100644 app/models/branch.rb
create mode 100644 db/migrate/20180804072602_create_branches.rb
create mode 100644 db/migrate/20180805081706_change_reference_to_version.rb
create mode 100644 test/fixtures/branches.yml
create mode 100644 test/models/branch_test.rb
diff --git a/app/models/branch.rb b/app/models/branch.rb
new file mode 100644
index 0000000..adfcb43
--- /dev/null
+++ b/app/models/branch.rb
@@ -0,0 +1,6 @@
+class Branch < ApplicationRecord
+ belongs_to :software
+ has_many :versions
+ validates :name, presence: true
+ validates :name, uniqueness: { scope: :software }
+end
diff --git a/app/models/software.rb b/app/models/software.rb
index 9b7cc26..3b75797 100644
--- a/app/models/software.rb
+++ b/app/models/software.rb
@@ -1,4 +1,4 @@
class Software < ApplicationRecord
- has_many :versions
+ has_many :branches
validates :name, presence: true, uniqueness: true
end
diff --git a/app/models/version.rb b/app/models/version.rb
index f9b86db..430f761 100644
--- a/app/models/version.rb
+++ b/app/models/version.rb
@@ -1,6 +1,6 @@
class Version < ApplicationRecord
- belongs_to :software
+ belongs_to :branch
validates :number, presence: true
validates :date, presence: true
- validates :number, uniqueness: { scope: :software }
+ validates :number, uniqueness: { scope: :branch }
end
diff --git a/app/views/softwares/show.html.erb b/app/views/softwares/show.html.erb
index 086626c..badad6d 100644
--- a/app/views/softwares/show.html.erb
+++ b/app/views/softwares/show.html.erb
@@ -5,6 +5,8 @@
<%= link_to 'Delete', software_path(@software), method: :delete, class: 'uk-icon-link', data: { confirm: 'Are you sure?' } %>
<%= @software.name %>
+<% @software.branches.order(name: :desc).each do |branch| %>
+<%= branch.name %>
@@ -12,10 +14,11 @@
Date |
-<% @software.versions.order(date: :desc).each do |version| %>
+<% branch.versions.order(date: :desc).each do |version| %>
<%= version.number %> |
<%= version.date.strftime('%Y-%m-%d') %> |
<% end %>
+<% end %>
diff --git a/db/migrate/20180804072602_create_branches.rb b/db/migrate/20180804072602_create_branches.rb
new file mode 100644
index 0000000..b4b292a
--- /dev/null
+++ b/db/migrate/20180804072602_create_branches.rb
@@ -0,0 +1,10 @@
+class CreateBranches < ActiveRecord::Migration[5.2]
+ def change
+ create_table :branches do |t|
+ t.string :name, null: false
+ t.references :software, foreign_key: true
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20180805081706_change_reference_to_version.rb b/db/migrate/20180805081706_change_reference_to_version.rb
new file mode 100644
index 0000000..1cd8a30
--- /dev/null
+++ b/db/migrate/20180805081706_change_reference_to_version.rb
@@ -0,0 +1,8 @@
+class ChangeReferenceToVersion < ActiveRecord::Migration[5.2]
+ def change
+ remove_reference :versions, :software, index: true, foreign_key: true
+ change_table :versions do |t|
+ t.references :branch, foreign_key: true
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 16c8fe4..3437d27 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,15 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2018_07_29_191829) do
+ActiveRecord::Schema.define(version: 2018_08_05_081706) do
+
+ create_table "branches", force: :cascade do |t|
+ t.string "name", null: false
+ t.integer "software_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["software_id"], name: "index_branches_on_software_id"
+ end
create_table "github_repositories", force: :cascade do |t|
t.string "name", null: false
@@ -26,15 +34,16 @@ ActiveRecord::Schema.define(version: 2018_07_29_191829) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "repository_type"
+ t.string "branch_pattern"
end
create_table "versions", force: :cascade do |t|
t.string "number", null: false
t.datetime "date", null: false
- t.integer "software_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.index ["software_id"], name: "index_versions_on_software_id"
+ t.integer "branch_id"
+ t.index ["branch_id"], name: "index_versions_on_branch_id"
end
end
diff --git a/lib/tasks/repositories.rake b/lib/tasks/repositories.rake
index 47e3c44..c34d336 100644
--- a/lib/tasks/repositories.rake
+++ b/lib/tasks/repositories.rake
@@ -14,6 +14,20 @@ namespace :repositories do
end.body
end
+ def branch(software_id, branches, version)
+ name = version.match(/^v?(?\d+\.\d+)(\.\d+)?$/)[:branch]
+
+ return branches[name] if branches.include?(name)
+
+ branch = Branch.new(
+ name: name,
+ software_id: software_id
+ )
+ branch.save
+ branches[name] = branch.id
+ branch.id
+ end
+
desc 'Update version from github repositories'
task github: :environment do
headers = {
@@ -24,7 +38,8 @@ namespace :repositories do
GithubRepository.all.each do |repo|
begin
software = Software.find(repo.software_id)
- versions = software.versions.all.map(&:number)
+ branches = software.branches.all.map { |b| [b.name, b.id] }.to_h
+ versions = software.branches.all.map { |b| b.versions.all.map(&:number) }
tags =
JSON.parse(
get_url_content(
@@ -36,19 +51,20 @@ namespace :repositories do
tags.each do |tag|
next if versions.include?(tag['name'])
+ branch_id = branch(software.id, branches, tag['name'])
date =
JSON.parse(
get_url_content(tag['commit']['url'], headers)
- )['committer']['date']
+ )['commit']['committer']['date']
- Version.new(
- software_id: software.id,
+ puts Version.new(
+ branch_id: branch_id,
number: tag['name'],
date: date
).save
end
rescue => e
- puts e
+ puts e.strace
next
end
end
diff --git a/test/fixtures/branches.yml b/test/fixtures/branches.yml
new file mode 100644
index 0000000..2b98ff0
--- /dev/null
+++ b/test/fixtures/branches.yml
@@ -0,0 +1,9 @@
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ name: 1.0
+ software: two
+
+two:
+ name: 1.1
+ software: two
diff --git a/test/fixtures/versions.yml b/test/fixtures/versions.yml
index 597d85b..b85e83d 100644
--- a/test/fixtures/versions.yml
+++ b/test/fixtures/versions.yml
@@ -3,9 +3,9 @@
one:
number: 1.0.0
date: 2018-07-22 20:30:46
- software: two
+ branch: one
two:
number: 1.1.0
date: 2018-12-22 20:30:46
- software: two
+ branch: two
diff --git a/test/models/branch_test.rb b/test/models/branch_test.rb
new file mode 100644
index 0000000..629eb34
--- /dev/null
+++ b/test/models/branch_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class BranchTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end