static-record 1.0.0.pre.2 → 1.0.0.pre.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8161a80bb87cca0d2ed854c4f92b9d105c9bf155
4
- data.tar.gz: 44030ffa8c6d7095b5160f4c807e881ca65b33d8
3
+ metadata.gz: 7a3706048403361650a6116e13d8e88d6afd574d
4
+ data.tar.gz: e3576955961ae0c8f612feae91608eb589e718cd
5
5
  SHA512:
6
- metadata.gz: 6ab0ef1663587e2d2e495802305bc8c568b81dbdb72f56d49b8743f80071714054c7af9a6863c4f3ae70fcd3019c3bf9f61373b7adb640c60f78b93725424ef3
7
- data.tar.gz: 5aca5a3f02caa4bbc8add5b73c037306984c7380018f749c17ff9398b8f14678e15edc177bd371450a894cf2bc5bae740a8d48c3342deee43e8a0ae2309bbfbe
6
+ metadata.gz: 22b0f67f4373b06df4555dbbb99464b914414a8c9e6c21d383964959efd17d7d179a560c5f9ec4597e5124b8555dd72c895e7c84f7b12cbfec8f2d15beb1a5c5
7
+ data.tar.gz: 57fe5f972a3c944fb0ebb17a2cfddc6d53c3c4ba03951e2ca8928a8052c140f3b3fddfe747b51f0d82dd6b97369f68f5fc71ac2fa0079bbe10e9e803d00dabc6
data/README.rdoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = StaticRecord
2
2
 
