venduitz 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b6dac980ab2b8be2b8abf9dbeb46e7d3cfc65a12
4
+ data.tar.gz: 313d678a9e19b38b8974cf7e4b87b81e287839cd
5
+ SHA512:
6
+ metadata.gz: c65507fd4c7003b689382b8e863f2ea5ae0071035df5a18046df8e0144cfcd1a44f40d64392ec8e6b708deb195c7e9c8c60e83cc05caa46fe0bf8b545b468057
7
+ data.tar.gz: 311d28bda3f9754a84dc59c354dc623f8b84f06ad6512626152ede825c8f9801b28e2a77ea96d722b749f4336df12540fd752638f5231e8546497d9f0488b211
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gemspec
2
+ .DS_Store
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ script:
5
+ - bundle exec rspec
data/Dockerfile ADDED
@@ -0,0 +1,17 @@
1
+ # Ruby image
2
+ FROM ruby
3
+
4
+ # Install bundler
5
+ RUN gem install bundler --no-ri --no-rdoc
6
+
7
+ # Make app folder
8
+ RUN mkdir venduitz/
9
+
10
+ # Set as workdir
11
+ WORKDIR venduitz/
12
+
13
+ # Add the full source
14
+ ADD . .
15
+
16
+ # Install!
17
+ RUN bundle install
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ venduitz (0.0.0)
5
+ multi_json
6
+ oj
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ diff-lcs (1.2.5)
12
+ multi_json (1.11.3)
13
+ oj (2.15.0)
14
+ rspec (3.4.0)
15
+ rspec-core (~> 3.4.0)
16
+ rspec-expectations (~> 3.4.0)
17
+ rspec-mocks (~> 3.4.0)
18
+ rspec-core (3.4.4)
19
+ rspec-support (~> 3.4.0)
20
+ rspec-expectations (3.4.0)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (~> 3.4.0)
23
+ rspec-mocks (3.4.1)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.4.0)
26
+ rspec-support (3.4.1)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ rspec (~> 3.0)
33
+ venduitz!
34
+
35
+ BUNDLED WITH
36
+ 1.12.1
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # Venduitz [![Build Status](https://travis-ci.org/gabrielcorado/venduitz.svg?branch=develop)](https://travis-ci.org/gabrielcorado/venduitz)
2
+ A simple JSON-only(until now) template engine, with focus on performance for better Restful-APIs.
3
+
4
+ ## How to use it
5
+
6
+ ### Install
7
+ ```ruby
8
+ gem install venduitz
9
+ # OR...
10
+ gem 'venduitz'
11
+ ```
12
+
13
+ ### Define your views
14
+ ```ruby
15
+ require 'venduitz'
16
+
17
+ # Image view
18
+ class ImageView < Venduitz::View
19
+ # Define the view properties
20
+ prop :url
21
+ prop :width
22
+ prop :height
23
+ prop :alt
24
+ end
25
+
26
+ # Product view
27
+ class ProductView < Venduitz::View
28
+ # Define the view properties
29
+ prop :name
30
+ prop :sku
31
+ prop :price
32
+
33
+ # Also some collections
34
+ collection :images, ImageView, -> (product) { product.variants.images }
35
+
36
+ # You could also pass a property as a proc
37
+ # In this case I will use the ImageView again
38
+ prop :cover, -> (product) { ImageView.generate(product.cover) }
39
+ end
40
+
41
+ # Get your Object ready
42
+ product = Product.first
43
+
44
+ # Transform it to JSON!
45
+ res = ProductView.to_json(product)
46
+
47
+ # Return to your framwork
48
+ [200, {'Content-Type' => 'application/json'}, res]
49
+ ```
50
+
51
+ ## Development
52
+ * Building the docker container: `docker build -t venduitz .`
53
+ * Running the tests:
54
+ * With volume: `docker run --rm -it -v (PWD):/venduitz venduitz bundle exec rspec`
55
+ * Without volume: `docker run --rm -it venduitz bundle exec rspec`
@@ -0,0 +1,7 @@
1
+ #
2
+ module Venduitz
3
+ # Gem version
4
+ def self.version
5
+ '0.0.0'.freeze
6
+ end
7
+ end
@@ -0,0 +1,70 @@
1
+ #
2
+ module Venduitz
3
+ #
4
+ class View
5
+ # Static methods
6
+ class << self
7
+ # Properties
8
+ attr_reader :props, :collects
9
+
10
+ # Define a property for the view
11
+ # @param {Symbol/String} name Name used as the JSON field
12
+ # @param {Proc} prc If its necessary pass a Proc to generate
13
+ # the value used by the generator
14
+ def prop(name, prc = nil)
15
+ # Initialize it if its necessary
16
+ @props = {} if @props.nil?
17
+
18
+ # Define!
19
+ @props[name] = prc.nil? ? name : prc
20
+ end
21
+
22
+ # Define a collection for it
23
+ def collection(name, view, prc = nil)
24
+ # Initialize it if its necessary
25
+ @collects = {} if @collects.nil?
26
+
27
+ # Define the collection
28
+ @collects[name] = {
29
+ view: view,
30
+ value: (prc.nil? ? name : prc)
31
+ }
32
+ end
33
+
34
+ # This method will generate the hash object
35
+ # based on the properties and the colletions
36
+ # for the specific argument
37
+ # @param {Object} obj This must contain the declared properies and collections
38
+ # @return {Hash} JSON ready hash containing the specified view fields
39
+ def generate(obj)
40
+ # Reset the values to prevent errors
41
+ @props = {} if @props.nil?
42
+ @collects = {} if @collects.nil?
43
+
44
+ # Return the properties
45
+ res = @props.map do |prop, value|
46
+ next [prop, obj.send(value)] if value.is_a?(Symbol)
47
+ [prop, value.call(obj)]
48
+ end
49
+
50
+ # Return the collections
51
+ coll = @collects.map do |collect, info|
52
+ values = info[:value].is_a?(Symbol) ? obj.send(info[:value]) : info[:value].call(obj)
53
+ next [collect, []] if values.nil? || values.empty?
54
+ [collect, values.map {|val| info[:view].to_json(val) }]
55
+ end
56
+
57
+ # Return the full hash
58
+ Hash[res].merge(Hash[coll])
59
+ end
60
+
61
+ # Parse it
62
+ # @param {Object} obj This must contain the declared properies and collections
63
+ # @return {Hash} The JSON string itself
64
+ def to_json(obj)
65
+ # Transform the result into json
66
+ MultiJson.dump generate(obj)
67
+ end
68
+ end
69
+ end
70
+ end
data/lib/venduitz.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Initialize the module
2
+ module Venduitz
3
+ end
4
+
5
+ # Dependencies
6
+ require 'oj'
7
+ require 'multi_json'
8
+
9
+ # Core
10
+ require 'venduitz/view'
@@ -0,0 +1,8 @@
1
+ # Include Venduitz
2
+ require 'venduitz'
3
+
4
+ # Rspec conf
5
+ RSpec.configure do |config|
6
+ config.order = 'random'
7
+ config.seed = '12345'
8
+ end
@@ -0,0 +1,96 @@
1
+ # Include the helper
2
+ require 'spec_helper'
3
+
4
+ # Nested
5
+ class NestedView < Venduitz::View
6
+ prop :kind
7
+ prop :main, -> (o) { SubSampleView.generate(o.main) }
8
+ end
9
+
10
+ # Sub sample view
11
+ class SubSampleView < Venduitz::View
12
+ prop :name
13
+ end
14
+
15
+ # Sample view
16
+ class SampleView < Venduitz::View
17
+ # Define the property
18
+ prop :kind
19
+ prop :class, -> (o) { o.class }
20
+ collection :subs, SubSampleView
21
+ end
22
+
23
+ # Sample Class
24
+ class Sample
25
+ #
26
+ attr_accessor :subs, :main
27
+
28
+ #
29
+ def kind
30
+ 'Nice!'
31
+ end
32
+ end
33
+
34
+ # Sub Sample class
35
+ class SubSample
36
+ def name
37
+ 'Wow!'
38
+ end
39
+ end
40
+
41
+ #
42
+ describe Venduitz::View do
43
+ #
44
+ it 'should define the properties' do
45
+ expect(SampleView.props[:kind]).to eq(:kind)
46
+ expect(SampleView.props[:class]).to be_a(Proc)
47
+ end
48
+
49
+ #
50
+ it 'should define the collections' do
51
+ expect(SampleView.collects[:subs][:view]).to eq(SubSampleView)
52
+ expect(SampleView.collects[:subs][:value]).to eq(:subs)
53
+ end
54
+
55
+ #
56
+ it 'should generate the JSON of a simple view' do
57
+ # Generate the JSON object
58
+ res = SubSampleView.to_json(SubSample.new)
59
+
60
+ # Expectations
61
+ expect(res).to eq("{\"name\":\"Wow!\"}")
62
+ end
63
+
64
+ #
65
+ it 'should generate the JSON of a compund view' do
66
+ # Initialize the object
67
+ obj = Sample.new
68
+
69
+ # Add a sub object
70
+ obj.subs = [SubSample.new]
71
+
72
+ # Generate the JSON object
73
+ res = SampleView.to_json(obj)
74
+
75
+ # Expectations
76
+ expect(res).to eq("{\"kind\":\"Nice!\",\"class\":\"Sample\",\"subs\":[\"{\\\"name\\\":\\\"Wow!\\\"}\"]}")
77
+ end
78
+
79
+ #
80
+ context 'nested' do
81
+ #
82
+ it 'should generate the JSON of a simple view' do
83
+ # Initialize the object
84
+ obj = Sample.new
85
+
86
+ # Add a sub object
87
+ obj.main = SubSample.new
88
+
89
+ # Generate the JSON object
90
+ res = NestedView.to_json(obj)
91
+
92
+ # Expectations
93
+ expect(res).to eq("{\"kind\":\"Nice!\",\"main\":{\"name\":\"Wow!\"}}")
94
+ end
95
+ end
96
+ end
data/venduitz.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ #
2
+ require './lib/venduitz/version'
3
+
4
+ #
5
+ Gem::Specification.new do |s|
6
+ s.name = 'venduitz'
7
+ s.version = Venduitz.version
8
+
9
+ s.summary = ''
10
+ s.description = ''
11
+
12
+ s.author = 'Gabriel Corado'
13
+ s.email = 'gabrielcorado@mail.com'
14
+ s.homepage = 'http://github.com/gabrielcorado/venduitz'
15
+
16
+ s.files = `git ls-files`.strip.split("\n")
17
+ s.executables = Dir["bin/*"].map { |f| File.basename(f) }
18
+
19
+ # Dependencies
20
+ # s.add_dependency 'concurrent-ruby', '~> 1.0'
21
+ # s.add_dependency 'docker-api', '~> 1.26'
22
+ s.add_dependency 'multi_json'
23
+ s.add_dependency 'oj'
24
+
25
+ # Development depencies
26
+ s.add_development_dependency 'rspec', '~> 3.0'
27
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: venduitz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Corado
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description: ''
56
+ email: gabrielcorado@mail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - ".travis.yml"
63
+ - Dockerfile
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
67
+ - lib/venduitz.rb
68
+ - lib/venduitz/version.rb
69
+ - lib/venduitz/view.rb
70
+ - spec/spec_helper.rb
71
+ - spec/venduitz/view_spec.rb
72
+ - venduitz.gemspec
73
+ homepage: http://github.com/gabrielcorado/venduitz
74
+ licenses: []
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.4.5.1
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: ''
96
+ test_files: []