declarative_grid 0.0.1 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -24,9 +24,6 @@ in models/member_grid.rb
24
24
  # with builtin render class: DeclarativeGrid::Renderers::Csv
25
25
  renderer :csv
26
26
  #
27
- # with builtin render class: DeclarativeGrid::Renderers::HtmlTable
28
- renderer :html_table
29
- #
30
27
  # with selected columns
31
28
  renderer :csv_selected, class: :csv, columns: [:gender, :name]
32
29
  #
@@ -46,10 +43,15 @@ example code:
46
43
  @grid = MemberGrid.new { [m] }
47
44
 
48
45
  puts "== sample 1 =="
49
- @grid.renderer(:csv).each_data {|s| puts s }
46
+ puts @grid.renderer(:csv).to_string
50
47
 
51
48
  puts "== sample 2 =="
52
- @grid.renderer(:csv_selected).each_data {|s| puts s }
49
+ puts @grid.renderer(:csv_selected).to_string
50
+
51
+ puts "== sample 3 =="
52
+ io = StringIO.new
53
+ @grid.renderer(:csv_selected).perform(io)
54
+ puts io.string
53
55
 
54
56
  result:
55
57
 
@@ -59,7 +61,9 @@ result:
59
61
  == sample 2 ==
60
62
  Sex,Name
61
63
  Male,Adam Jensen
62
-
64
+ == sample 3 ==
65
+ Sex,Name
66
+ Male,Adam Jensen
63
67
 
64
68
  ## Installation
65
69
 
@@ -77,6 +81,10 @@ Or install it yourself as:
77
81
 
78
82
  ## Usage
79
83
 
84
+ If you want to use it with ActiveRecord, like this:
85
+
86
+ grid = MemberGrid.new { Enumerator.new(Member.where(is_good: true), :find_each) }
87
+
80
88
  ## How to Test
81
89
 
82
90
  $ rake spec
@@ -26,5 +26,6 @@ Gem::Specification.new do |gem|
26
26
  gem.add_development_dependency "minitest", "~> 4.1.0"
27
27
  gem.add_development_dependency "mocha", "~> 0.12.7"
28
28
  gem.add_development_dependency "factory_girl", "~> 4.1.0"
29
+ gem.add_development_dependency "nokogiri", "~> 1.5.5"
29
30
 
30
31
  end
@@ -1,25 +1,7 @@
1
1
  module DeclarativeGrid
2
2
  class Base
3
- extend Model::GridClass
4
-
5
- # Renderer Classes
6
- def self.renderer_classes
7
- @renderer_classes ||= {}
8
- end
9
-
10
- # Define a renderer
11
- def self.renderer(name, options = {})
12
- klass = Class.new begin
13
- case k = options.delete(:class)
14
- when Class then k
15
- when String then k.camelize.constantize
16
- else "declarative_grid/renderers/#{k || name}".camelize.constantize
17
- end
18
- end
19
- klass.grid_class = self
20
- klass.options.merge! options
21
- self.renderer_classes[name] = klass
22
- end
3
+ extend Model
4
+ extend Renderers
23
5
 
24
6
  # Attributes
25
7
  attr_accessor :records
@@ -1,6 +1,7 @@
1
1
  module DeclarativeGrid
2
2
  module Model
3
3
  class Column
4
+
4
5
  # Attributes
5
6
  attr_accessor :options, :block, :name
6
7
 
@@ -1,7 +1,28 @@
1
+ require_relative 'model/column'
2
+ require_relative 'model/row'
3
+
1
4
  module DeclarativeGrid::Model
2
- extend ActiveSupport::Autoload
3
5
 
4
- autoload :Column
5
- autoload :Row
6
- autoload :GridClass
6
+ def row
7
+ @row ||= Row.new
8
+ end
9
+
10
+ # Define a column
11
+ # REFERENCE: Model::Row#define_column
12
+ def column(name, options = {}, &block)
13
+ self.row.define_column(name, options, &block)
14
+ end
15
+
16
+ # Return the columns
17
+ # REFERENCE: Model::Row#columns
18
+ def columns(*args)
19
+ self.row.columns(*args)
20
+ end
21
+
22
+ # override Class.inherited
23
+ def inherited(subclass)
24
+ super(subclass)
25
+ subclass.instance_variable_set :@row, self.row.dup
26
+ end
27
+
7
28
  end
@@ -69,24 +69,24 @@ module DeclarativeGrid
69
69
  self.class.inspect
