active_brainz 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/LICENSE.md +21 -0
  4. data/README.md +83 -0
  5. data/config/inflections.rb +9 -0
  6. data/lib/active_brainz.rb +36 -0
  7. data/lib/active_brainz/models/area/area.rb +123 -0
  8. data/lib/active_brainz/models/area/area_type.rb +37 -0
  9. data/lib/active_brainz/models/artist/artist.rb +150 -0
  10. data/lib/active_brainz/models/artist/artist_alias.rb +62 -0
  11. data/lib/active_brainz/models/artist/artist_alias_type.rb +37 -0
  12. data/lib/active_brainz/models/artist/artist_credit.rb +60 -0
  13. data/lib/active_brainz/models/artist/artist_credit_name.rb +46 -0
  14. data/lib/active_brainz/models/artist/artist_type.rb +37 -0
  15. data/lib/active_brainz/models/base.rb +16 -0
  16. data/lib/active_brainz/models/concerns/has_begin_end_date.rb +27 -0
  17. data/lib/active_brainz/models/concerns/has_gid.rb +15 -0
  18. data/lib/active_brainz/models/concerns/has_parent_children.rb +20 -0
  19. data/lib/active_brainz/models/gender/gender.rb +41 -0
  20. data/lib/active_brainz/models/genre/genre.rb +36 -0
  21. data/lib/active_brainz/models/genre/genre_alias.rb +42 -0
  22. data/lib/active_brainz/models/label/label.rb +121 -0
  23. data/lib/active_brainz/models/label/label_alias.rb +62 -0
  24. data/lib/active_brainz/models/label/label_alias_type.rb +37 -0
  25. data/lib/active_brainz/models/label/label_type.rb +37 -0
  26. data/lib/active_brainz/models/medium/medium.rb +68 -0
  27. data/lib/active_brainz/models/place/place.rb +97 -0
  28. data/lib/active_brainz/models/place/place_alias.rb +62 -0
  29. data/lib/active_brainz/models/place/place_alias_type.rb +37 -0
  30. data/lib/active_brainz/models/place/place_type.rb +37 -0
  31. data/lib/active_brainz/models/recording/recording.rb +101 -0
  32. data/lib/active_brainz/models/release/release.rb +150 -0
  33. data/lib/active_brainz/models/release/release_group.rb +100 -0
  34. data/lib/active_brainz/models/track/track.rb +72 -0
  35. data/lib/active_brainz/version.rb +24 -0
  36. metadata +372 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: de315d1362f515a08a4b332ca37cb680c1f7cc0b56631d267ca6d01dba86f064
