nm 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA512:
3
+ metadata.gz: d389b30bc53c3293e4e428b9126c64838124a270d3f535ce360ca3cf984466537f2707a2c149b8ae3d1cbcb231f685a24af6b5ed41f12f0a2b22b7d207f2db09
4
+ data.tar.gz: 9be9ce99e660a80fe20d6e034de82511081b9ad00cf30dbd0b879ff2ec0ebb671279f30611572ffc00e7be77bea456af5d09b1108147f63a9e2c4d7da4e4d461
5
+ SHA1:
6
+ metadata.gz: 6e4b7a81896c762b7c9dea9b642f4eb3c4137967
7
+ data.tar.gz: 579835a684d21fde132b8ab12bd0423381629f44
data/Gemfile CHANGED
@@ -4,6 +4,9 @@ gemspec
4
4
 
5
5
  gem 'rake'
6
6
  gem 'pry'
7
+ gem "whysoslow"
8
+
9
+ gem 'rabl'
7
10
 
8
11
  platform :rbx do
9
12
  gem 'rubysl'
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Nm
2
2
 
3
- JSON/BSON data structure template system. Named for its two template methods: "node" and "map".
3
+ Data templating system. Named for its two main markup methods: "node" and "map". Designed to template data objects for JSON/BSON/whatever/etc serialization.
4
4
 
5
5
  ## Usage
6
6
 
7
7
  Template:
8
8
 
9
9
  ```ruby
10
- # in views/slideshow.json.nm
10
+ # in /path/to/views/slideshow.json.nm
11
11
 
12
12
  node 'slideshow' do
13
13
  node 'start_slide', start_slide
@@ -23,35 +23,115 @@ node 'slideshow' do
23
23
  end
24
24
  ```
25
25
 
26
+ Render:
27
+
28
+ ```ruby
29
+ require 'nm'
30
+ source = Nm::Source.new('/path/to/views')
31
+ source.render('slideshow.json', {
32
+ :start_slide => 1,
33
+ :slides => [ ... ] #=> list of slide objects 1, 2 and 3
34
+ })
35
+ ```
36
+
26
37
  Output:
27
38
 