70
70
  end
71
71
 
72
- # Rendered Object as an Enumerator
73
- def each_data(&block)
74
- block ? each_data_string(&block) : Enumerator.new(self, :each_data)
75
- end
76
-
77
- protected
78
-
79
- # Render data to the block
80
- def each_data_string
72
+ # Render data to the stream
73
+ def perform(io)
81
74
  #
82
- # yield string1
83
- # yield string2
84
- # yield string3
75
+ # io.write string1
76
+ # io.puts string2
85
77
  # ...
86
78
  #
87
79
  raise NotImplementedError
88
80
  end
89
81
 
82
+ # Render to string
83
+ def to_string
84
+ io = StringIO.new
85
+ self.perform(io)
86
+ io.close
87
+ io.string
88
+ end
89
+
90
90
  private
91
91
 
92
92
  # Return row (array of data) of a given record
@@ -3,13 +3,10 @@ module DeclarativeGrid
3
3
  class Csv < AbstractRenderer
4
4
  require 'csv'
5
5
 
6
- protected
7
-
8
- def each_data_string
9
- yield CSV.generate_line(headers)
10
- each_row do |row|
11
- yield CSV.generate_line(row)
12
- end
6
+ def perform(io)
7
+ csv = CSV.new(io, headers: true, write_headers: true)
8
+ csv << self.headers
9
+ self.each_row {|row| csv << row }
13
10
  end
14
11
 
15
12
  end
@@ -0,0 +1,52 @@
1
+ module DeclarativeGrid
2
+ module Renderers
3
+ class Html < AbstractRenderer
4
+
5
+ def util
6
+ ERB::Util
7
+ end
8
+ delegate :html_escape, to: :util
9
+
10
+ def perform(io)
11
+ table {|s| io.puts(s) }
12
+ end
13
+
14
+ def to_string
15
+ super.html_safe
16
+ end
17
+
18
+ private
19
+
20
+ def table
21
+ yield '<table>'
22
+
23
+ if cap = self.options[:catpion]
24
+ yield "<caption>#{html_escape(cap)}</caption>"
25
+ end
26
+
27
+ thead {|s| yield s }
28
+ tbody {|s| yield s }
29
+
30
+ yield '</table>'
31
+ end
32
+
33
+ def thead
34
+ yield '<thead>'
35
+ yield '<tr>'
36
+ self.headers.each {|h| yield "<th>#{html_escape(h)}</th>" }
37
+ yield '</tr>'
38
+ yield '</thead>'
39
+ end
40
+
41
+ def tbody
42
+ yield '<tbody>'
43
+ self.each_row{ |row|
44
+ row_html = row.each.map{|d| "<td>#{html_escape(d)}</td>" }.join
45
+ yield "<tr>#{row_html}</tr>"
46
+ }
47
+ yield '</tbody>'
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -1,9 +1,26 @@
1
1
  module DeclarativeGrid::Renderers
2
- extend ActiveSupport::Autoload
3
2
 
4
- autoload :AbstractRenderer
3
+ # Renderer Classes
4
+ def renderer_classes
5
+ @renderer_classes ||= {}
6
+ end
5
7
 
6
- autoload :Csv
7
- autoload :HtmlTable
8
+ # Define a renderer
9
+ def renderer(name, options = {})
10
+ klass = Class.new begin
11
+ case k = options.delete(:class)
12
+ when Class then k
13
+ when String then k.camelize.constantize
14
+ else "declarative_grid/renderers/#{k || name}".camelize.constantize
15
+ end
16
+ end
17
+ klass.grid_class = self
18
+ klass.options.merge! options
19
+ self.renderer_classes[name] = klass
20
+ end
8
21
 
9
22
  end
23
+
24
+ require_relative 'renderers/abstract_renderer'
25
+ require_relative 'renderers/csv'
26
+ require_relative 'renderers/html'
@@ -1,3 +1,3 @@
1
1
  module DeclarativeGrid
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,25 +1,14 @@
1
1
  require "active_support/core_ext"
2
- require "active_support/concern"
3
- require "active_support/dependencies"
4
2
  require "backports"
5
3
 
6
4
  require "declarative_grid/version"
5
+ require 'declarative_grid/model'
6
+ require 'declarative_grid/renderers'
7
+ require 'declarative_grid/base'
8
+
9
+ require "stringio"
7
10
 
8
11
  module DeclarativeGrid
