columns 0.0.1 → 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +13 -3
- data/bin/columns +1 -29
- data/lib/columns/model_cleaner.rb +1 -1
- data/lib/columns/model_data.rb +6 -2
- data/lib/columns/model_writer.rb +12 -1
- data/lib/columns/raw_data.rb +13 -2
- data/lib/columns/table.rb +8 -11
- data/lib/columns/version.rb +1 -1
- data/lib/columns.rb +61 -0
- data/spec/fixtures/integration/user_filled +8 -0
- data/spec/integration/columns_spec.rb +35 -0
- data/spec/model_writer_spec.rb +2 -4
- data/spec/spec_helper.rb +24 -18
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74908684891067229e04bdab34a621b9d60e803f
|
4
|
+
data.tar.gz: 18d28d782d48a920625c3fd3cc2de7d5dcd63941
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 366a8c5b0d4271b0132519dabd8585493cce531bc306348f128f6cf1448024f74a0d6829c485c28a686c8c66729466e801ccf8eaab5525dfe8f1517698c808c9
|
7
|
+
data.tar.gz: 1cebe951c55d2e4ce23571d14ab986d62ba90481e597d42ecfc11cf0b11359ab90322a5e9a80234d6ca1543cb888e85d1aec1061ebb256098419fbc5094e7d90
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Columns
|
1
|
+
# Columns [](http://badge.fury.io/rb/columns)
|
2
2
|
|
3
3
|
Annotates activerecord models using `db/schema.rb`.
|
4
4
|
|
@@ -22,11 +22,21 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
$ cd your_project
|
24
24
|
|
25
|
-
Once you have generate a `db/schema.rb`, just type
|
25
|
+
Once you have generate a `db/schema.rb`, just type the following to
|
26
|
+
annotate your models:
|
26
27
|
|
27
28
|
$ columns
|
28
29
|
|
29
|
-
|
30
|
+
### Do it programmaticaly
|
31
|
+
|
32
|
+
Instead of using Columns as a shell command, you can use it as a
|
33
|
+
library. To do so, call the following method:
|
34
|
+
|
35
|
+
``` ruby
|
36
|
+
require 'columns'
|
37
|
+
|
38
|
+
Columns.execute
|
39
|
+
```
|
30
40
|
|
31
41
|
Note that models must to reside in `app/models`.
|
32
42
|
|
data/bin/columns
CHANGED
@@ -2,33 +2,5 @@
|
|
2
2
|
|
3
3
|
require 'columns'
|
4
4
|
|
5
|
-
|
6
|
-
schema_file = File.expand_path('./db/schema.rb')
|
7
|
-
|
8
|
-
unless File.exists?(schema_file)
|
9
|
-
puts "COLUMNS ERROR : #{schema_file} doesn't exist!"
|
10
|
-
exit 1
|
11
|
-
end
|
12
|
-
table = Columns::Table.new(File.read(schema_file))
|
13
|
-
|
14
|
-
# create RawData for each tables
|
15
|
-
raw_data_objects = []
|
16
|
-
table.names.each do |name|
|
17
|
-
raw_data_objects << Columns::RawData.new(name, table.content_for(name))
|
18
|
-
end
|
19
|
-
|
20
|
-
# create ModelData from each RawData
|
21
|
-
model_data_objects = raw_data_objects.map do |o|
|
22
|
-
Columns::ModelData.new(o)
|
23
|
-
end
|
24
|
-
|
25
|
-
# clean all models using ModelCleaner
|
26
|
-
# write all models using ModelData
|
27
|
-
writer = Columns::ModelWriter.new
|
28
|
-
model_data_objects.each do |o|
|
29
|
-
path = File.expand_path('./app/models/' + o.name + '.rb')
|
30
|
-
Columns::ModelCleaner.clean(path)
|
31
|
-
writer.add_info(o)
|
32
|
-
end
|
33
|
-
|
5
|
+
Columns.execute
|
34
6
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Columns
|
2
2
|
|
3
|
-
#
|
3
|
+
# This class is responsible of removing a possible schema info
|
4
4
|
# from a ruby model file. Note that it isn't any attempt to actually
|
5
5
|
# check if we really deals with a model.
|
6
6
|
class ModelCleaner
|
data/lib/columns/model_data.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Columns
|
2
2
|
|
3
|
-
#
|
3
|
+
# Stores data about a model.
|
4
4
|
#
|
5
5
|
# Model name
|
6
6
|
# ----------
|
@@ -20,12 +20,16 @@ module Columns
|
|
20
20
|
# # integer "foo"
|
21
21
|
class ModelData
|
22
22
|
|
23
|
-
# Public: Get the model's name. For a model `app/models/user.rb`,
|
23
|
+
# Public: Get the String model's name. For a model `app/models/user.rb`,
|
24
24
|
# the model's name will be `user`.
|
25
25
|
attr_reader :name
|
26
26
|
|
27
|
+
# Public: Get a String formatted content.
|
27
28
|
attr_reader :content
|
28
29
|
|
30
|
+
# Public: Creates a new ModelData.
|
31
|
+
#
|
32
|
+
# raw_data - A RawData object.
|
29
33
|
def initialize(raw_data)
|
30
34
|
# Ok, this is really idiot, I know, I know. Must use inflectors in
|
31
35
|
# the future.
|
data/lib/columns/model_writer.rb
CHANGED
@@ -1,12 +1,23 @@
|
|
1
1
|
module Columns
|
2
2
|
|
3
|
-
#
|
3
|
+
# Add schema info to the end of a ruby model.
|
4
4
|
class ModelWriter
|
5
5
|
|
6
|
+
# Public: Creates a new ModelWriter.
|
7
|
+
#
|
8
|
+
# path - String relative or absolute path to the models directory.
|
9
|
+
# It's handy to be able to change the path during tests.
|
10
|
+
# Default is './app/models/'.
|
6
11
|
def initialize(path: './app/models/')
|
7
12
|
@path = path
|
8
13
|
end
|
9
14
|
|
15
|
+
# Public: Puts model data and meta data to the end of a model file.
|
16
|
+
#
|
17
|
+
# model_data - A ModelData, used to deduce the model file and to
|
18
|
+
# grab data.
|
19
|
+
#
|
20
|
+
# Returns nothing.
|
10
21
|
def add_info(model_data)
|
11
22
|
@model_data = model_data
|
12
23
|
ensure_file_end_with_empty_line
|
data/lib/columns/raw_data.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
module Columns
|
2
2
|
|
3
|
-
#
|
3
|
+
# A simple object to store raw data about a table.
|
4
4
|
class RawData
|
5
|
-
attr_reader :name, :content
|
6
5
|
|
6
|
+
# Public: Get the String table's name.
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
# Public: Get the String table's content, i.e column's names and
|
10
|
+
# types.
|
11
|
+
attr_reader :content
|
12
|
+
|
13
|
+
# Public: Creates a new RawData.
|
14
|
+
#
|
15
|
+
# name - A String table's name.
|
16
|
+
# content - A String content related to the table, directly grabbed
|
17
|
+
# from a `schema.rb`.
|
7
18
|
def initialize(name, content)
|
8
19
|
@name = name
|
9
20
|
@content = content
|
data/lib/columns/table.rb
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
module Columns
|
2
2
|
|
3
|
-
#
|
3
|
+
# Represents data for the tables found in schema.
|
4
4
|
class Table
|
5
5
|
|
6
|
-
# Public:
|
6
|
+
# Public: Find the table names.
|
7
|
+
#
|
8
|
+
# Returns an Array of String.
|
9
|
+
attr_reader :names
|
10
|
+
|
11
|
+
# Public: Creates a new Table.
|
7
12
|
#
|
8
13
|
# schema - The db/schema.rb as a String.
|
9
14
|
def initialize(schema)
|
10
|
-
# Records the original schema file. TODO See if it's really needed.
|
11
|
-
@schema = schema
|
12
15
|
@schema_lines = schema.split("\n")
|
13
|
-
|
14
|
-
|
15
|
-
# Public: Find the table names.
|
16
|
-
#
|
17
|
-
# Returns an Array of String.
|
18
|
-
def names
|
19
|
-
@schema_lines.map {|line| Regex.table_name(line) }.compact
|
16
|
+
@names = @schema_lines.map {|line| Regex.table_name(line) }.compact
|
20
17
|
end
|
21
18
|
|
22
19
|
# Public: Get the column names and types for a given table.
|
data/lib/columns/version.rb
CHANGED
data/lib/columns.rb
CHANGED
@@ -7,5 +7,66 @@ require "columns/model_cleaner"
|
|
7
7
|
require "columns/model_writer"
|
8
8
|
require "columns/extended_content"
|
9
9
|
|
10
|
+
# Public: Columns annotate your activerecord models from a `schema.rb` file.
|
11
|
+
# That could be handy when your application don't use Rails.
|
10
12
|
module Columns
|
13
|
+
|
14
|
+
# Public: Annotate models.
|
15
|
+
#
|
16
|
+
# schema_dir - String directory (absolute or relative) to find the
|
17
|
+
# `schema.rb` file. Default is `./db/`.
|
18
|
+
# models_dir - String directory (absolute or relative) to find the
|
19
|
+
# models. Default is `./app/models/`.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
#
|
23
|
+
# Raises SystemExit if the `schema.rb` doesn't exist.
|
24
|
+
def self.execute(schema_dir: './db/', models_dir: './app/models/')
|
25
|
+
application = Application.new(schema_dir, models_dir)
|
26
|
+
application.execute
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# The tool chain.
|
32
|
+
class Application
|
33
|
+
|
34
|
+
# Creates a new Application.
|
35
|
+
#
|
36
|
+
# See Columns.execute for arguments.
|
37
|
+
#
|
38
|
+
# Raises SystemExit if it can't find the `schema.rb`.
|
39
|
+
def initialize(schema_dir, models_dir)
|
40
|
+
@models_dir = models_dir
|
41
|
+
schema_path = File.expand_path(File.join(schema_dir,'schema.rb'))
|
42
|
+
|
43
|
+
unless File.exists?(schema_path)
|
44
|
+
puts "COLUMNS ERROR : #{schema_path} doesn't exist!"
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
table = Table.new(File.read(schema_path))
|
48
|
+
|
49
|
+
raw_data_objects = []
|
50
|
+
table.names.each do |name|
|
51
|
+
raw_data_objects << RawData.new(name, table.content_for(name))
|
52
|
+
end
|
53
|
+
|
54
|
+
@model_data_objects = raw_data_objects.map do |object|
|
55
|
+
ModelData.new(object)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Cleans then writes models.
|
60
|
+
#
|
61
|
+
# Returns nothing.
|
62
|
+
def execute
|
63
|
+
writer = ModelWriter.new(path: @models_dir)
|
64
|
+
@model_data_objects.each do |object|
|
65
|
+
path = File.expand_path(File.join(@models_dir, object.name) + '.rb')
|
66
|
+
ModelCleaner.clean(path)
|
67
|
+
writer.add_info(object)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
11
72
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Columns do
|
4
|
+
|
5
|
+
describe 'executes the application' do
|
6
|
+
before { create_clean_user_rb }
|
7
|
+
after { remove_user_rb }
|
8
|
+
|
9
|
+
specify 'on virgin models', :speed => 'slow' do
|
10
|
+
schema_dir = 'spec/fixtures'
|
11
|
+
models_dir = 'spec/fixtures'
|
12
|
+
|
13
|
+
Columns.execute(schema_dir: schema_dir, models_dir: models_dir)
|
14
|
+
|
15
|
+
expect(user_rb_file).to eq integration_user_filled_file
|
16
|
+
end
|
17
|
+
|
18
|
+
skip 'on already annotated models', :speed => 'slow' do
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when there is no schema' do
|
24
|
+
it 'exits with status code 1', :speed => 'slow' do
|
25
|
+
schema_dir = 'spec/'
|
26
|
+
models_dir = 'spec/fixtures'
|
27
|
+
|
28
|
+
begin
|
29
|
+
Columns.execute(schema_dir: schema_dir, models_dir: models_dir)
|
30
|
+
rescue SystemExit => ex
|
31
|
+
expect(ex.status).to eq 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/model_writer_spec.rb
CHANGED
@@ -2,10 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ModelWriter do
|
4
4
|
|
5
|
-
before
|
6
|
-
|
7
|
-
create_clean_user_rb
|
8
|
-
end
|
5
|
+
before { create_clean_user_rb }
|
6
|
+
after { remove_user_rb }
|
9
7
|
|
10
8
|
it 'writes schema info to the end of a file' do
|
11
9
|
writer = ModelWriter.new(path: fixtures_path)
|
data/spec/spec_helper.rb
CHANGED
@@ -5,46 +5,52 @@ require_relative '../lib/columns'
|
|
5
5
|
include Columns
|
6
6
|
|
7
7
|
def fixtures_path
|
8
|
-
File.expand_path(File.dirname(__FILE__) + '/fixtures')
|
9
|
-
end
|
8
|
+
File.expand_path(File.dirname(__FILE__) + '/fixtures')# {{{
|
9
|
+
end# }}}
|
10
10
|
|
11
11
|
def schema_file
|
12
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/schema.rb')
|
12
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/schema.rb')# {{{
|
13
13
|
File.read(file_path)
|
14
|
-
end
|
14
|
+
end# }}}
|
15
15
|
|
16
16
|
def user_rb_path
|
17
|
-
File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')
|
18
|
-
end
|
17
|
+
File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')# {{{
|
18
|
+
end# }}}
|
19
19
|
|
20
20
|
def user_rb_file
|
21
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')
|
21
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')# {{{
|
22
22
|
File.read(file_path)
|
23
|
-
end
|
23
|
+
end# }}}
|
24
24
|
|
25
25
|
def user_cleaned_file
|
26
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_cleaned')
|
26
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_cleaned')# {{{
|
27
27
|
File.read(file_path)
|
28
|
-
end
|
28
|
+
end# }}}
|
29
29
|
|
30
30
|
def user_filled_file
|
31
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_filled')
|
31
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_filled')# {{{
|
32
32
|
File.read(file_path)
|
33
|
-
end
|
33
|
+
end# }}}
|
34
|
+
|
35
|
+
def integration_user_filled_file
|
36
|
+
file_path = File.expand_path(File.dirname(__FILE__) +# {{{
|
37
|
+
'/fixtures/integration/user_filled')
|
38
|
+
File.read(file_path)
|
39
|
+
end# }}}
|
34
40
|
|
35
41
|
def remove_user_rb
|
36
|
-
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')
|
42
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')# {{{
|
37
43
|
FileUtils.rm_f(file_path)
|
38
|
-
end
|
44
|
+
end# }}}
|
39
45
|
|
40
46
|
def create_user_rb
|
41
|
-
src = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_filled')
|
47
|
+
src = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_filled')# {{{
|
42
48
|
dest = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')
|
43
49
|
FileUtils.cp(src, dest)
|
44
|
-
end
|
50
|
+
end# }}}
|
45
51
|
|
46
52
|
def create_clean_user_rb
|
47
|
-
src = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_cleaned')
|
53
|
+
src = File.expand_path(File.dirname(__FILE__) + '/fixtures/user_cleaned')# {{{
|
48
54
|
dest = File.expand_path(File.dirname(__FILE__) + '/fixtures/user.rb')
|
49
55
|
FileUtils.cp(src, dest)
|
50
|
-
end
|
56
|
+
end# }}}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: columns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lkdjiin
|
@@ -106,9 +106,11 @@ files:
|
|
106
106
|
- lib/columns/table.rb
|
107
107
|
- lib/columns/version.rb
|
108
108
|
- spec/extended_content_spec.rb
|
109
|
+
- spec/fixtures/integration/user_filled
|
109
110
|
- spec/fixtures/schema.rb
|
110
111
|
- spec/fixtures/user_cleaned
|
111
112
|
- spec/fixtures/user_filled
|
113
|
+
- spec/integration/columns_spec.rb
|
112
114
|
- spec/model_cleaner_spec.rb
|
113
115
|
- spec/model_data_spec.rb
|
114
116
|
- spec/model_writer_spec.rb
|
@@ -146,9 +148,11 @@ specification_version: 4
|
|
146
148
|
summary: Annotates activerecord models using `db/schema.rb`.
|
147
149
|
test_files:
|
148
150
|
- spec/extended_content_spec.rb
|
151
|
+
- spec/fixtures/integration/user_filled
|
149
152
|
- spec/fixtures/schema.rb
|
150
153
|
- spec/fixtures/user_cleaned
|
151
154
|
- spec/fixtures/user_filled
|
155
|
+
- spec/integration/columns_spec.rb
|
152
156
|
- spec/model_cleaner_spec.rb
|
153
157
|
- spec/model_data_spec.rb
|
154
158
|
- spec/model_writer_spec.rb
|