minimodel 1.0.0 → 2.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ead30d3e5905fd4a9cefbcc8acefafea60f88ac3
4
+ data.tar.gz: a91bd67fc303c5fa57b4f43865a5fd788bd5bcf8
5
+ SHA512:
6
+ metadata.gz: 0cf78af9171a8a066e3e1fe244b306c9dfb33803a34b5efff3076a8f87d5441b6166141ac621a9ca623320c43d6675d71ffb270c9d991f642b64da68d3516c9b
7
+ data.tar.gz: 57328487523f9ab365bc11ce754e6066d8508ac64c18621573f7dc381aab4e317f9258d18da40167e82a8ff71d4f3ddfba2ef0d99a790e9d2ff241f704bc6a63
@@ -0,0 +1,9 @@
1
+ Copyright (c) TIMCRAFT <http://timcraft.com>
2
+
3
+ This is an Open Source project licensed under the terms of the LGPLv3 license.
4
+ Please see <http://www.gnu.org/licenses/lgpl-3.0.html> for license text.
5
+
6
+ This code is distributed in the hope that it will be useful,
7
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
+ GNU Lesser General Public License for more details.
data/README.md CHANGED
@@ -1,15 +1,17 @@
1
- A little library for defining little models
2
- ===========================================
1
+ # minimodel
3
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/minimodel.svg)](https://badge.fury.io/rb/minimodel) [![Build Status](https://api.travis-ci.org/timcraft/minimodel.svg?branch=master)](https://travis-ci.org/timcraft/minimodel)
4
4
 
5
- Installation
6
- ------------
5
+
6
+ A little Ruby library for defining little models.
7
+
8
+
9
+ ## Installation
7
10
 
8
11
  $ gem install minimodel
9
12
 
10
13
 
11
- Motivation
12
- ----------
14
+ ## Motivation
13
15
 
14
16
  Many apps use small "read only" datasets that can easily be held in memory,
15
17
  for example: currency data, country data, colour data, advertising banners,
@@ -17,8 +19,7 @@ options for select boxes, payment plans etc. Sometimes it's useful to model
17
19
  this data without using a database, and that's what minimodel is for.
18
20
 
19
21
 
20
- Example
21
- -------
22
+ ## Example
22
23
 
23
24
  Here's how you could implement a currency model using minimodel:
24
25
 
@@ -37,6 +38,7 @@ end
37
38
  The Currency class will respond to `#count` (returning the total number of
38
39
  currencies), `#all` (returning an array of currency objects), and `#find`
39
40
  (to lookup a specific currency by its code). Similar to ActiveRecord.
41
+
40
42
  There's also a `load_from` class method which will load data from a YAML
41
43
  file; useful for when you'd rather store the raw data outside of the class.
42
44
 
@@ -1,10 +1,6 @@
1
1
  require 'yaml'
2
2
 
3
3
  class MiniModel
4
- if defined?(id)
5
- undef_method :id
6
- end
7
-
8
4
  def initialize(attributes)
9
5
  @attributes = attributes.to_hash
10
6
  end
@@ -30,7 +26,7 @@ class MiniModel
30
26
  end
31
27
 
32
28
  def method_missing(symbol, *args, &block)
33
- if @attributes.has_key?(symbol) && args.empty? && block.nil?
29
+ if @attributes.key?(symbol) && args.empty? && block.nil?
34
30
  return @attributes[symbol]
35
31
  else
36
32
  super symbol, *args, &block
@@ -38,7 +34,7 @@ class MiniModel
38
34
  end
39
35
 
40
36
  def respond_to_missing?(symbol, include_private = false)
41
- @attributes.has_key?(symbol)
37
+ @attributes.key?(symbol)
42
38
  end
43
39
 
44
40
  class DuplicateKeyError < StandardError
@@ -67,6 +63,12 @@ class MiniModel
67
63
  all.map(&primary_key)
68
64
  end
69
65
 
66
+ def options(text_attribute)
67
+ all.each_with_object({}) do |model, hash|
68
+ hash[model.read_attribute(text_attribute)] = model.read_attribute(primary_key)
69
+ end
70
+ end
71
+
70
72
  def insert(attributes)
71
73
  unless @auto_increment.nil?
72
74
  attributes[primary_key] = @auto_increment
@@ -78,7 +80,7 @@ class MiniModel
78
80
 
79
81
  pkey = object.send(primary_key)
80
82
 
81
- if index.has_key?(pkey)
83
+ if index.key?(pkey)
82
84
  raise DuplicateKeyError
83
85
  end
84
86
 
@@ -1,21 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'minimodel'
3
- s.version = '1.0.0'
3
+ s.version = '2.0.0'
4
+ s.license = 'LGPL-3.0'
4
5
  s.platform = Gem::Platform::RUBY
5
6
  s.authors = ['Tim Craft']
6
7
  s.email = ['mail@timcraft.com']
7
8
  s.homepage = 'http://github.com/timcraft/minimodel'
8
- s.description = 'A little library for defining little models'
9
+ s.description = 'A little Ruby library for defining little models'
9
10
  s.summary = 'See description'
10
- s.files = Dir.glob('{lib,spec}/**/*') + %w(README.md Rakefile minimodel.gemspec)
11
- s.add_development_dependency('rake', '~> 10.0.3')
12
- s.add_development_dependency('activesupport', ['>= 3.0.3'])
13
- s.add_development_dependency('activerecord', ['>= 3.0.3'])
14
- s.add_development_dependency('sqlite3', ['~> 1.3.6'])
11
+ s.files = Dir.glob('{lib,spec}/**/*') + %w(LICENSE.txt README.md Rakefile minimodel.gemspec)
12
+ s.required_ruby_version = '>= 1.9.3'
13
+ s.add_development_dependency('rake', '~> 10')
14
+ s.add_development_dependency('activerecord', '~> 5')
15
+ s.add_development_dependency('sqlite3', '~> 1.3')
16
+ s.add_development_dependency('minitest', '~> 5')
17
+ s.add_development_dependency('json', '~> 2')
15
18
  s.require_path = 'lib'
16
-
17
- if RUBY_VERSION == '1.8.7'
18
- s.add_development_dependency('minitest', '>= 4.2.0')
19
- s.add_development_dependency('json', '>= 1.7.7')
20
- end
21
19
  end
@@ -2,15 +2,15 @@ require 'minitest/autorun'
2
2
  require 'minimodel'
3
3
 
4
4
  class Colour < MiniModel
5
- indexed_by :id, :auto_increment => true
5
+ indexed_by :id, auto_increment: true
6
6
 
7
- insert :name => 'Blue', :hexdigits => '0000FF'
8
- insert :name => 'Red', :hexdigits => 'FF0000'
9
- insert :name => 'Green', :hexdigits => '00FF00'
7
+ insert name: 'Blue', hexdigits: '0000FF'
8
+ insert name: 'Red', hexdigits: 'FF0000'
9
+ insert name: 'Green', hexdigits: '00FF00'
10
10
  end
11
11
 
12
12
  describe 'Colour' do
13
13
  it 'assigns auto incrementing id values' do
14
- Colour.all.map(&:id).must_equal([1, 2, 3])
14
+ Colour.all.map(&:id).sort.must_equal([1, 2, 3])
15
15
  end
16
16
  end
@@ -7,20 +7,18 @@ class Currency < MiniModel
7
7
 
8
8
  load_from 'spec/currency_data.yml'
9
9
 
10
- insert :code => 'INR', :name => 'Indian rupee'
11
- insert :code => 'JPY', :name => 'Japanese yen'
10
+ insert code: 'INR', name: 'Indian rupee'
11
+ insert code: 'JPY', name: 'Japanese yen'
12
12
  end
13
13
 
14
14
  describe 'A currency object' do
15
15
  before do
16
- @euro = Currency.new(:code => 'EUR', :name => 'Euro')
16
+ @euro = Currency.new(code: 'EUR', name: 'Euro')
17
17
  end
18
18
 
19
- if Object.new.respond_to?(:respond_to_missing?)
20
- it 'responds to code and name methods' do
21
- @euro.respond_to?(:code).must_equal(true)
22
- @euro.respond_to?(:name).must_equal(true)
23
- end
19
+ it 'responds to code and name methods' do
20
+ @euro.respond_to?(:code).must_equal(true)
21
+ @euro.respond_to?(:name).must_equal(true)
24
22
  end
25
23
 
26
24
  it 'provides attribute reader methods' do
@@ -31,17 +29,17 @@ describe 'A currency object' do
31
29
  describe 'eql query method' do
32
30
  it 'returns true when passed a currency object with the same attributes' do
33
31
  @euro.eql?(@euro).must_equal(true)
34
- @euro.eql?(Currency.new(:code => 'EUR', :name => 'Euro')).must_equal(true)
32
+ @euro.eql?(Currency.new(code: 'EUR', name: 'Euro')).must_equal(true)
35
33
  end
36
34
 
37
35
  it 'returns false when given a currency object with a different code' do
38
- @euro.eql?(Currency.new(:code => 'GBP', :name => 'Pound sterling')).must_equal(false)
36
+ @euro.eql?(Currency.new(code: 'GBP', name: 'Pound sterling')).must_equal(false)
39
37
  end
40
38
  end
41
39
 
42
40
  describe 'to_hash method' do
43
41
  it 'returns a hash containing the object attributes' do
44
- @euro.to_hash.must_equal({:code => 'EUR', :name => 'Euro'})
42
+ @euro.to_hash.must_equal({code: 'EUR', name: 'Euro'})
45
43
  end
46
44
  end
47
45
 
@@ -72,10 +70,21 @@ describe 'Currency' do
72
70
 
73
71
  describe 'keys class method' do
74
72
  it 'returns an array containing all the primary keys' do
75
- keys = Currency.keys
76
- keys.length.must_equal(5)
73
+ Currency.keys.must_equal(%w(EUR GBP USD INR JPY))
74
+ end
75
+ end
77
76
 
78
- %w(EUR GBP USD INR JPY).each { |key| keys.must_include(key) }
77
+ describe 'options class method' do
78
+ it 'returns a hash mapping the given text attribute to primary keys' do
79
+ options = {
80
+ 'Euro' => 'EUR',
81
+ 'Pound sterling' => 'GBP',
82
+ 'United States dollar' => 'USD',
83
+ 'Indian rupee' => 'INR',
84
+ 'Japanese yen' => 'JPY'
85
+ }
86
+
87
+ Currency.options(:name).must_equal(options)
79
88
  end
80
89
  end
81
90
 
@@ -101,11 +110,7 @@ describe 'Currency' do
101
110
  end
102
111
 
103
112
  it 'raises an error if the currency cannot be found' do
104
- if defined?(KeyError)
105
- proc { Currency.find('FOO') }.must_raise(KeyError) # 1.9
106
- else
107
- proc { Currency.find('FOO') }.must_raise(IndexError) # 1.8
108
- end
113
+ proc { Currency.find('FOO') }.must_raise(KeyError) # 1.9
109
114
  end
110
115
 
111
116
  it 'yields if the currency cannot be found and the caller supplies a block' do
@@ -115,7 +120,7 @@ describe 'Currency' do
115
120
 
116
121
  describe 'insert class method' do
117
122
  it 'raises an error when passed a key that already exists' do
118
- proc { Currency.insert(:code => 'EUR', :name => 'Euro') }.must_raise(MiniModel::DuplicateKeyError)
123
+ proc { Currency.insert(code: 'EUR', name: 'Euro') }.must_raise(MiniModel::DuplicateKeyError)
119
124
  end
120
125
  end
121
126
  end
@@ -3,12 +3,12 @@ require 'minimodel'
3
3
  require 'minimodel/associations'
4
4
  require 'active_record'
5
5
 
6
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
6
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
7
7
 
8
- ActiveRecord::Schema.define(:version => 1) do
9
- create_table :courses, :force => true do |t|
10
- t.string :name, :index => true
11
- t.string :level_name, :index => true
8
+ ActiveRecord::Schema.define(version: 1) do
9
+ create_table :courses, force: true do |t|
10
+ t.string :name, index: true
11
+ t.string :level_name, index: true
12
12
  end
13
13
  end
14
14
 
@@ -18,30 +18,30 @@ class Level < MiniModel
18
18
  has_many :courses
19
19
  has_many :profiles
20
20
 
21
- insert :name => 'VMBO-T'
22
- insert :name => 'HAVO'
23
- insert :name => 'VWO'
21
+ insert name: 'VMBO-T'
22
+ insert name: 'HAVO'
23
+ insert name: 'VWO'
24
24
  end
25
25
 
26
26
  class Profile < MiniModel
27
- indexed_by :id, :auto_increment => true
27
+ indexed_by :id, auto_increment: true
28
28
 
29
29
  belongs_to :level
30
30
 
31
- insert :level_name => 'VMBO-T', :name => 'Techniek'
32
- insert :level_name => 'VMBO-T', :name => 'Zorg en Welzijn'
33
- insert :level_name => 'VMBO-T', :name => 'Economie'
34
- insert :level_name => 'VMBO-T', :name => 'Landbouw'
31
+ insert level_name: 'VMBO-T', name: 'Techniek'
32
+ insert level_name: 'VMBO-T', name: 'Zorg en Welzijn'
33
+ insert level_name: 'VMBO-T', name: 'Economie'
34
+ insert level_name: 'VMBO-T', name: 'Landbouw'
35
35
 
36
- insert :level_name => 'HAVO', :name => 'Economie en Maatschappij'
37
- insert :level_name => 'HAVO', :name => 'Cultuur en Maatschappij'
38
- insert :level_name => 'HAVO', :name => 'Natuur en Gezondheid'
39
- insert :level_name => 'HAVO', :name => 'Natuur en Techniek'
36
+ insert level_name: 'HAVO', name: 'Economie en Maatschappij'
37
+ insert level_name: 'HAVO', name: 'Cultuur en Maatschappij'
38
+ insert level_name: 'HAVO', name: 'Natuur en Gezondheid'
39
+ insert level_name: 'HAVO', name: 'Natuur en Techniek'
40
40
 
41
- insert :level_name => 'VWO', :name => 'Economie en Maatschappij'
42
- insert :level_name => 'VWO', :name => 'Cultuur en Maatschappij'
43
- insert :level_name => 'VWO', :name => 'Natuur en Gezondheid'
44
- insert :level_name => 'VWO', :name => 'Natuur en Techniek'
41
+ insert level_name: 'VWO', name: 'Economie en Maatschappij'
42
+ insert level_name: 'VWO', name: 'Cultuur en Maatschappij'
43
+ insert level_name: 'VWO', name: 'Natuur en Gezondheid'
44
+ insert level_name: 'VWO', name: 'Natuur en Techniek'
45
45
  end
46
46
 
47
47
  class Course < ActiveRecord::Base
@@ -52,7 +52,7 @@ end
52
52
 
53
53
  Level.all.each do |level|
54
54
  for course_name in %w( Nederlands Engels Duits )
55
- Course.create!(:level_name => level.name, :name => "#{level.name}/#{course_name}")
55
+ Course.create!(level_name: level.name, name: "#{level.name}/#{course_name}")
56
56
  end
57
57
  end
58
58
 
metadata CHANGED
@@ -1,118 +1,124 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Craft
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-16 00:00:00.000000000 Z
11
+ date: 2017-06-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 10.0.3
19
+ version: '10'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 10.0.3
26
+ version: '10'
30
27
  - !ruby/object:Gem::Dependency
31
- name: activesupport
28
+ name: activerecord
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: 3.0.3
33
+ version: '5'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: 3.0.3
40
+ version: '5'
46
41
  - !ruby/object:Gem::Dependency
47
- name: activerecord
42
+ name: sqlite3
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 3.0.3
47
+ version: '1.3'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 3.0.3
54
+ version: '1.3'
62
55
  - !ruby/object:Gem::Dependency
63
- name: sqlite3
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ~>
73
+ - - "~>"
68
74
  - !ruby/object:Gem::Version
69
- version: 1.3.6
75
+ version: '2'
70
76
  type: :development
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ~>
80
+ - - "~>"
76
81
  - !ruby/object:Gem::Version
77
- version: 1.3.6
78
- description: A little library for defining little models
82
+ version: '2'
83
+ description: A little Ruby library for defining little models
79
84
  email:
80
85
  - mail@timcraft.com
81
86
  executables: []
82
87
  extensions: []
83
88
  extra_rdoc_files: []
84
89
  files:
85
- - lib/minimodel/associations.rb
90
+ - LICENSE.txt
91
+ - README.md
92
+ - Rakefile
86
93
  - lib/minimodel.rb
94
+ - lib/minimodel/associations.rb
95
+ - minimodel.gemspec
87
96
  - spec/colour_spec.rb
88
97
  - spec/currency_data.yml
89
98
  - spec/currency_spec.rb
90
99
  - spec/dutch_education_spec.rb
91
- - README.md
92
- - Rakefile
93
- - minimodel.gemspec
94
100
  homepage: http://github.com/timcraft/minimodel
95
- licenses: []
101
+ licenses:
102
+ - LGPL-3.0
103
+ metadata: {}
96
104
  post_install_message:
97
105
  rdoc_options: []
98
106
  require_paths:
99
107
  - lib
100
108
  required_ruby_version: !ruby/object:Gem::Requirement
101
- none: false
102
109
  requirements:
103
- - - ! '>='
110
+ - - ">="
104
111
  - !ruby/object:Gem::Version
105
- version: '0'
112
+ version: 1.9.3
106
113
  required_rubygems_version: !ruby/object:Gem::Requirement
107
- none: false
108
114
  requirements:
109
- - - ! '>='
115
+ - - ">="
110
116
  - !ruby/object:Gem::Version
111
117
  version: '0'
112
118
  requirements: []
113
119
  rubyforge_project:
114
- rubygems_version: 1.8.24
120
+ rubygems_version: 2.6.11
115
121
  signing_key:
116
- specification_version: 3
122
+ specification_version: 4
117
123
  summary: See description
118
124
  test_files: []