3
+ {<img src="https://badge.fury.io/rb/static-record.svg" alt="Gem Version" />}[https://badge.fury.io/rb/static-record] {<img src="https://codeclimate.com/github/hchevalier/static_record/badges/gpa.svg" />}[https://codeclimate.com/github/hchevalier/static_record] {<img src="https://travis-ci.org/hchevalier/static_record.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/hchevalier/static_record]
4
+
3
5
  StaticRecord allows you to perform ActiveRecord-like queries over ruby files.
4
6
 
5
7
  Those files act as immutable database records that only developers can alter.
@@ -10,7 +12,7 @@ You can use it when you need several files inheriting a base class.
10
12
 
11
13
  Add this to your Gemfile:
12
14
 
13
- gem 'static_record', require: 'static_record'
15
+ gem 'static-record', require: 'static_record'
14
16
 
15
17
  and run the bundle install command.
16
18
 
@@ -31,15 +33,23 @@ Create your base class inheriting from StaticRecord::Base.
31
33
  path Rails.root.join('app', 'models', 'articles', '**', '*.rb')
32
34
 
33
35
  # Optionnal, declare which column can be used as the primary key (must be unique)
34
- # .find will only be availble if a primary key is defined
36
+ # .find will only be available if a primary key is defined
35
37
  primary_key :name
36
38
 
37
- # Specify which "article" attributes can be queried over
38
- columns [:name, :author, :rank]
39
+ # Specify which "article" attributes can be queried over with their types
40
+ columns name: :string,
41
+ author: :string,
42
+ rank: :integer
39
43
  end
40
44
 
41
45
  At each application startup, an SQLite3 database will be created to store this class' children.
42
46
 
47
+ Available column types are
48
+ - :string
49
+ - :integer
50
+ - :boolean
51
+ - :float
52
+
43
53
  === Child class
44
54
 
45
55
  Create has many child class as you want.
@@ -48,7 +58,7 @@ Create has many child class as you want.
48
58
  # Define the attributes that will be available for your StaticRecord queries
49
59
  attribute :name, 'Article One'
50
60
  attribute :author, 'The author'
51
- attribute :rank, '2'
61
+ attribute :rank, 2
52
62
 
53
63
  # Your class can be used as any other Ruby class
54
64
  def initialize
@@ -67,17 +77,17 @@ Create has many child class as you want.
67
77
 
68
78
  In your code, you can perform queries like this one:
69
79
 
70
- Article.where(name: 'Article Two').or.where.not(author: ['Author 1', 'Author 2']).limit(2).offset(3)
80
+ Article.where(name: 'Article Two').or.where('rank >= 2').limit(2).offset(3)
71
81
 
72
82
  I tried to implement as many SQL functions wrappers that ActiveRecord provides as I could.
73
83
 
74
- There is still a lot of work before everything is available, but I chosed to release the 1.0.0.pre nevertheless.
84
+ There is still a lot of work before everything is available, but I chose to release the 1.0.0.pre nevertheless.
75
85
 
76
86
  Here is a full list:
77
87
  * where
78
88
  * supports Hash -> where(name: 'Name', author: 'Author')
79
89
  * supports String -> where("name = 'Name'") or where("name = ?", 'Name') or where("name = :name", name: 'Name')
80
- * find (requires a primary key has been set)
90
+ * find (only if a primary key has been set)
81
91
  * find_by
82
92
  * not
83
93
  * or
@@ -109,7 +119,6 @@ As StaticRecord is in active development and a full list of feature is already s
109
119
 
110
120
  Here is what will be available soon:
111
121
  - Better documentation
112
- - Typed attributes
113
- - Foreign keys
122
+ - Support for Date, Datetime and Foreign keys
114
123
  - Joins
115
124
  - Generators
data/Rakefile CHANGED
@@ -20,3 +20,11 @@ load 'rails/tasks/engine.rake'
20
20
  load 'rails/tasks/statistics.rake'
21
21
 
22
22
  Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake'
25
+ require 'rspec/core/rake_task'
26
+
27
+ RSpec::Core::RakeTask.new(:spec) do |t|
28
+ t.pattern = Dir.glob('../spec/**/*_spec.rb')
29
+ end
30
+ task :default => :spec
@@ -6,15 +6,15 @@ module StaticRecord
6
6
 
7
7
  module ClassMethods # :nodoc:
8
8
  def create_store
9
- columns = class_variable_get(:@@_columns)
9
+ cols = class_variable_get(:@@_columns)
10
10
  begin
11
11
  dbname = Rails.root.join('db', "static_#{store}.sqlite3").to_s
12
12
  SQLite3::Database.new(dbname)
13
13
  db = SQLite3::Database.open(dbname)
14
14
  db.execute("DROP TABLE IF EXISTS #{store}")
15
- create_table(db, columns)
15
+ create_table(db, cols)
16
16
  load_records.each_with_index do |record, index|
17
- insert_into_database(db, record, index, columns)
17
+ insert_into_database(db, record, index, cols)
18
18
  end
19
19
  rescue SQLite3::Exception => e
20
20
  puts 'Exception occurred', e
@@ -25,16 +25,34 @@ module StaticRecord
25
25
 
26
26
  private
27
27
 
28
- def create_table(db, columns)
29
- cols = columns.map { |c| c.to_s + ' TEXT' }.join(', ')
30
- sql = "CREATE TABLE #{store}(id INTEGER PRIMARY KEY, klass TEXT, #{cols})"
28
+ def create_table(db, cols)
29
+ attr_list = []
30
+ cols.each do |c, v|
31
+ attr_list << c.to_s + column_type_to_sql(v)
32
+ end
33
+ str_attr = attr_list.join(', ')
34
+ sql = "CREATE TABLE #{store}(id INTEGER PRIMARY KEY, klass TEXT, #{str_attr})"
31
35
  db.execute(sql)
32
36
  end
33
37
 
34
- def insert_into_database(db, record, index, columns)
38
+ def column_type_to_sql(ctype)
39
+ case ctype.to_s
40
+ when 'string'
41
+ ' TEXT'
42
+ else
43
+ " #{ctype.to_s.upcase}"
44
+ end
45
+ end
46
+
47
+ def insert_into_database(db, record, index, cols)
35
48
  attrs = record.constantize.new.attributes
36
- sqlized = [index.to_s, "'#{record}'"] # id, klass
37
- sqlized += columns.map { |c| "'#{attrs[c]}'" } # model's attributes
49
+ # id, klass
50
+ sqlized = [index.to_s, "'#{record}'"]
51
+ # model's attributes
52
+ sqlized += cols.map do |name, ctype|
53
+ ctype == :integer ? attrs[name].to_s : "'#{attrs[name]}'"
54
+ end
55
+
38
56
  db.execute("INSERT INTO #{store} VALUES(#{sqlized.join(', ')})")
39
57
  end
40
58
 
@@ -2,4 +2,5 @@ module StaticRecord
2
2
  class RecordNotFound < RuntimeError; end
3
3
  class ReservedAttributeName < RuntimeError; end
4
4
  class NoPrimaryKey < RuntimeError; end
5
+ class UnkownType < RuntimeError; end
5
6
  end
@@ -11,6 +11,13 @@ module StaticRecord
11
11
  :@@_store
12
12
  ].freeze
