declarative_grid 0.0.1 → 0.0.5

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.
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