Class: GemCollector::Repository

Inherits:
ApplicationRecord show all
Defined in:
app/models/gem_collector/repository.rb

Constant Summary collapse

POINTS_FOR_GEMS_SQL =
<<-SQL.strip_heredoc
  select
    gems.repository_id, gems.path, gems.name, gems.version
    , cume_dist() over (partition by gems.name order by #{build_version_exp('version')}) as version_point
  from
    #{GemCollector::RepositoryGem.table_name} gems
SQL

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.all_with_version_pointObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/models/gem_collector/repository.rb', line 40

def self.all_with_version_point
  # points_for_gems: gem ごとにバージョンでソートして、どれくらい上位にいるか
  # points_for_repos: そのリポジトリが依存している gem について、↑の平均値
  # 大きければ大きいほど最新の gem を使っていることになりそう
  find_by_sql(<<-SQL.strip_heredoc)
  select
    repos.*, points_for_repos.path, points_for_repos.point
  from (
    select
      repository_id, path, avg(version_point) as point
    from (#{POINTS_FOR_GEMS_SQL}) points_for_gems
    group by repository_id, path
  ) points_for_repos
    inner join #{table_name} repos on repos.id = points_for_repos.repository_id
  order by
    point desc
  SQL
end

.find_by_dependent_gem(gem_name, from_version: nil, to_version: nil) ⇒ Object

Parameters:

  • gem_name (String)
  • from_version (String) (defaults to: nil)

    Version string in Ruby gem manner.

  • to_version (String) (defaults to: nil)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/models/gem_collector/repository.rb', line 62

def self.find_by_dependent_gem(gem_name, from_version: nil, to_version: nil)
  from_version = '0.0.0' if from_version.blank?
  find_by_sql([<<-SQL.strip_heredoc, gem_name: gem_name, from_version: from_version, to_version: to_version])
  select
      repos.id
    , site
    , full_name
    , gems.version as gem_version
    , gems.path as gem_path
  from
    #{table_name} repos
    inner join #{GemCollector::RepositoryGem.table_name} gems on gems.repository_id = repos.id
  where gems.name = :gem_name
    and #{build_version_exp('version')} >= #{build_version_exp(':from_version')}
  #{to_version.blank? ? '' : "and #{build_version_exp('version')} < #{build_version_exp(':to_version')}"}
  order by
      #{build_version_exp('version')} desc
    , site
    , full_name
    , gems.path
  SQL
end

Instance Method Details

#canonical_nameObject



13
14
15
# File 'app/models/gem_collector/repository.rb', line 13

def canonical_name
  "#{site}/#{full_name}"
end

#gems_with_version_pointObject



29
30
31
32
33
34
35
36
37
38
# File 'app/models/gem_collector/repository.rb', line 29

def gems_with_version_point
  GemCollector::RepositoryGem.find_by_sql([<<-SQL.strip_heredoc, repository_id: id])
  select *
  from (#{POINTS_FOR_GEMS_SQL}) points_for_gems
  where
    repository_id = :repository_id
  order by
    path, name
  SQL
end

#url(path = nil) ⇒ Object



4
5
6
7
8
9
10
11
# File 'app/models/gem_collector/repository.rb', line 4

def url(path = nil)
  u = "https://#{site}/#{full_name}"
  if path
    "#{u}/blob/master/#{path}"
  else
    u
  end
end