28
- ```json
29
- { "slideshow": {
30
- "start_slide": 1,
31
- "slides": [
32
- { "id": "slide-1",
33
- "title": "Slide 1",
34
- "thumb": "//path/to/slide-1-thumb.jpg",
35
- "image": "//path/to/slide-1-image.jpg",
36
- "url": "//path/to/slide-1-url",
39
+ ```ruby
40
+ { "slideshow" => {
41
+ "start_slide" => 1,
42
+ "slides" => [
43
+ { "id" => "slide-1",
44
+ "title" => "Slide 1",
45
+ "thumb" => "//path/to/slide-1-thumb.jpg",
46
+ "image" => "//path/to/slide-1-image.jpg",
47
+ "url" => "//path/to/slide-1-url",
37
48
  },
38
- { "id": "slide-2",
39
- "title": "Slide 2",
40
- "thumb": "//path/to/slide-2-thumb.jpg",
41
- "image": "//path/to/slide-2-image.jpg",
42
- "url": "//path/to/slide-2-url",
49
+ { "id" => "slide-2",
50
+ "title" => "Slide 2",
51
+ "thumb" => "//path/to/slide-2-thumb.jpg",
52
+ "image" => "//path/to/slide-2-image.jpg",
53
+ "url" => "//path/to/slide-2-url",
43
54
  },
44
- { "id": "slide-3",
45
- "title": "Slide 3",
46
- "thumb": "//path/to/slide-3-thumb.jpg",
47
- "image": "//path/to/slide-3-image.jpg",
48
- "url": "//path/to/slide-3-url",
55
+ { "id" => "slide-3",
56
+ "title" => "Slide 3",
57
+ "thumb" => "//path/to/slide-3-thumb.jpg",
58
+ "image" => "//path/to/slide-3-image.jpg",
59
+ "url" => "//path/to/slide-3-url",
49
60
  }
50
61
  ]
51
62
  }
52
63
  }
53
64
  ```
54
65
 
66
+ ## Notes
67
+
68
+ ### Render Format
69
+
70
+ Rendering templates returns a data object (`::Hash` or `::Array`). To serialize, bring in your favorite JSON/BSON/whatever serializer and pass the rendered object to it.
71
+
72
+ ### Markup Methods
73
+
74
+ There are two main markup methods:
75
+
76
+ * `node`: create a named attribute on a hash object
77
+ * `map`: create a list object mapped from a given list
78
+
79
+ ### Partials
80
+
81
+ **Note**: using partials negatively impacts template rendering performance.
82
+
83
+ (from example above)
84
+
85
+ ```ruby
86
+ # in /path/to/views/slideshow.json.nm
87
+
88
+ node 'slideshow' do
89
+ node 'start_slide', start_slide
90
+ node 'slides' do
91
+ map slides do |slide|
92
+ partial 'slide.json', :slide => slide
93
+ end
94
+ end
95
+ end
96
+
97
+ # in /path/to/views/_slide.json.nm
98
+
99
+ node 'id', slide.id
100
+ node 'title', slide.title
101
+ node 'image', slide.image_url
102
+ node 'thumb', slide.thumb_url
103
+ node 'url', slide.url
104
+ ```
105
+
106
+ This will render the same output as above.
107
+
108
+ ### Markup Aliases
109
+
110
+ If you find you need to use a local named `node` or `map`, these markup methods are aliased as
111
+ `n`, `_node`, `m`, and `_map` respectively. Any combination of aliases is valid:
112
+
113
+ ```ruby
114
+ node 'slideshow' do
115
+ n 'start_slide', start_slide
116
+ _node 'slides' do
117
+ _map slides do |slide|
118
+ _node 'id', slide.id
119
+ node 'title', slide.title
120
+ _node 'image', slide.image_url
121
+ node 'thumb', slide.thumb_url
122
+ _node 'url', slide.url
123
+ end
124
+ m other_slides do |slide|
125
+ node 'id', slide.id
126
+ _node 'title', slide.title
127
+ node 'image', slide.image_url
128
+ _node 'thumb', slide.thumb_url
129
+ node 'url', slide.url
130
+ end
131
+ end
132
+ end
133
+ ```
134
+
55
135
  ## Installation
56
136
 
57
137
  Add this line to your application's Gemfile:
@@ -0,0 +1,5 @@
1
+ node 'id', slide.id
2
+ node 'title', slide.title
3
+ node 'image', slide.image_url
4
+ node 'thumb', slide.thumb_url
5
+ node 'url', slide.url
@@ -0,0 +1,36 @@
1
+ require 'bench/runner'
2
+
3
+ module NmBench
4
+
5
+ class Logger
6
+
7
+ def initialize(file_path)
8
+ @file = File.open(file_path, 'w')
9
+ @ios = [@file, $stdout]
10
+ yield self
11
+ @file.close
12
+ end
13
+
14
+ def method_missing(meth, *args, &block)
15
+ @ios.each do |io|
16
+ io.respond_to?(meth.to_s) ? io.send(meth.to_s, *args, &block) : super
17
+ end
18
+ end
19
+
20
+ def respond_to?(*args)
21
+ @ios.first.respond_to?(args.first.to_s) ? true : super
22
+ end
23
+
24
+ def run_template(runner, name, *args)
25
+ GC.disable
26
+
27
+ Runner.run(runner, name, self, *args)
28
+ self.puts
29
+
30
+ GC.enable
31
+ GC.start
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,30 @@
1
+ Nm slideshow: 1 times
2
+ ---------------------
3
+ whysoslow? ..
4
+
5
+ mem @ start 41 MB ??
6
+ mem @ finish 41 MB + 0 MB, 0%
7
+
8
+ user system total real
9
+ time 0.0 ms 0.0 ms 0.0 ms 5.086 ms
10
+
11
+ Nm slideshow: 10 times
12
+ ----------------------
13
+ whysoslow? ..
14
+
15
+ mem @ start 41 MB ??
16
+ mem @ finish 54 MB + 13 MB, 32%
17
+
18
+ user system total real
19
+ time 40.0 ms 0.0 ms 40.0 ms 39.215 ms
20
+
21
+ Nm slideshow: 100 times
22
+ -----------------------
23
+ whysoslow? ..
24
+
25
+ mem @ start 54 MB ??
26
+ mem @ finish 212 MB + 158 MB, 294%
27
+
28
+ user system total real
29
+ time 320.0 ms 60.0 ms 380.0 ms 379.717 ms
30
+
@@ -0,0 +1,30 @@
1
+ Nm slideshow_partials: 1 times
2
+ ------------------------------
3
+ whysoslow? ..
4
+
5
+ mem @ start 41 MB ??
6
+ mem @ finish 41 MB + 0 MB, 0%
7
+
8
+ user system total real
9
+ time 20.0 ms 0.0 ms 20.0 ms 20.947 ms
10
+
11
+ Nm slideshow_partials: 10 times
12
+ -------------------------------
13
+ whysoslow? ..
14
+
15
+ mem @ start 41 MB ??
16
+ mem @ finish 74 MB + 33 MB, 81%
17
+
18
+ user system total real
19
+ time 170.0 ms 30.0 ms 200.0 ms 196.232 ms
20
+
21
+ Nm slideshow_partials: 100 times
22
+ --------------------------------
23
+ whysoslow? ..
24
+
25
+ mem @ start 50 MB ??
26
+ mem @ finish 531 MB + 480 MB, 952%
27
+
28
+ user system total real
29
+ time 1640.0 ms 310.0 ms 1950.0 ms 1944.464 ms
30
+
@@ -0,0 +1,30 @@
1
+ Nm slideshow: 1 times
2
+ ---------------------
3
+ whysoslow? ..
4
+
5
+ mem @ start 41 MB ??
6
+ mem @ finish 41 MB + 0 MB, 0%
7
+
8
+ user system total real
9
+ time 0.0 ms 0.0 ms 0.0 ms 6.727 ms
10
+
11
+ Nm slideshow: 10 times
12
+ ----------------------
13
+ whysoslow? ..
14
+
15
+ mem @ start 41 MB ??
16
+ mem @ finish 51 MB + 10 MB, 23%
17
+
18
+ user system total real
19
+ time 40.0 ms 10.0 ms 50.0 ms 40.104 ms
20
+
21
+ Nm slideshow: 100 times
22
+ -----------------------
23
+ whysoslow? ..
24
+
25
+ mem @ start 50 MB ??
26
+ mem @ finish 209 MB + 159 MB, 320%
27
+
28
+ user system total real
29
+ time 310.0 ms 60.0 ms 370.0 ms 376.581 ms
30
+
@@ -0,0 +1,30 @@
1
+ RABL slideshow: 1 times
2
+ -----------------------
3
+ whysoslow? ..
4
+
5
+ mem @ start 40 MB ??
6
+ mem @ finish 40 MB + 0 MB, 0%
7
+
8
+ user system total real
9
+ time 10.0 ms 0.0 ms 10.0 ms 18.029 ms
10
+
11
+ RABL slideshow: 10 times
12
+ ------------------------
13
+ whysoslow? ..
14
+
15
+ mem @ start 40 MB ??
16
+ mem @ finish 85 MB + 45 MB, 112%
17
+
18
+ user system total real
19
+ time 170.0 ms 20.0 ms 190.0 ms 193.534 ms
20
+
21
+ RABL slideshow: 100 times
22
+ -------------------------
23
+ whysoslow? ..
24
+
25
+ mem @ start 69 MB ??
26
+ mem @ finish 458 MB + 389 MB, 565%
27
+
28
+ user system total real
29
+ time 1530.0 ms 190.0 ms 1720.0 ms 1720.782 ms
30
+
@@ -0,0 +1,84 @@
1
+ require 'whysoslow'
2
+ require 'rabl'
3
+ require 'nm'
4
+
5
+ require 'bench/template'
6
+
7
+ module NmBench
8
+
9
+ class Runner
10
+
11
+ attr_reader :result
12
+
13
+ RUNNERS = {}
14
+
15
+ def self.run(runner, *args)
16
+ RUNNERS[runner].new(*args).run
17
+ end
18
+
19
+ def initialize(printer_io, title, num_times, &run_proc)
20
+ @proc = proc do
21
+ num_times.times do
22
+ run_proc.call
23
+ end
24
+ end
25
+
26
+ @printer = Whysoslow::DefaultPrinter.new(printer_io, {
27
+ :title => "#{title}: #{num_times} times",
28
+ :verbose => true
29
+ })
30
+ @runner = Whysoslow::Runner.new(@printer)
31
+ end
32
+
33
+ def run
34
+ @runner.run &@proc
35
+ end
36
+
37
+ end
38
+
39
+ class RablRunner < Runner
40
+
41
+ RUNNERS[:rabl] = self
42
+
43
+ def initialize(template_name, printer_io, num_times = 10)
44
+ template = Template.find(template_name)
45
+ super(printer_io, "RABL #{template.name}", num_times) do
46
+ out = Rabl::Renderer.new(template.name, nil, {
47
+ :view_path => File.expand_path('..', __FILE__),
48
+ :locals => template.locals,
49
+ :format => 'hash'
50
+ }).render
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ class NmRunner < Runner
57
+
58
+ RUNNERS[:nm] = self
59
+
60
+ def initialize(template_name, printer_io, num_times = 10)
61
+ template = Template.find(template_name)
62
+ source = Nm::Source.new(File.expand_path('..', __FILE__))
63
+ super(printer_io, "Nm #{template.name}", num_times) do
64
+ out = source.render(template.name, template.locals)
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ class NmReSourceRunner < Runner
71
+
72
+ RUNNERS[:nm_re_source] = self
73
+
74
+ def initialize(template_name, printer_io, num_times = 10)
75
+ template = Template.find(template_name)
76
+ super(printer_io, "Nm #{template.name}", num_times) do
77
+ source = Nm::Source.new(File.expand_path('..', __FILE__))
78
+ out = source.render(template.name, template.locals)
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,12 @@
1
+ node 'slideshow' do
2
+ node 'start_slide', view.start_slide
3
+ node 'slides' do
4
+ map view.slides do |slide|
5
+ node 'id', slide.id
6
+ node 'image', slide.image_url
7
+ node 'thumb', slide.thumb_url
8
+ node 'title', slide.title
9
+ node 'url', slide.url
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ object locals[:view].slideshow => :slideshow
2
+ attributes :start_slide
3
+ child(:slides, :object_root => false, :root => :slides){
4
+ attributes :id, :title, :url, :image, :thumb
5
+ }
@@ -0,0 +1,47 @@
1
+ require 'assert/factory'
2
+ require 'bench/template'
3
+
4
+ module NmBench
5
+
6
+ class SlideshowTemplate < Template
7
+
8
+ TEMPLATES[:slideshow] = self
9
+
10
+ def initialize
11
+ @name = 'slideshow'
12
+ @locals = { :view => View.new }
13
+ end
14
+
15
+ class View
16
+ attr_reader :start_slide, :slides
17
+
18
+ def initialize
19
+ @slides = (1..100).map{ |n| Slide.new(n) }
20
+ @start_slide = @slides.first.id
21
+ end
22
+
23
+ # for RABL template syntax needs
24
+ def slideshow
25
+ self
26
+ end
27
+ end
28
+
29
+ class Slide
30
+ attr_reader :id, :image_url, :thumb_url, :title, :url
31
+
32
+ def initialize(n)
33
+ @id = Assert::Factory.integer
34
+ @image_url = Assert::Factory.url
35
+ @thumb_url = Assert::Factory.url
36
+ @title = "Slide #{n}"
37
+ @url = Assert::Factory.url
38
+ end
39
+
40
+ # for RABL syntax needs
41
+ alias_method :image, :image_url
42
+ alias_method :thumb, :thumb_url
43
+ end
44
+
45
+ end
46
+
47
+ end