talk 2.0.0 → 2.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/talk +103 -5
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a961d23df0572382861cd34abb8d8faca663dccf
4
- data.tar.gz: 49ea322b27a7a7196a8b5e84dae44030ecfb5b16
3
+ metadata.gz: d7fc025a61346588f9645f6ecd1bb9450f092bf1
4
+ data.tar.gz: f6e49406e45c550e9a4492936af318650133be43
5
5
  SHA512:
6
- metadata.gz: 5d4b2bb25cd179fd2f96e23c1e14fce9aa0fd0307085f0f7cd809dc1fb997f2544401e3cc19cd06b1c96bfadb300716264698c2931c64784c046ea0449fbd237
7
- data.tar.gz: 314cfc96f37d88afafa2b19a8e1992181172b389f8752464c07fcba66a9be419bb6f1e79e70d71156c3cb715093ca682eee773406c0af5eb6a288b213f2313d8
6
+ metadata.gz: f3e3c0f6acff21efb2bbe29249489b7db50183ba5745cbccf5a6cc4c9f62b79576796942451784ae8c083e6017764a4281806f2b4172a2e0cf2b459dad3ac1a9
7
+ data.tar.gz: 5dc5c0994dba93d32f4699ec1e5c14935e6babd945cd09b093e5205ac233a45e7b20410ee31f926801c0802ad285f254cf652561fa8db9f5a8c3a2c9d1dba6e5
data/bin/talk CHANGED
@@ -5,8 +5,30 @@ lib = File.join(basepath, 'lib')
5
5
  $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
6
6
 
7
7
  require 'talk'
8
- require 'pp'
9
8
  require 'json'
9
+ require 'trollop'
10
+ require 'pp'
11
+
12
+ $opts = Trollop::options do
13
+ version "Talk 2.0 (c) 2013 Jonas Acres"
14
+ banner <<-EOS
15
+ Talk is a compile-to-source protocol specification language.
16
+
17
+ Usage:
18
+ talk [options] [source directories]
19
+ where [options] are:
20
+ EOS
21
+
22
+ opt :target, "Generate output based on specified target name", :type => :string, :multi => true
23
+ opt :targets, "List valid targets"
24
+ opt :omit, "Strip a top-level tag", :type => :string, :multi => true
25
+ opt :include, "Limit to a top-level tag", :type => :string, :multi => true
26
+ opt :no, "Do not render specified tag type at any level", :type => :string, :multi => true
27
+ opt :json, "Dump raw JSON to console"
28
+ opt :upgrade, "Upgrade old-style protocols to new-style"
29
+ end
30
+
31
+ Trollop::die :omit, "cannot be combined with include" if $opts[:omit].length > 0 and $opts[:include].length > 0
10
32
 
11
33
  $parser = Talk::Parser.new
12
34
 
@@ -17,6 +39,7 @@ def process_file(file)
17
39
  end
18
40
 
19
41
  if File.directory?(file) then
42
+ $parser.basepath = file
20
43
  Dir.glob(File.join(file, "/**/*.talk")).each do |subfile|
21
44
  process_file(subfile)
22
45
  end
@@ -25,12 +48,87 @@ def process_file(file)
25
48
  end
26
49
  end
27
50
 
28
- begin
29
- ARGV.each do |file|
30
- process_file(file)
51
+ def find_target_named(results, target_name)
52
+ return nil if results[:target].nil?
53
+ idx = results[:target].find_index { |target| target[:name] == target_name }
54
+ return results[:target][idx] unless idx.nil?
55
+ nil
56
+ end
57
+
58
+ def render_target(results, target_name)
59
+ target = find_target_named(results, target_name)
60
+ if target.nil? then
61
+ puts "Unknown target #{target_name}"
62
+ exit 1
63
+ end
64
+
65
+ lang = Talk::Language.language_named(target[:language])
66
+ if lang.nil? then
67
+ puts "Target #{target[:name]} has unsupported language #{target[:language]}"
68
+ exit 1
69
+ else
70
+ lang.render(results, target)
71
+ end
72
+ end
73
+
74
+ def render_targets(results)
75
+ $opts[:target].each { |target_name| render_target(results, target_name) }
76
+ end
77
+
78
+ def list_targets(results)
79
+ results[:target].each { |target| puts "\t#{target[:name]} (#{target[:language]})" }
80
+ end
81
+
82
+ def process_files
83
+ ARGV.each { |file| process_file(file) }
84
+ $parser.results
85
+ end
86
+
87
+ def strip_tag(container, tag)
88
+ if container.is_a? Array then
89
+ return container.map! { |v| strip_tag(v, tag) }
90
+ elsif not container.is_a? Hash then
91
+ return container
92
+ end
93
+
94
+ container.delete(tag)
95
+ container.each { |k, v| container[k] = strip_tag(v, tag) }
96
+ end
97
+
98
+ def strip_tags(container, tags)
99
+ tags.each { |tag| container = strip_tag(container, tag.to_sym) }
100
+ container
101
+ end
102
+
103
+ def strip_omitted(results, omitted)
104
+ omitted.each { |tag| results.delete(tag.to_sym) }
105
+ end
106
+
107
+ def strip_nonincluded(results, included)
108
+ included.map! { |key| key.to_sym }
109
+ trimmed = {}
110
+ (results.keys.select { |key| included.include? key }).each { |key| trimmed[key] = results[key] }
111
+ trimmed
112
+ end
113
+
114
+ def upgrade_protocols(results)
115
+ methods = {}
116
+ results[:method].each { |method| methods[method[:name].to_sym] = method }
117
+ results[:protocol].each do |proto|
118
+ proto[:method].map! { |method| methods[method.to_sym] }
31
119
  end
120
+ results.delete(:method)
121
+ end
32
122
 
33
- puts JSON.generate($parser.results)
123
+ begin
124
+ results = process_files
125
+ results = strip_tags(results, $opts[:no])
126
+ results = strip_omitted(results, $opts[:omit]) unless $opts[:omit].empty?
127
+ results = strip_nonincluded(results, $opts[:include]) unless $opts[:include].empty?
128
+ upgrade_protocols(results) if $opts[:upgrade]
129
+ puts JSON.generate(results) if $opts[:json]
130
+ list_targets(results) if $opts[:targets]
131
+ render_targets(results)
34
132
  rescue Talk::ParseError => e
35
133
  puts e
36
134
  exit 1
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: talk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Acres
@@ -39,7 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  version: '0'
40
40
  requirements: []
41
41
  rubyforge_project:
42
- rubygems_version: 2.0.3
42
+ rubygems_version: 2.0.14
43
43
  signing_key:
44
44
  specification_version: 4
45
45
  summary: Compile-to-source protocol contract specification language