pbind 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daffbf09983752ded6d29b3b64bf7d5f8d0bd776
4
- data.tar.gz: 367f984121f3d3d13bed951a0063a5190b5e41cc
3
+ metadata.gz: 573151dfdd2acf6d1bbc018dff4cbfc196827213
4
+ data.tar.gz: f66ce1b7a90dd88c069e533e75c3d429e06128ee
5
5
  SHA512:
6
- metadata.gz: feef5da07a5578c78c730231a3aeb2141b8ca5055be4ad29c453b77cf98f0e1e0696b7cabfd44e34111455225820e485a4392887bb84c2e547e375b5816fbf96
7
- data.tar.gz: be7f7468246d76ceef180c1b408222af9b5d8c755769bdb1eb02b586617ddf0a4e651fe910d27fafeebb4613acfdf04a16e29b336f769d86696c6f175a4cd1ae
6
+ metadata.gz: d559bc9e5bf121749e96bc470f4c8f7b69dfdfbc2d39815da371456384b2a3e5e70ae3bb4fda47d112a5375549d0423ef0e7b66737ec8ea33e53f089878381cf
7
+ data.tar.gz: 845197b53f0976241409f41343dfab570d7fa50ea53c3cd7ca730f7651e5ad9c2b2a3d762c9ad1527c7dfc3bfc557018d6bf57bf9a7264d115868e2b6507eec1
@@ -1,8 +1,7 @@
1
1
  require 'colored'
2
2
  require 'claide'
3
3
 
4
- require 'cocoapods/config'
5
- require 'cocoapods/user_interface'
4
+ require 'pbind/user_interface'
6
5
 
7
6
  module Pbind
8
7
  class Command < CLAide::Command
@@ -16,8 +15,6 @@ module Pbind
16
15
  self.description = 'Pbind, the Pbind XcodeProject Helper.'
17
16
  self.plugin_prefixes = %w(claide pbind)
18
17
 
19
- UI = Pod::UI
20
-
21
18
  def self.report_error(exception)
22
19
  case exception
23
20
  when Interrupt
@@ -27,6 +27,7 @@ module Pbind
27
27
  end
28
28
 
29
29
  def run