9
- extend ActiveSupport::Autoload
10
-
11
- autoload :Configuration
12
- autoload :Base
13
- autoload :Model
14
- autoload :Renderers
15
-
16
- def self.config
17
- @config ||= Configuration.new
18
- end
19
-
20
- def self.reset_config
21
- @config = nil
22
- end
23
12
 
24
13
  class DefinitionError < StandardError
25
14
  end
@@ -27,7 +16,4 @@ module DeclarativeGrid
27
16
  class RendererError < StandardError
28
17
  end
29
18
 
30
- class ConfigurationError < StandardError
31
- end
32
-
33
19
  end
@@ -8,8 +8,7 @@ module DeclarativeGrid
8
8
  column :two
9
9
 
10
10
  renderer :csv
11
- renderer :html_table
12
- renderer :html_table_1, class: :html_table
11
+ renderer :csv_0, class: :csv
13
12
  renderer :csv_1, class: 'DeclarativeGrid::Renderers::Csv'
14
13
  renderer :csv_2, class: Renderers::Csv
15
14
  renderer :csv_3, class: :csv, columns: [ :two, :two, :two ]
@@ -23,8 +22,12 @@ module DeclarativeGrid
23
22
  @base = @klass.new { @records }
24
23
  end
25
24
 
26
- it "is a Class of #{Model::GridClass}" do
27
- @base.class.must_be_kind_of Model::GridClass
25
+ it "is a kind of #{Model}" do
26
+ @base.class.must_be_kind_of Model
27
+ end
28
+
29
+ it "is a kind of #{Renderers}" do
30
+ @base.class.must_be_kind_of Renderers
28
31
  end
29
32
 
30
33
  it "has a collection of records" do
@@ -36,14 +39,9 @@ module DeclarativeGrid
36
39
  renderer.must_be_kind_of Renderers::Csv
37
40
  end
38
41
 
39
- it "has a renderer named :html_table" do
40
- renderer = @base.renderer(:html_table)
41
- renderer.must_be_kind_of Renderers::HtmlTable
42
- end
43
-
44
- it "has a renderer named :html_table_1" do
45
- renderer = @base.renderer(:html_table_1)
46
- renderer.must_be_kind_of Renderers::HtmlTable
42
+ it "has a renderer named :csv_0" do
43
+ renderer = @base.renderer(:csv_0)
44
+ renderer.must_be_kind_of Renderers::Csv
47
45
  renderer.options.wont_include :class
48
46
  end
49
47
 
@@ -1,11 +1,11 @@
1
1
  require "spec_helper"
2
2
 
3
3
  module DeclarativeGrid
4
- describe Model::GridClass do
4
+ describe Model do
5
5
 
6
6
  before do
7
7
  @klass = Class.new Object do
8
- extend Model::GridClass
8
+ extend Model
9
9
  column :name
10
10
  column :kind
11
11
  end
@@ -4,7 +4,7 @@ module DeclarativeGrid
4
4
  describe Renderers::AbstractRenderer do
5
5
  before do
6
6
  @klass = Class.new Object do
7
- extend Model::GridClass
7
+ extend Model
8
8
  column :one
9
9
  column :two
10
10
  end
@@ -74,25 +74,31 @@ module DeclarativeGrid
74
74
  @renderer.options[:columns].must_equal [:two]
75
75
  end
76
76
 
77
- it "has a not implemented method :each_data_string" do
77
+ it "has a not implemented method :perform" do
78
78
  proc {
79
- @renderer.send(:each_data_string)
79
+ @renderer.send(:perform, StringIO.new)
80
80
  }.must_raise NotImplementedError
81
81
  end
82
82
 
83
- it "has a method :each_data" do
84
- @renderer.expects(:each_data_string)
85
- @renderer.each_data.must_be_kind_of Enumerator
86
- @renderer.each_data {|s| s }
83
+ it "has a method :to_string to render to a string" do
84
+ @renderer.expects(:perform)
85
+ s = @renderer.to_string
86
+ s.must_be_kind_of String
87
87
  end
88
88
 
89
- it "call each_data to return the string" do
90
- def @renderer.each_data_string
91
- yield "test"
92
- yield "test2"
93
- yield "test3"
89
+ it "call perform to render something" do
90
+ def @renderer.perform(io)
91
+ io.write "test"
92
+ io.write "test2"
93
+ io.write "test3"
94
94
  end
