nm 0.1.0 → 0.2.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.
@@ -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