30
+ @action = @action.gsub(/\//, '-')
30
31
  @api_name = 'PBLocalhost'
31
32
  @project_root = File.dirname(@project_path)
32
33
  @api_install_dir = File.absolute_path(File.join(@project_root, @api_name))
@@ -57,14 +58,16 @@ module Pbind
57
58
  group = project.main_group.find_subpath(@api_name, true)
58
59
  if group.empty?
59
60
  group.clear
60
- file_refs = Array.new
61
- Dir.foreach(@api_install_dir) do |file|
62
- if !File.directory?(file)
63
- file_refs << group.new_reference(File.join(@api_install_dir, file))
61
+ UI.section("Create group \"PBLocalhost\"") do
62
+ file_refs = Array.new
63
+ Dir.foreach(@api_install_dir) do |file|
64
+ if !File.directory?(file)
65
+ file_refs << group.new_reference(File.join(@api_install_dir, file))
66
+ end
64
67
  end
68
+ target.add_file_references(file_refs)
69
+ changed = true
65
70
  end
66
- target.add_file_references(file_refs)
67
- changed = true
68
71
  end
69
72
 
70
73
  # Create directory
@@ -75,29 +78,43 @@ module Pbind
75
78
  end
76
79
 
77
80
  # Create json file
78
- json_path = File.join(client_dir, "#{@action}.json")
81
+ json_name = "#{@action}.json"
82
+ json_path = File.join(client_dir, json_name)
83
+ json_relative_path = "PBLocalhost/#{@client}/#{json_name}"
79
84
  if !File.exists?(json_path)
80
- json_file = File.new(json_path, 'w')
81
- json_file.puts("{\n \n}")
82
- changed = true
85
+ UI.section("Creating file `#{json_name}`") do
86
+ json_file = File.new(json_path, 'w')
87
+ json_file.print("{\n \n}")
88
+ changed = true
89
+ end
83
90
  end
84
91
 
85
92
  # Add json file reference
86
93
  group = group.find_subpath(@client, true)
94
+ added = true
87
95
  if group.empty?
88
96
  group.clear
97
+ added = false
98
+ else
99
+ found = group.files.index {|x| x.path==json_relative_path}
100
+ if found == nil
101
+ added = false
102
+ end
103
+ end
104
+
105
+ if !added
89
106
  file_refs = Array.new
90
107
  file_refs << group.new_reference(json_path)
91
108
  target.add_file_references(file_refs)
92
109
  changed = true
93
110
  end
94
111
 
95
- # Save
96
112
  if !changed
97
113
  return
98
114
  end
99
115
 
100
- UI.section("Creating PBLocalhost/#{@client}/#{@action}.json.") do
116
+ # Save
117
+ UI.section("Adding reference `#{json_name}`") do
101
118
  project.save
102
119
  @changed = true
103
120
  end
@@ -53,15 +53,67 @@ module Pbind
53
53
  # @return [void]
54
54
  #
55
55
  def install_sources
56
- if File.exists?(@src_install_dir)
57
- return
56
+ source_dir = ENV['PBIND_SOURCE']
57
+ src_dir = File.join(source_dir, @src_name)
58
+
59
+ if !File.exists?(@src_install_dir)
60
+ UI.section("Copying `#{@src_name}` into `#{@project_root}`") do
61
+ FileUtils.cp_r src_dir, @project_root
62
+ @changed = true
63
+ end
64
+ else
65
+ # Check for upgrade.
66
+ Dir.foreach(@src_install_dir) do |filename|
67
+ if File.directory?(filename)
68
+ next
69
+ end
70
+
71
+ src_file = File.join(src_dir, filename)
72
+ if !File.exists?(src_file)
73
+ next
74
+ end
75
+
76
+ dst_file = File.join(@src_install_dir, filename)
77
+ src_md5 = Digest::MD5.hexdigest( File.open(src_file, "rb"){|fs| fs.read} )
78
+ dst_md5 = Digest::MD5.hexdigest( File.open(dst_file, "rb"){|fs| fs.read} )
79
+ if src_md5 != dst_md5
80
+ UI.section("Upgrading `#{@src_name}/#{filename}`") do
81
+ FileUtils.cp src_file, dst_file
82
+ @changed = true
83
+ end
84
+ end
85
+ end
58
86
  end
59
87
 
60
- source_dir = ENV['PBIND_SOURCE']
61
- UI.section("Copying [`#{@src_name}`, `#{@api_name}`] into `#{@project_root}`.") do
62
- FileUtils.cp_r File.join(source_dir, @src_name), @project_root
63
- FileUtils.cp_r File.join(source_dir, @api_name), @project_root
64
- @changed = true
88
+ src_dir = File.join(source_dir, @api_name)
89
+
90
+ if !File.exists?(@api_install_dir)
91
+ UI.section("Copying `#{@api_name}` into `#{@project_root}`") do
92
+ FileUtils.cp_r src_dir, @project_root
93
+ @changed = true
94
+ end
95
+ else
96
+ # Check for upgrade.
97
+ Dir.foreach(@api_install_dir) do |filename|
98
+ if File.directory?(filename)
99
+ next
100
+ end
101
+
102
+ src_file = File.join(src_dir, filename)
103
+ if !File.exists?(src_file)
104
+ next
105
+ end
106
+
107
+ dst_file = File.join(@api_install_dir, filename)
108
+ src_md5 = Digest::MD5.hexdigest(File.open(src_file, "rb"){|fs| fs.read} )
109
+ dst_md5 = Digest::MD5.hexdigest(File.open(dst_file, "rb"){|fs| fs.read} )
110
+ if src_md5 != dst_md5
111
+ UI.section("Upgrading `#{@api_name}/#{filename}`") do
112
+ FileUtils.cp src_file, dst_file
113
+ @changed = true
114
+ end
115
+ end
116
+ end
65
117
  end
66
118
  end
67
119
 
@@ -100,7 +152,7 @@ module Pbind
100
152
  return
101
153
  end
102
154
 
103
- UI.section("Add plist entires to `#{@project_path}`.") do
155
+ UI.section("Adding plist entires to `#{@project_path}`") do
104
156
  Xcodeproj::Plist.write_to_path(plist, info_plist_path)
105
157
  @changed = true
106
158
  end
@@ -148,7 +200,7 @@ module Pbind
148
200
  return
149
201
  end
150
202
 
151
- UI.section("Add group [`#{@src_name}`, `#{@api_name}`] to `#{@project_path}`.") do
203
+ UI.section("Adding group references to `#{@project_path}`") do
152
204
  project.save
153
205
  @changed = true
154
206
  end
@@ -0,0 +1,23 @@
1
+ module Pbind
2
+ module UI
3
+
4
+ require "colored"
5
+
6
+ class << self
7
+
8
+ def section(title)
9
+ message = "%-64s" % title
10
+ print message.yellow
11
+
12
+ yield if block_given?
13
+
14
+ puts '[ OK ]'.green
15
+ end
16
+
17
+ def notice(message)
18
+ puts ''
19
+ puts "[!] #{message}".green
20
+ end
21
+ end
22
+ end
23
+ end
@@ -14,9 +14,12 @@
14
14
 
15
15
  @implementation PBLiveLoader
16
16
 
17
- static NSString *const PLIST_SUFFIX = @".plist";
18
- static NSString *const JSON_SUFFIX = @".json";
19
- static NSString *const IGNORES_SUFFIX = @"ignore.h";
17
+ static NSString *const kPlistSuffix = @".plist";
18
+ static NSString *const kJSONSuffix = @".json";
19
+ static NSString *const kIgnoresFile = @"ignore.h";
20
+
21
+ static NSString *const kDebugJSONRedirectKey = @"$redirect";
22
+ static NSString *const kDebugJSONStatusKey = @"$status";
20
23
 
21
24
  static NSArray<NSString *> *kIgnoreAPIs;
22
25
  static PBDirectoryWatcher *kResWatcher;
@@ -45,12 +48,12 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
45
48
  + (void)watchPlist {
46
49
  NSString *resPath = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"PBResourcesPath"];
47
50
  if (resPath == nil) {
48
- NSLog(@"PBPlayground: Please define PBResourcesPath in Info.plist with value '$(SRCROOT)/[path-to-resources]'!");
51
+ NSLog(@"PBLiveLoader: Please define PBResourcesPath in Info.plist with value '$(SRCROOT)/[path-to-resources]'!");
49
52
  return;
50
53
  }
51
54
 
52
55
  if (![[NSFileManager defaultManager] fileExistsAtPath:resPath]) {
53
- NSLog(@"PBPlayground: PBResourcesPath is not exists! (%@)", resPath);
56
+ NSLog(@"PBLiveLoader: PBResourcesPath is not exists! (%@)", resPath);
54
57
  return;
55
58
  }
56
59
 
@@ -58,20 +61,20 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
58
61
  [kResWatcher watchDir:resPath handler:^(NSString *path, BOOL initial, PBDirEvent event) {
59
62
  switch (event) {
60
63
  case PBDirEventNewFile:
61
- if (HasSuffix(path, PLIST_SUFFIX)) {
64
+ if (HasSuffix(path, kPlistSuffix)) {
62
65
  NSBundle *updatedBundle = [NSBundle bundleWithPath:[path stringByDeletingLastPathComponent]];
63
66
  [Pbind addResourcesBundle:updatedBundle];
64
67
  }
65
68
  break;
66
69
 
67
70
  case PBDirEventModifyFile:
68
- if (HasSuffix(path, PLIST_SUFFIX)) {
71
+ if (HasSuffix(path, kPlistSuffix)) {
69
72
  [Pbind reloadViewsOnPlistUpdate:path];
70
73
  }
71
74
  break;
72
75
 
73
76
  case PBDirEventDeleteFile:
74
- if (HasSuffix(path, PLIST_SUFFIX)) {
77
+ if (HasSuffix(path, kPlistSuffix)) {
75
78
  [Pbind reloadViewsOnPlistUpdate:path];
76
79
  }
77
80
  break;
@@ -85,12 +88,12 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
85
88
  + (void)watchAPI {
86
89
  NSString *serverPath = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"PBLocalhost"];
87
90
  if (serverPath == nil) {
88
- NSLog(@"PBPlayground: Please define PBLocalhost in Info.plist with value '$(SRCROOT)/[path-to-api]'!");
91
+ NSLog(@"PBLiveLoader: Please define PBLocalhost in Info.plist with value '$(SRCROOT)/[path-to-api]'!");
89
92
  return;
90
93
  }
91
94
 
92
95
  if (![[NSFileManager defaultManager] fileExistsAtPath:serverPath]) {
93
- NSLog(@"PBPlayground: PBLocalhost is not exists! (%@)", serverPath);
96
+ NSLog(@"PBLiveLoader: PBLocalhost is not exists! (%@)", serverPath);
94
97
  return;
95
98
  }
96
99
 
@@ -98,23 +101,23 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
98
101
  [kAPIWatcher watchDir:serverPath handler:^(NSString *path, BOOL initial, PBDirEvent event) {
99
102
  switch (event) {
100
103
  case PBDirEventNewFile:
101
- if (HasSuffix(path, IGNORES_SUFFIX)) {
104
+ if (HasSuffix(path, kIgnoresFile)) {
102
105
  kIgnoreAPIs = [self ignoreAPIsWithContentsOfFile:path];
103
106
  }
104
107
  break;
105
108
 
106
109
  case PBDirEventModifyFile:
107
- if (HasSuffix(path, JSON_SUFFIX)) {
110
+ if (HasSuffix(path, kJSONSuffix)) {
108
111
  [self reloadViewsOnJSONChange:path deleted:NO];
109
- } else if (HasSuffix(path, IGNORES_SUFFIX)) {
112
+ } else if (HasSuffix(path, kIgnoresFile)) {
110
113
  [self reloadViewsOnIgnoresChange:path deleted:NO];
111
114
  }
112
115
  break;
113
116
 
114
117
  case PBDirEventDeleteFile:
115
- if (HasSuffix(path, JSON_SUFFIX)) {
118
+ if (HasSuffix(path, kJSONSuffix)) {
116
119
  [self reloadViewsOnJSONChange:path deleted:YES];
117
- } else if (HasSuffix(path, IGNORES_SUFFIX)) {
120
+ } else if (HasSuffix(path, kIgnoresFile)) {
118
121
  [self reloadViewsOnIgnoresChange:path deleted:YES];
119
122
  }
120
123
  break;
@@ -130,6 +133,11 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
130
133
  action = [action substringFromIndex:1]; // bypass '/'
131
134
  }
132
135
 
136
+ NSString *method = request.method;
137
+ if (method != nil && ![method isEqualToString:@"GET"]) {
138
+ action = [action stringByAppendingFormat:@"@%@", [method lowercaseString]];
139
+ }
140
+ action = [action stringByReplacingOccurrencesOfString:@"/" withString:@"-"];
133
141
  if (kIgnoreAPIs != nil && [kIgnoreAPIs containsObject:action]) {
134
142
  return nil;
135
143
  }
@@ -137,17 +145,41 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
137
145
  NSString *jsonName = [NSString stringWithFormat:@"%@/%@.json", [[client class] description], action];
138
146
  NSString *jsonPath = [serverPath stringByAppendingPathComponent:jsonName];
139
147
  if (![[NSFileManager defaultManager] fileExistsAtPath:jsonPath]) {
140
- NSLog(@"PBPlayground: Missing '%@', ignores!", jsonName);
148
+ NSLog(@"PBLiveLoader: Missing '%@', ignores!", jsonName);
141
149
  return nil;
142
150
  }
143
151
  NSData *jsonData = [NSData dataWithContentsOfFile:jsonPath];
144
152
  NSError *error = nil;
145
- id response = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
153
+
154
+ PBResponse *response = [[PBResponse alloc] init];
155
+ response.data = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
146
156
  if (error != nil) {
147
- NSLog(@"PBPlayground: Invalid '%@', ignores!", jsonName);
157
+ NSLog(@"PBLiveLoader: Invalid '%@', ignores! The file format should be pure JSON style.", jsonName);
148
158
  return nil;
149
159
  }
150
160
 
161
+ if ([response.data isKindOfClass:[NSDictionary class]]) {
162
+ NSString *redirect = [response.data objectForKey:kDebugJSONRedirectKey];
163
+ if (redirect != nil) {
164
+ PBExpression *expression = [PBExpression expressionWithString:redirect];
165
+ if (expression != nil) {
166
+ response.data = [expression valueWithData:nil];
167
+ }
168
+ } else {
169
+ NSString *statusString = [response.data objectForKey:kDebugJSONStatusKey];
170
+ if (statusString != nil) {
171
+ response.status = [statusString intValue];
172
+ }
173
+ NSMutableDictionary *filteredDict = [NSMutableDictionary dictionaryWithDictionary:response.data];
174
+ [filteredDict removeObjectForKey:kDebugJSONStatusKey];
175
+ if (filteredDict.count == 0) {
176
+ response.data = nil;
177
+ } else {
178
+ response.data = filteredDict;
179
+ }
180
+ }
181
+ }
182
+
151
183
  return response;
152
184
  }];
153
185
  }
@@ -181,7 +213,6 @@ static BOOL HasSuffix(NSString *src, NSString *tail)
181
213
  }
182
214
 
183
215
  NSArray *changedIgnores;
184
-
185
216
  if (oldIgnores != nil) {
186
217
  NSArray *deletedIgnores = [oldIgnores filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT SELF IN %@", newIgnores]];
187
218
  NSArray *addedIgnores = [newIgnores filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT SELF IN %@", oldIgnores]];
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pbind
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Galen Lin
@@ -62,6 +62,7 @@ files:
62
62
  - lib/pbind/command.rb
63
63
  - lib/pbind/command/mock.rb
64
64
  - lib/pbind/command/watch.rb
65
+ - lib/pbind/user_interface.rb
65
66
  - source/PBLiveLoader/PBDirectoryWatcher.h
66
67
  - source/PBLiveLoader/PBDirectoryWatcher.m
67
68
  - source/PBLiveLoader/PBLiveLoader.h