13
13
 
14
+ KNOWN_TYPES = [
15
+ :string,
16
+ :boolean,
17
+ :integer,
18
+ :float
19
+ ].freeze
20
+
14
21
  def initialize
15
22
  attributes.each do |attr, value|
16
23
  instance_variable_set "@#{attr}", value
@@ -67,5 +74,9 @@ module StaticRecord
67
74
  class_variable_set('@@_columns', cols)
68
75
  create_store
69
76
  end
77
+
78
+ def self.get_column_type(column)
79
+ class_variable_get(:@@_columns)[column]
80
+ end
70
81
  end
71
82
  end
@@ -1,3 +1,3 @@
1
1
  module StaticRecord
2
- VERSION = '1.0.0.pre.2'.freeze
2
+ VERSION = '1.0.0.pre.3'.freeze
3
3
  end
@@ -12,6 +12,6 @@ RSpec.describe StaticRecord::Base, :type => :model do
12
12
  article = Article.find('Article One')
13
13
  expect(article.name).to eql('Article One')
14
14
  expect(article.author).to eql('The author')
15
- expect(article.rank).to eql('2')
15
+ expect(article.rank).to eql(2)
16
16
  end
17
17
  end
@@ -5,4 +5,12 @@ RSpec.describe StaticRecord::Querying, :type => :model do
5
5
  it 'delegates requests to StaticRecord::Relation' do
6
6
  expect(Article.where(author: 'The author')).to be_a(StaticRecord::Relation)
7
7
  end
8
+
9
+ it 'returns a new StaticRecord::Relation for each method chaining node' do
10
+ first_node = Article.where(author: 'The author')
11
+ expect(first_node).to be_a(StaticRecord::Relation)
12
+ second_node = first_node.where(rank: 3)
13
+ expect(second_node).to be_a(StaticRecord::Relation)
14
+ expect(second_node).not_to eql(first_node)
15
+ end
8
16
  end
@@ -2,5 +2,8 @@ class Article < StaticRecord::Base
2
2
  table :articles
3
3
  path Rails.root.join('app', 'models', 'articles', '**', '*.rb')
4
4
  primary_key :name
5
- columns [:name, :author, :rank]
5
+
6
+ columns name: :string,
7
+ author: :string,
8
+ rank: :integer
6
9
  end
@@ -1,5 +1,5 @@
1
1
  class ArticleFour < Article
2
2
  attribute :name, 'Article Four'
3
3
  attribute :author, 'Me'
4
- attribute :rank, '3'
4
+ attribute :rank, 3
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class ArticleOne < Article
2
2
  attribute :name, 'Article One'
3
3
  attribute :author, 'The author'
4
- attribute :rank, '2'
4
+ attribute :rank, 2
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class ArticleThree < Article
2
2
  attribute :name, 'Article Three'
3
3
  attribute :author, 'Another author'
4
- attribute :rank, '1'
4
+ attribute :rank, 1
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class ArticleTwo < Article
2
2
  attribute :name, 'Article Two'
3
3
  attribute :author, 'The author'
4
- attribute :rank, '3'
4
+ attribute :rank, 3
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: static-record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.2
4
+ version: 1.0.0.pre.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugo Chevalier
@@ -28,56 +28,70 @@ dependencies:
28
28
  name: sqlite3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.3.12
33
+ version: '1.3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.3.12
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 12.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 12.0.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '='
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 3.5.0
61
+ version: '3.5'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '='
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: 3.5.0
68
+ version: '3.5'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec-rails
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '='
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 3.5.2
75
+ version: '3.5'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '='
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 3.5.2
82
+ version: '3.5'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rubocop
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '='
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
89
  version: 0.46.0
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '='
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: 0.46.0
83
97
  description: |2