cbt 0.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.
@@ -0,0 +1,50 @@
1
+ require 'rviz'
2
+
3
+ module Cbt
4
+ class Diagram < App
5
+
6
+ def process!
7
+ g = Rviz::Graph.new
8
+ g.set('dpi', '300')
9
+ g.set('rankdir', 'LR')
10
+
11
+ # for each components, create a node of graphviz
12
+ @components.each do |cname, c|
13
+ if @options[:tag] and @options[:tag].size > 0
14
+ next unless @options[:tag].include? c.tag
15
+ end
16
+
17
+ # parse source file, add relationship
18
+ c.modules.each do |mname, m|
19
+ rec_name = m.name
20
+ attrs = self.tags(c.tag)
21
+ g.add_record(rec_name, attrs)
22
+ g.node(rec_name).add_row(cname + '/' + m.name, true)
23
+ g.add_edge(rec_name, 'f1', m.super_class, nil, {label: 'inherit', arrowhead: "odiamond"}) if m.super_class
24
+
25
+ # parse the file
26
+ comp_dir = c.dir(@options[:components_dir])
27
+ lua_file = m.path([comp_dir], 'debug')
28
+ File.open(lua_file).each do |line|
29
+ next if line =~ /no_erd/
30
+ line.chomp!
31
+ if /function\s#{m.name}\:/ =~ line
32
+ func = line.gsub(/^.*function\s#{m.name}\:/, '')
33
+ func.gsub!(/#.*$/, '')
34
+ g.node(rec_name).add_row('+' + func, false)
35
+ end
36
+
37
+ if /diagram\s*\-\>\s*/ =~ line
38
+ link_to = line.gsub(/^.*diagram\s*\-\>\s*/, '')
39
+ tgt, label = link_to.split(/\s+/, 2)
40
+ g.add_edge(rec_name, 'f1', tgt, nil, {label: label})
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ g.output
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,59 @@
1
+ require 'yaml'
2
+ require 'yaml/store'
3
+ require 'digest/md5'
4
+
5
+ module Cbt
6
+ class Digester
7
+
8
+ # initialize from the configuration
9
+ def initialize store_file
10
+ @store_file = store_file
11
+ @store = YAML::Store.new @store_file
12
+ end
13
+
14
+ def file_digest file
15
+ return "" unless File.exists? file
16
+ d = Digest::MD5.hexdigest(File.read(file))
17
+ end
18
+
19
+ # add file copy history
20
+ def add_history file, digest = nil
21
+ digest = file_digest file unless digest
22
+ @store.transaction do
23
+ @store[file] = Array.new unless @store[file]
24
+ @store[file] << {
25
+ 'datetime' => DateTime.now.strftime("%F %T"),
26
+ 'digest' => digest
27
+ }
28
+ end
29
+ end
30
+
31
+ # return 'datetime' => '', 'digest' => '' or nil for no store
32
+ def last_change file
33
+ @store.transaction do
34
+ @store[file][-1] if @store[file]
35
+ end
36
+ end
37
+
38
+ # if the digest is different from last time
39
+ def changed? file, digest = nil
40
+ digest = file_digest file unless digest
41
+ @store.transaction do
42
+ not (@store[file] and @store[file][-1] and @store[file][-1]['digest'] == digest)
43
+ end
44
+ end
45
+
46
+ # if the current digest exists in file store
47
+ def known? file, digest = nil
48
+ digest = file_digest file unless digest
49
+ @store.transaction do
50
+ return false unless @store[file]
51
+ @store[file].each do |h|
52
+ return true if h['digest'] == digest
53
+ end
54
+ end
55
+ false
56
+ end
57
+
58
+ end
59
+ end
data/lib/cbt/girc.rb ADDED
@@ -0,0 +1,169 @@
1
+ module Cbt
2
+ class Girc
3
+ attr_accessor :git
4
+
5
+ def initialize cmd = 'git', v = true
6
+ @git = cmd
7
+ @v = v
8
+ end
9
+
10
+ def info msg
11
+ return unless @v
12
+ puts "[GITC] #{msg}" if msg.size > 0
13
+ end
14
+
15
+ # general informations
16
+ # -----------------------
17
+ # return modified files (without additions/deletions)
18
+ def modified_files
19
+ files = Array.new
20
+ `#{@git} status`.split("\n").each do |line|
21
+ if /modified\:\s+(?<file_>.+)/ =~ line
22
+ files << File.expand_path(file_)
23
+ end
24
+ end
25
+ files
26
+ end
27
+
28
+ # return config list as a hash
29
+ def config
30
+ h = Hash.new
31
+ `#{@git} config --list`.split("\n").each do |line|
32
+ key, value = line.split("=")
33
+ h[key] = value
34
+ end
35
+ h
36
+ end
37
+
38
+ # return the value of user.name in configuration
39
+ def me
40
+ config["user.name"] || "?"
41
+ end
42
+
43
+ # all branches include remote branches
44
+ def branches
45
+ branch_list = Array.new
46
+ `#{@git} branch -a`.split("\n").each do |line|
47
+ line.gsub!('* ', '')
48
+ line.gsub!(/\s/, '')
49
+ branch_list << line unless branch_list.include? line
50
+ end
51
+ branch_list
52
+ end
53
+
54
+ # the branch currently working on
55
+ def current_branch
56
+ `#{@git} branch`.split("\n").each do |line|
57
+ if /\*/.match line
58
+ return line.gsub('* ', '')
59
+ end
60
+ end
61
+ nil
62
+ end
63
+
64
+ def remote_list
65
+ lst = Array.new
66
+ `#{@git} remote -v`.split("\n").each do |line|
67
+ rn = line.split(/\s+/)[0]
68
+ lst << rn unless lst.include? rn
69
+ end
70
+ lst
71
+ end
72
+
73
+ # is the working directory has modified file
74
+ def wd_clean?
75
+ clean = true
76
+ `#{@git} status`.split("\n").each do |line|
77
+ clean = false if /Changes/.match line
78
+ end
79
+ clean
80
+ end
81
+
82
+ # whether the current directory is a git working directory
83
+ def in_git_dir?
84
+ `#{@git} status` =~ /fatal/ ? false : true
85
+ end
86
+
87
+ # modifications
88
+ # --------------------
89
+
90
+ # pull from the remote use fetch/merge
91
+ def pull! remote = 'origin'
92
+ cb = self.current_branch
93
+ info "Fetch from #{remote}"
94
+ rslt = `#{@git} fetch #{remote}`
95
+ raise "fetch failed with message: #{rslt}" unless $?.success?
96
+ info rslt
97
+ info `#{@git} merge #{remote}/#{cb}`
98
+ end
99
+
100
+ # create a new branch, if remote set, push it to remote too
101
+ # then switch to that branch
102
+ def new_branch! branch, remote=nil
103
+ raise "You need clean up you working directory" unless wd_clean?
104
+ raise "Branch #{branch} already exists" if self.branches.include? branch
105
+ `#{@git} checkout -b #{branch}`
106
+ `#{@git} push #{remote} #{branch}` if remote
107
+ end
108
+
109
+ # delete a branch
110
+ def del_branch! branch, remote=nil
111
+ rslt = `#{@git} branch -d #{branch}`
112
+ raise "Cat not delete branch #{branch}: #{rslt}" unless $?.success?
113
+ `#{@git} push #{remote} :#{branch}` if remote
114
+ end
115
+
116
+ def stash!
117
+ unless wd_clean?
118
+ info "Stash your local changes"
119
+ `#{@git} add .`
120
+ `#{@git} stash`
121
+ end
122
+ end
123
+
124
+ def stash_pop!
125
+ raise "You may clean up you work directroy first before pop out from the stash" unless wd_clean?
126
+ info "Pop out from you last stash"
127
+ `#{@git} stash pop`
128
+ end
129
+
130
+ # remote from a specified remote ref
131
+ def rebase! remote = 'origin', branch = 'develop'
132
+ cb = self.current_branch
133
+ stashed = false
134
+
135
+ unless self.wd_clean?
136
+ self.stash!
137
+ stashed = true
138
+ end
139
+
140
+ if branch == self.current_branch
141
+ info "Pull from remote"
142
+ # `#{@git} pull --rebase #{remote} #{branch}`
143
+ `#{@git} pull #{remote} #{branch}`
144
+ else
145
+ info "Switch to branch #{branch}"
146
+ `#{@git} fetch #{remote}`
147
+ rslt = `#{@git} checkout #{branch}`
148
+ raise "Checkout failed: #{rslt}" unless $?.success?
149
+
150
+ info "Update branch from remote"
151
+ # rslt = `#{@git} pull --rebase #{remote} #{branch}`
152
+ rslt = `#{@git} pull #{remote} #{branch}`
153
+ raise "Pull for #{branch} failed: #{rslt}" unless $?.success?
154
+
155
+ info "Switch back to branch #{cb}"
156
+ `#{@git} checkout #{cb}`
157
+ info "Merge from #{branch}"
158
+ rslt = `#{@git} merge #{branch}`
159
+ raise "Merge with #{branch} failed: #{rslt}" unless $?.success?
160
+
161
+ info "pull branch #{self.current_branch} from remote"
162
+ `#{@git} pull #{remote} #{self.current_branch}`
163
+ end
164
+
165
+ self.stash_pop! if stashed
166
+ end
167
+
168
+ end
169
+ end
@@ -0,0 +1,3 @@
1
+ module Cbt
2
+ VERSION = '0.0.1'
3
+ end
data/lib/luobo/cbt.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'luobo'
2
+
3
+ class CbtLuobo < Luobo
4
+ attr_accessor :platform
5
+
6
+ def self.cp! s, t, p
7
+ k = self.new s, t
8
+ k.platform = p
9
+ k.process!
10
+ end
11
+
12
+ def do__platform token
13
+ str = ''
14
+ token.blocks.each do |line|
15
+ line.gsub!(/^\s\s?/, '')
16
+ str += token.indent + line + "\n"
17
+ end
18
+ str
19
+ end
20
+
21
+ def do_ios token
22
+ do__platform token if @platform == 'ios'
23
+ end
24
+
25
+ end
data/lib/luobo/lua.rb ADDED
@@ -0,0 +1,3 @@
1
+ class LuaLuobo < CbtLuobo
2
+
3
+ end
@@ -0,0 +1,4 @@
1
+ class SettingsLuobo < LuaLuobo
2
+
3
+ end
4
+
data/lib/luobo/spec.rb ADDED
@@ -0,0 +1,4 @@
1
+ class SpecLuobo < LuaLuobo
2
+
3
+ end
4
+
data/spec/app_spec.rb ADDED
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ class GircMock
4
+ attr_accessor :current_branch
5
+ def in_git_dir?; true end
6
+ end
7
+
8
+ describe Cbt::App do
9
+
10
+ describe "#initialize" do
11
+ subject(:app) do
12
+ Cbt::App.new(config_file: "examples/config/components.yml")
13
+ end
14
+
15
+ it "parses two components in the list" do
16
+ app.components.keys.size.should eq(3)
17
+ app.components.each { |k,v| v.is_a?(Cbt::Component).should be_true }
18
+ end
19
+
20
+ it "parses module files for component utils" do
21
+ app.components["utils"].modules.size.should eq(2)
22
+ app.components["utils"].modules.each {|k,v| v.is_a?(Cbt::LuaModule).should be_true}
23
+ end
24
+ end
25
+
26
+ describe "#current_component_names" do
27
+ subject(:app) do
28
+ app = Cbt::App.new(config_file: "examples/config/components.yml")
29
+ app.git = GircMock.new
30
+ app
31
+ end
32
+
33
+ it "return component for full format current branch" do
34
+ app.git.current_branch = 'component/utils'
35
+ app.current_component_names[0].should eq('utils')
36
+ end
37
+
38
+ it "return component for shorter format current branch" do
39
+ app.git.current_branch = 'comp/utils'
40
+ app.current_component_names[0].should eq('utils')
41
+ end
42
+
43
+ it "return component for short format current branch" do
44
+ app.git.current_branch = 'ct/utils'
45
+ app.current_component_names[0].should eq('utils')
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Cbt::Creator do
4
+ describe "#find_tpl" do
5
+ subject(:crt) { Cbt::Creator.new(config_file: "examples/config/components.yml") }
6
+
7
+ it "find tpl for simple module" do
8
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'util')).should eq(File.expand_path("templates/part.lua.erb"))
9
+ end
10
+
11
+ it "find tpl for simple Class" do
12
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'Util')).should eq(File.expand_path("templates/Class.lua.erb"))
13
+ end
14
+
15
+ it "find tpl for simple module with super class" do
16
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'util<Sp')).should eq(File.expand_path("templates/part_with_super.lua.erb"))
17
+ end
18
+
19
+ it "find tpl for simple Class with super class" do
20
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'Util<Sp')).should eq(File.expand_path("templates/Class_with_super.lua.erb"))
21
+ end
22
+ it "find tpl for mock module" do
23
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'util'), true).should eq(File.expand_path("templates/part.mock.lua.erb"))
24
+ end
25
+
26
+ it "find tpl for mock Class" do
27
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'Util'), true).should eq(File.expand_path("templates/Class.mock.lua.erb"))
28
+ end
29
+
30
+ it "find tpl for mock module" do
31
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'util<Sp'), true).should eq(File.expand_path("templates/part_with_super.mock.lua.erb"))
32
+ end
33
+
34
+ it "find tpl for mock Class" do
35
+ crt.find_tpl(Cbt::LuaModule.new('utils', 'Util<Sp'), true).should eq(File.expand_path("templates/Class_with_super.mock.lua.erb"))
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+
3
+ require 'fileutils'
4
+
5
+ describe Cbt::Digester do
6
+ TEMP_FILE = 'history.yml'
7
+ subject(:dst) { Cbt::Digester.new(TEMP_FILE) }
8
+
9
+ describe '#add_history' do
10
+ it "can add history" do
11
+ dst.add_history('filename', 'digeststringverylong')
12
+ dst.last_change('filename').should_not be_nil
13
+ end
14
+
15
+ it "can get last history" do
16
+ dst.last_change('filename')['digest'].should eq('digeststringverylong')
17
+ end
18
+
19
+ it "can handle more than one file" do
20
+ dst.add_history('filename2', 'lfgjhowtqerpfdfflou4o8rywo')
21
+ dst.last_change('filename')['digest'].should eq('digeststringverylong')
22
+ end
23
+
24
+ it "can test file change" do
25
+ dst.changed?('filename', 'digeststringverylong').should be_false
26
+ dst.changed?('filename', 'digeststringverylongzz').should be_true
27
+ end
28
+
29
+ it "can test file version in history" do
30
+ dst.add_history('filename', '34dofy8yeroerhfdofsdf')
31
+ dst.known?('filename', 'digeststringverylong').should be_true
32
+ dst.known?('filename', 'digeststringverylozng').should be_false
33
+ end
34
+
35
+ it "compare file change only for the last version" do
36
+ dst.changed?('filename', '34dofy8yeroerhfdofsdf').should be_false
37
+ dst.changed?('filename', 'digeststringverylong').should be_true
38
+ end
39
+
40
+ it "compare file change without digest" do
41
+ FileUtils.cp 'examples/config/components.yml', 'history_test'
42
+ dst.add_history('history_test')
43
+ dst.changed?('history_test').should be_false
44
+ #wfh = File.open('history_test', 'w')
45
+ #wfh.puts "history file test"
46
+ #wfh.close
47
+ #dst.changed?('history_test').should be_true
48
+ end
49
+
50
+ after(:all) do
51
+ FileUtils.rm TEMP_FILE
52
+ FileUtils.rm 'history_test'
53
+ end
54
+ end
55
+ end