qor_dsl 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,80 @@
1
- qor_dsl
1
+ Qor Dsl - DSL made easy!
2
2
  =======
3
3
 
4
- Qor DSL
4
+ ## Description
5
+
6
+ Why DSL? Easy to read, Easy to write, Easy to maintain!
7
+ Why Qor DSL? Make it even easier! Write your DSLs in 10 minutes!
8
+
9
+ ## Usage
10
+
11
+ 1, Adding it as dependency to your Gemspec or Gemfile:
12
+
13
+ # your_awesome_gem.gemspec
14
+ Gem::Specification.new do |gem|
15
+ gem.add_dependency "qor_dsl"
16
+ end
17
+
18
+ # Gemfile
19
+ gem "qor_dsl"
20
+
21
+ 2, Defining DSL (Sample configuration support DSLs like [Gemfile](http://gembundler.com))
22
+
23
+ # gemfile.rb
24
+ class Gemfile
25
+ include Qor::Dsl
26
+ default_configs [ENV['BUNDLE_GEMFILE'], 'Gemfile']
27
+
28
+ node :source
29
+ node :gem
30
+
31
+ node :group do
32
+ node :gem
33
+ end
34
+ end
35
+
36
+ 3, Defining config (Sample Gemfile file used for above config)
37
+
38
+ # Gemfile
39
+ source 'http://rubygems.org'
40
+
41
+ gem 'rails', '3.2.8'
42
+ gem 'unicorn'
43
+ gem 'devise', :git => "git://github.com/jinzhu/devise.git", :ref => "b94ee9da98b16e4c8fbdc91af8605669d01b17e6"
44
+
45
+ group :development do
46
+ gem 'pry-rails'
47
+ end
48
+
49
+ group :test do
50
+ gem 'rspec'
51
+ end
52
+
53
+ 4, Querying config (Please checkout the source code and play with examples under the /example directory for more details)
54
+
55
+ # Find by type
56
+ Gemfile.find(:gem)
57
+
58
+ # Find by type and name also chain query
59
+ Gemfile.find(:group, 'development').find(:gem)
60
+
61
+ # Get all gems
62
+ Gemfile.deep_find(:gem)
63
+
64
+ # Find by block
65
+ Gemfile.deep_find(:gem) do |n|
66
+ # Find all gems used in development environment
67
+ parent = n.parent
68
+ parent.root? || ((parent.config_name == :group) && parent.name == :development)
69
+ end
70
+
71
+ # Qor DSL is designed to be as flexible as possible while helping you to create your DSLs.
72
+ # Please check source code for all possibilities!
73
+
74
+ ## Contributing
75
+
76
+ 1. Fork it
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create new Pull Request
data/example/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'rails', '3.2.8'
4
+ gem 'unicorn'
5
+ gem 'devise', :git => "git://github.com/jinzhu/devise.git", :ref => "b94ee9da98b16e4c8fbdc91af8605669d01b17e6"
6
+
7
+ group :development do
8
+ gem 'pry-rails'
9
+ end
10
+
11
+ group :test do
12
+ gem 'rspec'
13
+ end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'qor_dsl'
4
+
5
+ class Gemfile
6
+ include Qor::Dsl
7
+ default_configs [ENV['BUNDLE_GEMFILE'], File.join(File.dirname(__FILE__), 'Gemfile')]
8
+
9
+ node :source
10
+ node :gem
11
+
12
+ node :group do
13
+ node :gem
14
+ end
15
+
16
+ node :example do
17
+ node :gem, :inherit => true
18
+ end
19
+ end
20
+
21
+ # Methods for query
22
+ Gemfile.first(:gem)
23
+ Gemfile.first(:gem, 'unicorn')
24
+
25
+ Gemfile.find(:gem)
26
+ Gemfile.find(:gem, 'rails')
27
+ Gemfile.find(:gem) do |n|
28
+ !!n.options[:git].nil?
29
+ end
30
+
31
+ Gemfile.find(:group, 'development').find(:gem)
32
+
33
+ Gemfile.deep_find(:gem)
34
+ Gemfile.deep_find(:gem) do |n|
35
+ # Find all gems used in development environment
36
+ parent = n.parent
37
+ parent.root? || ((parent.config_name == :group) && parent.name == :development)
38
+ end
39
+
40
+ # Methods for node
41
+ node = Gemfile.find(:gem, 'devise')
42
+ node.name
43
+ node.value
44
+ node.options
45
+ node.data
46
+ node.config
47
+ node.parent
48
+ node.parents
49
+ node.root
50
+ node.root?
@@ -19,7 +19,7 @@ module Qor
19
19
 
20
20
  def default_config
21
21
  if @default_configs.is_a?(Array)
22
- @default_configs.select {|x| File.exist?(x) }[0]
22
+ @default_configs.select {|x| File.exist?(x.to_s) }[0]
23
23
  else
24
24
  @default_configs
25
25
  end
@@ -44,6 +44,10 @@ module Qor
44
44
  root.find(*arguments, &block)
45
45
  end
46
46
 
47
+ def deep_find(*arguments, &block)
48
+ root.deep_find(*arguments, &block)
49
+ end
50
+
47
51
  def first(*arguments, &block)
48
52
  root.first(*arguments, &block)
49
53
  end
@@ -32,13 +32,28 @@ module Qor
32
32
  node.add_config(config)
33
33
  node.data = *data
34
34
  node.block = blk
35
- node.config.instance_eval(&blk) if block_given? && (config.__children.size > 0)
36
35
  __node.add_child(node)
36
+ node.config.instance_eval(&blk) if block_given? && (config.__children.size > 0)
37
37
  end
38
38
  DOC
39
39
 
40
40
  self.instance_eval method_defination
41
41
  end
42
+
43
+ def to_s
44
+ result = [
45
+ ['name', __name],
46
+ ['parent', __parent && __parent.__name],
47
+ ['__children', __children.keys],
48
+ ['options', __options],
49
+ ['block', __block]
50
+ ].inject({}) do |s, value|
51
+ s[value[0]] = value[1] if value[1] && value[1].to_s.length > 0
52
+ s
53
+ end.inspect
54
+
55
+ "#<Qor::Dsl::Config::0x#{object_id.to_s(16)} #{result}>"
56
+ end
42
57
  end
43
58
  end
44
59
  end
data/lib/qor_dsl/node.rb CHANGED
@@ -1,15 +1,31 @@
1
1
  module Qor
2
2
  module Dsl
3
3
  class Node
4
- attr_accessor :name, :config, :parent, :children, :data, :options, :block
4
+ attr_accessor :name, :config, :parent, :children, :data, :options, :block, :all_nodes
5
5
 
6
6
  def initialize(name=nil, options={})
7
7
  self.name = name
8
8
  self.add_config(options[:config] || Qor::Dsl::Config.new('ROOT', self))
9
9
  end
10
10
 
11
+ def config_name
12
+ config.__name
13
+ end
14
+
11
15
  def inspect_name
12
- "{#{config.__name}: #{name || 'nil'}}"
16
+ "{#{config_name}: #{name || 'nil'}}"
17
+ end
18
+
19
+ def root?
20
+ root == self
21
+ end
22
+
23
+ def root
24
+ parent ? parent.root : self
25
+ end
26
+
27
+ def parents
28
+ parent ? [parent, parent.parents].flatten : []
13
29
  end
14
30
 
15
31
  def options
@@ -39,17 +55,25 @@ module Qor
39
55
  end
40
56
 
41
57
  def config_options_for_child(type)
42
- config.__children[type].__options || {}
58
+ config.__children[type].__options || {} rescue {}
43
59
  end
44
60
 
45
61
  def add_child(child)
46
62
  child.parent = self
47
63
  children << child
64
+ root.all_nodes ||= []
65
+ root.all_nodes << child
66
+ end
67
+
68
+ def deep_find(type=nil, name=nil, &block)
69
+ nodes = root.all_nodes
70
+ nodes = nodes.select {|n| n.parents.include?(self) } unless root?
71
+ find(type, name, nodes, &block)
48
72
  end
49
73
 
50
- def find(type=nil, name=nil, &block)
51
- selected_children = children.select do |child|
52
- (type.nil? ? true : (child.config.__name.to_s == type.to_s)) &&
74
+ def find(type=nil, name=nil, nodes=children, &block)
75
+ selected_children = nodes.select do |child|
76
+ (type.nil? ? true : (child.config_name.to_s == type.to_s)) &&
53
77
  (name.nil? ? true : (child.name.to_s == name.to_s)) &&
54
78
  (block.nil? ? true : block.call(child))
55
79
  end
@@ -64,11 +88,11 @@ module Qor
64
88
  selected_children.is_a?(Array) ? selected_children[0] : selected_children
65
89
  end
66
90
 
67
- def inspect
91
+ def to_s
68
92
  result = [
69
93
  ['name', name],
70
94
  ['parent', parent && parent.inspect_name],
71
- ['config', config.__name],
95
+ ['config', config_name],
72
96
  ['children', children.map(&:inspect_name)],
73
97
  ['data', data],
74
98
  ['block', block]
data/qor_dsl.gemspec CHANGED
@@ -2,14 +2,14 @@
2
2
  Gem::Specification.new do |gem|
3
3
  gem.authors = ["Jinzhu"]
4
4
  gem.email = ["wosmvp@gmail.com"]
5
- gem.description = %q{Qor DSL}
6
- gem.summary = %q{Qor DSL}
7
- gem.homepage = ""
5
+ gem.summary = %q{DSL made easy!}
6
+ gem.description = %q{Qor DSL is designed to be as flexible as possible while helping you to create your DSLs.}
7
+ gem.homepage = "https://github.com/qor/qor_dsl"
8
8
 
9
9
  gem.files = `git ls-files`.split($\)
10
10
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
11
11
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
12
12
  gem.name = "qor_dsl"
13
13
  gem.require_paths = ["lib"]
14
- gem.version = "0.0.5"
14
+ gem.version = "0.1.0"
15
15
  end
data/test/layout.rb CHANGED
@@ -34,6 +34,13 @@ action :google do
34
34
  end
35
35
  end
36
36
 
37
+ action :yahoo do
38
+ desc "From Yahoo"
39
+ detect do |app|
40
+ '...'
41
+ end
42
+ end
43
+
37
44
  layout :home do
38
45
  gadgets []
39
46
  end
data/test/layout_test.rb CHANGED
@@ -10,15 +10,24 @@ describe Layout do
10
10
  it "layout config testing" do
11
11
  # Find by type
12
12
  Layout::Configuration.find(:gadget).length.must_equal 2
13
+ Layout::Configuration.find(:template).length.must_equal 2
14
+ Layout::Configuration.deep_find(:template).length.must_equal 3
15
+ # :settings, :meta, :meta, :meta, :meta, :context, :template
16
+ Layout::Configuration.find(:gadget, :quick_buy).deep_find().length.must_equal 7
13
17
 
14
18
  # Find by name
15
19
  Layout::Configuration.find(:gadget, 'quick_buy').name.must_equal :quick_buy
20
+ Layout::Configuration.deep_find(:desc, "From Google").value.must_equal "From Google"
16
21
 
17
22
  # Find by block
18
23
  Layout::Configuration.first(:template) do |n|
19
24
  n.options[:since] > "12:50"
20
25
  end.value.must_equal 'Hello World2'
21
26
 
27
+ Layout::Configuration.deep_find(:desc) do |n|
28
+ n.parents.include?(Layout::Configuration.find(:action, :google))
29
+ end[0].value.must_equal 'From Google'
30
+
22
31
  # Inherit
23
32
  Layout::Configuration.find(:gadget, :product_link).find(:template)[0].value.must_equal "Hello World"
24
33
 
@@ -28,6 +37,9 @@ describe Layout do
28
37
  # Options
29
38
  Layout::Configuration.find(:template)[1].options.must_equal({:since => "13:00", :to => "18:00"})
30
39
 
40
+ # Parents
41
+ Layout::Configuration.find(:gadget, :quick_buy).first(:template).parents.count.must_equal 2
42
+
31
43
  # More is coming... (multi, alias_node)
32
44
  end
33
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qor_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,9 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-19 00:00:00.000000000 Z
12
+ date: 2012-10-20 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Qor DSL
14
+ description: Qor DSL is designed to be as flexible as possible while helping you to
15
+ create your DSLs.
15
16
  email:
16
17
  - wosmvp@gmail.com
17
18
  executables: []
@@ -23,6 +24,8 @@ files:
23
24
  - Gemfile.lock
24
25
  - README.md
25
26
  - Rakefile
27
+ - example/Gemfile
28
+ - example/gemfile.rb
26
29
  - lib/qor_dsl.rb
27
30
  - lib/qor_dsl/class_method.rb
28
31
  - lib/qor_dsl/config.rb
@@ -31,7 +34,7 @@ files:
31
34
  - test/configure.rb
32
35
  - test/layout.rb
33
36
  - test/layout_test.rb
34
- homepage: ''
37
+ homepage: https://github.com/qor/qor_dsl
35
38
  licenses: []
36
39
  post_install_message:
37
40
  rdoc_options: []
@@ -54,7 +57,7 @@ rubyforge_project:
54
57
  rubygems_version: 1.8.24
55
58
  signing_key:
56
59
  specification_version: 3
57
- summary: Qor DSL
60
+ summary: DSL made easy!
58
61
  test_files:
59
62
  - test/configure.rb
60
63
  - test/layout.rb