95
- @renderer.each_data.to_a.must_equal ["test", "test2", "test3"]
95
+ begin
96
+ io = StringIO.new
97
+ @renderer.perform(io)
98
+ io.close
99
+ io.string.must_equal %w(test test2 test3).join
100
+ end
101
+ @renderer.to_string.must_equal %w(test test2 test3).join
96
102
  end
97
103
 
98
104
  end
@@ -0,0 +1,37 @@
1
+ module DeclarativeGrid
2
+ describe Renderers::Csv do
3
+ before do
4
+ @record_klass = Struct.new :name, :gender
5
+ @klass = Class.new Base do
6
+ column :name
7
+ column :gender
8
+ renderer :csv
9
+ renderer :csv1, class: :csv
10
+ renderer :csv2, class: Renderers::Csv
11
+ renderer :csv_select, class: :csv, columns: [:name]
12
+ end
13
+ @records = [ @record_klass.new('Adam Jensen', 'Male') ]
14
+ @grid = @klass.new { @records }
15
+ end
16
+
17
+ it "should make all the renderers be kind of Csv" do
18
+ @grid.renderer(:csv).must_be_kind_of Renderers::Csv
19
+ @grid.renderer(:csv1).must_be_kind_of Renderers::Csv
20
+ @grid.renderer(:csv2).must_be_kind_of Renderers::Csv
21
+ @grid.renderer(:csv_select).must_be_kind_of Renderers::Csv
22
+ end
23
+
24
+ it "should produce csv strings" do
25
+ expected = [ "Name,Gender\n", "Adam Jensen,Male\n" ].join
26
+ [ :csv, :csv1, :csv2 ].each do |renderer_name|
27
+ @grid.renderer(renderer_name).to_string.must_equal expected
28
+ end
29
+
30
+ expected = [ "Name\n", "Adam Jensen\n" ].join
31
+ begin
32
+ @grid.renderer(:csv_select).to_string.must_equal expected
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ require "nokogiri"
2
+
3
+ module DeclarativeGrid
4
+ describe Renderers::Html do
5
+ before do
6
+ @record_klass = Struct.new :name, :gender
7
+ @klass = Class.new Base do
8
+ column :name
9
+ column :gender
10
+ renderer :html
11
+ end
12
+ @records = [ @record_klass.new('Adam Jensen', 'Male') ]
13
+ @grid = @klass.new { @records }
14
+ end
15
+
16
+ it "should make all the renderers be kind of Html" do
17
+ @grid.renderer(:html).must_be_kind_of Renderers::Html
18
+ end
19
+
20
+ it "should produce a HTML-safe string" do
21
+ @grid.renderer(:html).to_string.html_safe?.must_equal true
22
+ end
23
+
24
+ it "should produce a valid HTML text" do
25
+ doc = Nokogiri::HTML <<-HTML
26
+ <!DOCTYPE html>
27
+ <html>
28
+ <head>
29
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
30
+ </head>
31
+ <body>
32
+ #{ERB::Util.html_escape @grid.renderer(:html).to_string}
33
+ </body>
34
+ </html>
35
+ HTML
36
+
37
+ doc.css('table').wont_be_empty
38
+ doc.css('table thead').wont_be_empty
39
+ doc.css('table tbody').wont_be_empty
40
+ doc.css('table thead tr th').map(&:content).must_equal ['Name', 'Gender']
41
+ doc.css('table tbody tr td').map(&:content).must_equal [
42
+ 'Adam Jensen', 'Male'
43
+ ]
44
+ end
45
+
46
+ end
47
+ end
File without changes
@@ -2,14 +2,4 @@ require 'spec_helper'
2
2
 
3
3
  describe DeclarativeGrid do
4
4
 
5
- it "has configuration object" do
6
- DeclarativeGrid.config.must_be_kind_of DeclarativeGrid::Configuration
7
- end
8
-
9
- it "can reset configuration" do
10
- config = DeclarativeGrid.config
11
- DeclarativeGrid.reset_config
12
- DeclarativeGrid.config.wont_equal config
13
- end
14
-
15
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declarative_grid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-29 00:00:00.000000000 Z
12
+ date: 2012-11-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -107,6 +107,22 @@ dependencies:
107
107
  - - ~>
108
108
  - !ruby/object:Gem::Version
109
109
  version: 4.1.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: nokogiri
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.5.5
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.5.5
110
126
  description: DeclarativeGrid is a gem for rendering grids described in simple DSL
111
127
  email:
112
128
  - davll.xc@gmail.com
@@ -122,21 +138,22 @@ files:
122
138
  - declarative_grid.gemspec
123
139
  - lib/declarative_grid.rb
124
140
  - lib/declarative_grid/base.rb
125
- - lib/declarative_grid/configuration.rb
126
141
  - lib/declarative_grid/model.rb
127
142
  - lib/declarative_grid/model/column.rb
128
- - lib/declarative_grid/model/grid_class.rb
129
143
  - lib/declarative_grid/model/row.rb
130
144
  - lib/declarative_grid/renderers.rb
131
145
  - lib/declarative_grid/renderers/abstract_renderer.rb
132
146
  - lib/declarative_grid/renderers/csv.rb
133
- - lib/declarative_grid/renderers/html_table.rb
147
+ - lib/declarative_grid/renderers/html.rb
134
148
  - lib/declarative_grid/version.rb
135
149
  - spec/declarative_grid/base_spec.rb
136
150
  - spec/declarative_grid/model/column_spec.rb
137
- - spec/declarative_grid/model/grid_class_spec.rb
138
151
  - spec/declarative_grid/model/row_spec.rb
152
+ - spec/declarative_grid/model_spec.rb
139
153
  - spec/declarative_grid/renderers/abstract_renderer_spec.rb
154
+ - spec/declarative_grid/renderers/csv_spec.rb
155
+ - spec/declarative_grid/renderers/html_spec.rb
156
+ - spec/declarative_grid/renderers_spec.rb
140
157
  - spec/declarative_grid_spec.rb
141
158
  - spec/factories/models.rb
142
159
  - spec/spec_helper.rb
@@ -167,9 +184,12 @@ summary: A flexible grid renderer
167
184
  test_files:
168
185
  - spec/declarative_grid/base_spec.rb
169
186
  - spec/declarative_grid/model/column_spec.rb
170
- - spec/declarative_grid/model/grid_class_spec.rb
171
187
  - spec/declarative_grid/model/row_spec.rb
188
+ - spec/declarative_grid/model_spec.rb
172
189
  - spec/declarative_grid/renderers/abstract_renderer_spec.rb
190
+ - spec/declarative_grid/renderers/csv_spec.rb
191
+ - spec/declarative_grid/renderers/html_spec.rb
192
+ - spec/declarative_grid/renderers_spec.rb
173
193
  - spec/declarative_grid_spec.rb
174
194
  - spec/factories/models.rb
175
195
  - spec/spec_helper.rb
@@ -1,6 +0,0 @@
1
- class DeclarativeGrid::Configuration
2
-
3
- def initialize
4
- end
5
-
6
- end
@@ -1,29 +0,0 @@
1
- module DeclarativeGrid
2
- module Model
3
- module GridClass
4
-
5
- def row
6
- @row ||= Model::Row.new
7
- end
8
-
9
- # Define a column
10
- # REFERENCE: Model::Row#define_column
11
- def column(name, options = {}, &block)
12
- self.row.define_column(name, options, &block)
13
- end
14
-
15
- # Return the columns
16
- # REFERENCE: Model::Row#columns
17
- def columns(*args)
18
- self.row.columns(*args)
19
- end
20
-
21
- # override Class.inherited
22
- def inherited(subclass)
23
- super(subclass)
24
- subclass.instance_variable_set :@row, self.row.dup
25
- end
26
-
27
- end
28
- end
29
- end
@@ -1,38 +0,0 @@
1
- module DeclarativeGrid
2
- module Renderers
3
- class HtmlTable < AbstractRenderer
4
-
5
- def utils
6
- ERB::Util
7
- end
8
- delegate :html_escape, to: :utils
9
-
10
- protected
11
-
12
- def each_data_string
13
- yield "<table>"
14
-
15
- if options[:caption]
16
- yield "<caption>#{html_escape(options[:caption])}</caption>"
17
- end
18
-
19
- yield "<thead><tr>"
20
- headers.each do |n|
21
- yield "<th>#{html_escape(n)}</th>"
22
- end
23
- yield "</tr></thead>"
24
-
25
- yield "<tbody>"
26
- each_row do |r|
27
- yield "<tr>"
28
- r.each {|n| yield "<td>#{html_escape(n)}</td>" }
29
- yield "</tr>"
30
- end
31
- yield "</tbody>"
32
-
33
- yield "</table>"
34
- end
35
-
36
- end
37
- end
38
- end