4
+ data.tar.gz: 1b10dab84039dc27fc85e3180f1d31c280ff961bca4055600bbafa67cc929cde
5
+ SHA512:
6
+ metadata.gz: b81268c56a7c2ffa2f527c6c66d7bf766c7d1d39058df455d7116b667788bc40e244b9cef702564abbc627090b667c78f4f40d3288fbc22f5c9069b03b728174
7
+ data.tar.gz: 59378fea9c9b97441c95cdddd8d55e724cb011ec4b39de09801de7207eeadb22aa5de94c818e658a82c9dc3502de8d8da96e49a3bceb95b180e890fad15a06fc
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in active_brainz.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 12.0"
9
+ gem "rspec", "~> 3.0"
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Florian Dejonckheere
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # ActiveBrainz
2
+
3
+ ![Continuous Integration](https://github.com/floriandejonckheere/active_brainz/workflows/Continuous%20Integration/badge.svg)
4
+ ![Release](https://img.shields.io/github/v/release/floriandejonckheere/active_brainz?label=Latest%20release)
5
+
6
+ ActiveRecord integrations for the [MusicBrainz database](https://musicbrainz.org/doc/MusicBrainz_Database).
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem "active_brainz"
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle install
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install active_brainz
23
+
24
+ ## Configuration
25
+
26
+ Configure your `database.yml` with the MusicBrainz database:
27
+
28
+ ```yaml
29
+ musicbrainz:
30
+ adapter: postgresql
31
+ host: postgres
32
+ port: 5432
33
+ database: musicbrainz
34
+ user: musicbrainz
35
+ password: musicbrainz
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ TODO: Write usage instructions here
41
+
42
+ ## Documentation
43
+
44
+ The SQL scripts used to create the MusicBrainz database schema can be found on their [Github repository](https://github.com/metabrainz/musicbrainz-server/tree/master/admin/sql).
45
+
46
+ ## Development
47
+
48
+ After checking out the repo, run `bin/setup` to install dependencies.
49
+ Then, run `rake spec` to run the tests.
50
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
51
+ Modify `config/database.rb` or use environment variables to connect to a non-localhost server.
52
+
53
+ The following rake tasks are available:
54
+
55
+ ```
56
+ rake active_brainz:models:annotate # Annotate models
57
+ rake active_brainz:models:generate # Generates models based on db/schema.rb file
58
+ rake active_brainz:models:render # Generate and annotate models
59
+ rake db:create # Creates the database
60
+ rake db:drop # Drops the database
61
+ rake db:schema:dump # Dumps the database structure to db/schema.rb
62
+ rake db:schema:load # Recreates the databases from the schema.rb file
63
+ rake spec # Run RSpec code examples
64
+
65
+ ```
66
+
67
+ To release a new version, update the version number in `lib/active_brainz/version.rb`, commit it and create a git tag starting with `v`, and push it to the repository.
68
+ Github Actions will automatically run the test suite, build the `.gem` file and push it to [rubygems.org](https://rubygems.org).
69
+
70
+ If MusicBrainz' database schema version gets bumped, don't forget to bump the schema version in `lib/active_brainz/version.rb` as well.
71
+
72
+ ## Contributing
73
+
74
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/floriandejonckheere/active_brainz](https://github.com/floriandejonckheere/active_brainz).
75
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/floriandejonckheere/active_brainz/blob/master/CODE_OF_CONDUCT.md).
76
+
77
+ ## License
78
+
79
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
80
+
81
+ ## Code of Conduct
82
+
83
+ Everyone interacting in the ActiveBrainz project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/floriandejonckheere/active_brainz/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveBrainz.loader.inflector = ActiveSupport::Inflector
4
+
5
+ ActiveSupport::Inflector.inflections do |inflect|
6
+ inflect.acronym "GID"
7
+ inflect.acronym "IPI"
8
+ inflect.acronym "ISNI"
9
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require "byebug" if ENV["ACTIVE_BRAINZ_ENV"] == "development"
5
+ require "active_support/all"
6
+
7
+ module ActiveBrainz
8
+ class << self
9
+ # Code loader instance
10
+ attr_reader :loader
11
+
12
+ def root
13
+ @root ||= Pathname.new(File.expand_path(File.join("..", ".."), __FILE__))
14
+ end
15
+
16
+ def setup
17
+ @loader = Zeitwerk::Loader.for_gem
18
+
19
+ # Register inflections
20
+ require root.join("config/inflections.rb")
21
+
22
+ # Set up code loader
23
+ loader.enable_reloading if ENV["ACTIVE_BRAINZ_ENV"] == "development"
24
+ loader.collapse("lib/active_brainz/models")
25
+ loader.collapse("lib/active_brainz/models/*")
26
+
27
+ loader.setup
28
+ loader.eager_load
29
+
30
+ # Load initializers
31
+ Dir[root.join("config/initializers/*.rb")].sort.each { |f| require f }
32
+ end
33
+ end
34
+ end
35
+
36
+ ActiveBrainz.setup
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveBrainz
4
+ class Area < Base
5
+ self.table_name = "area"
6
+
7
+ include HasGID
8
+ include HasBeginEndDate
9
+
10
+ belongs_to :area_type,
11
+ class_name: "AreaType",
12
+ foreign_key: "type",
13
+ optional: true
14
+
15
+ # has_many :area_aliases,
16
+ # class_name: "AreaAlias",
17
+ # foreign_key: "area"
18
+
19
+ # has_many :area_annotations,
20
+ # class_name: "AreaAnnotation",
21
+ # foreign_key: "area"
22
+
23
+ # has_many :area_attributes,
24
+ # class_name: "AreaAttribute",
25
+ # foreign_key: "area"
26
+
27
+ # has_many :area_tag_raws,
28
+ # class_name: "AreaTagRaw",
29
+ # foreign_key: "area"
30
+
31
+ # has_many :area_tags,
32
+ # class_name: "AreaTag",
33
+ # foreign_key: "area"
34
+
35
+ has_many :area_artists,
36
+ class_name: "Artist",
37
+ foreign_key: "area"
38
+
39
+ has_many :begin_area_artists,
40
+ class_name: "Artist",
41
+ foreign_key: "begin_area"
42
+
43
+ has_many :end_area_artists,
44
+ class_name: "Artist",
45
+ foreign_key: "end_area"
46
+
47
+ # has_many :area_country_areas,
48
+ # class_name: "CountryArea",
49
+ # foreign_key: "area"
50
+
51
+ # has_many :area_edit_areas,
52
+ # class_name: "EditArea",
53
+ # foreign_key: "area"
54
+
55
+ # has_many :area_editor_collection_areas,
56
+ # class_name: "EditorCollectionArea",
57
+ # foreign_key: "area"
58
+
59
+ # has_many :area_editors,
60
+ # class_name: "Editor",
61
+ # foreign_key: "area"
62
+
63
+ # has_many :area_iso_3166_1s,
64
+ # class_name: "Iso31661",
65
+ # foreign_key: "area"
66
+
67
+ # has_many :area_iso_3166_2s,
68
+ # class_name: "Iso31662",
69
+ # foreign_key: "area"
70
+
71
+ # has_many :area_iso_3166_3s,
72
+ # class_name: "Iso31663",
73
+ # foreign_key: "area"
74
+
75
+ has_many :area_labels,
76
+ class_name: "Label",
77
+ foreign_key: "area"
78
+
79
+ # has_many :area_new_ids,
80
+ # class_name: "AreaGIDRedirect",
81
+ # foreign_key: "new_id"
82
+
83
+ # has_many :area_places,
84
+ # class_name: "Place",
85
+ # foreign_key: "area"
86
+
87
+ attribute :name
88
+ attribute :comment
89
+
90
+ attribute :edits_pending, :integer
91
+ attribute :last_updated, :datetime
92
+ end
93
+ end
94
+
95
+ # == Schema Information
96
+ #
97
+ # Table name: area
98
+ #
99
+ # id :integer not null, primary key
100
+ # begin_date_day :integer
101
+ # begin_date_month :integer
102
+ # begin_date_year :integer
103
+ # comment :string(255) default(""), not null
104
+ # edits_pending :integer default(0), not null
105
+ # end_date_day :integer
106
+ # end_date_month :integer
107
+ # end_date_year :integer
108
+ # ended :boolean default(FALSE), not null
109
+ # gid :uuid not null
110
+ # last_updated :datetime
111
+ # name :string not null
112
+ # type :integer
113
+ #
114
+ # Indexes
115
+ #
116
+ # area_idx_gid (gid) UNIQUE
117
+ # area_idx_name (name)
118
+ # area_idx_name_txt (mb_simple_tsvector((name)::text)) USING gin
119
+ #
120
+ # Foreign Keys
121
+ #
122
+ # area_fk_type (type => area_type.id)
123
+ #
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveBrainz
4
+ class AreaType < Base
5
+ self.table_name = "area_type"
6
+
7
+ include HasGID
8
+ include HasParentChildren
9
+
10
+ has_many :areas,
11
+ class_name: "Area",
12
+ foreign_key: "type"
13
+
14
+ attribute :name
15
+ attribute :description
16
+ end
17
+ end
18
+
19
+ # == Schema Information
20
+ #
21
+ # Table name: area_type
22
+ #
23
+ # id :integer not null, primary key
24
+ # child_order :integer default(0), not null
25
+ # description :text
26
+ # gid :uuid not null
27
+ # name :string(255) not null
28
+ # parent :integer
29
+ #
30
+ # Indexes
31
+ #
32
+ # area_type_idx_gid (gid) UNIQUE
33
+ #
34
+ # Foreign Keys
35
+ #
36
+ # area_type_fk_parent (parent => area_type.id)
37
+ #
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveBrainz
4
+ class Artist < Base
5
+ self.table_name = "artist"
6
+
7
+ include HasGID
8
+ include HasBeginEndDate
9
+
10
+ belongs_to :artist_area,
11
+ class_name: "Area",
12
+ foreign_key: "area",
13
+ optional: true
14
+
15
+ belongs_to :artist_type,
16
+ class_name: "ArtistType",
17
+ foreign_key: "type",
18
+ optional: true
19
+
20
+ belongs_to :artist_begin_area,
21
+ class_name: "Area",
22
+ foreign_key: "begin_area",
23
+ optional: true
24
+
25
+ belongs_to :artist_end_area,
26
+ class_name: "Area",
27
+ foreign_key: "end_area",
28
+ optional: true
29
+
30
+ belongs_to :artist_gender,
31
+ class_name: "Gender",
32
+ foreign_key: "gender",
33
+ optional: true
34
+
35
+ has_many :artist_aliases,
36
+ class_name: "ArtistAlias",
37
+ foreign_key: "artist"
38
+
39
+ # has_many :artist_annotations,
40
+ # class_name: "ArtistAnnotation",
41
+ # foreign_key: "artist"
42
+
43
+ # has_many :artist_attributes,
44
+ # class_name: "ArtistAttribute",
45
+ # foreign_key: "artist"
46
+
47
+ has_many :artist_credit_names,
48
+ class_name: "ArtistCreditName",
49
+ foreign_key: "artist"
50
+
51
+ # has_many :artist_ipis,
52
+ # class_name: "ArtistIPI",
53
+ # foreign_key: "artist"
54
+
55
+ # has_many :artist_isnis,
56
+ # class_name: "ArtistISNI",
57
+ # foreign_key: "artist"
58
+
59
+ # has_many :artist_meta,
60
+ # class_name: "ArtistMeta",
61
+ # foreign_key: "id"
62
+
63
+ # has_many :artist_rating_raws,
64
+ # class_name: "ArtistRatingRaw",
65
+ # foreign_key: "artist"
66
+
67
+ # has_many :artist_tag_raws,
68
+ # class_name: "ArtistTagRaw",
69
+ # foreign_key: "artist"
70
+
71
+ # has_many :artist_tags,
72
+ # class_name: "ArtistTag",
73
+ # foreign_key: "artist"
74
+
75
+ # has_many :artist_edit_artists,
76
+ # class_name: "EditArtist",
77
+ # foreign_key: "artist"
78
+
79
+ # has_many :artist_editor_collection_artists,
80
+ # class_name: "EditorCollectionArtist",
81
+ # foreign_key: "artist"
82
+
83
+ # has_many :artist_editor_subscribe_artists,
84
+ # class_name: "EditorSubscribeArtist",
85
+ # foreign_key: "artist"
86
+
87
+ # has_many :artist_editor_watch_artists,
88
+ # class_name: "EditorWatchArtist",
89
+ # foreign_key: "artist"
90
+
91
+ # has_many :artist_new_ids,
92
+ # class_name: "ArtistGIDRedirect",
93
+ # foreign_key: "new_id"
94
+
95
+ attribute :name
96
+ attribute :sort_name
97
+
98
+ attribute :comment
99
+ attribute :edits_pending, :integer
100
+ attribute :last_updated, :datetime
101
+ end
102
+ end
103
+
104
+ # == Schema Information
105
+ #
106
+ # Table name: artist
107
+ #
108
+ # id :integer not null, primary key
109
+ # area :integer
110
+ # begin_area :integer
111
+ # begin_date_day :integer
112
+ # begin_date_month :integer
113
+ # begin_date_year :integer
114
+ # comment :string(255) default(""), not null
115
+ # edits_pending :integer default(0), not null
116
+ # end_area :integer
117
+ # end_date_day :integer
118
+ # end_date_month :integer
119
+ # end_date_year :integer
120
+ # ended :boolean default(FALSE), not null
121
+ # gender :integer
122
+ # gid :uuid not null
123
+ # last_updated :datetime
124
+ # name :string not null
125
+ # sort_name :string not null
126
+ # type :integer
127
+ #
128
+ # Indexes
129
+ #
130
+ # artist_idx_area (area)
131
+ # artist_idx_begin_area (begin_area)
132
+ # artist_idx_end_area (end_area)
133
+ # artist_idx_gid (gid) UNIQUE
134
+ # artist_idx_lower_name (lower((name)::text))
135
+ # artist_idx_musicbrainz_collate (name)
136
+ # artist_idx_name (name)
137
+ # artist_idx_null_comment (name) UNIQUE WHERE (comment IS NULL)
138
+ # artist_idx_sort_name (sort_name)
139
+ # artist_idx_txt (mb_simple_tsvector((name)::text)) USING gin
140
+ # artist_idx_txt_sort (mb_simple_tsvector((sort_name)::text)) USING gin
141
+ # artist_idx_uniq_name_comment (name,comment) UNIQUE WHERE (comment IS NOT NULL)
142
+ #
143
+ # Foreign Keys
144
+ #
145
+ # artist_fk_area (area => area.id)
146
+ # artist_fk_begin_area (begin_area => area.id)
147
+ # artist_fk_end_area (end_area => area.id)
148
+ # artist_fk_gender (gender => gender.id)
149
+ # artist_fk_type (type => artist_type.id)
150
+ #