jsoncop 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d68292e78bb6f41e6f716a177702537eb7af012
4
- data.tar.gz: 7d9f747880b9f1016543e68427a65efe25530066
3
+ metadata.gz: 4661699526bb0f0bc7066755875aa0cdf87f3005
4
+ data.tar.gz: 4185ad9d96938c2dd3ac93e91767f2faca424c53
5
5
  SHA512:
6
- metadata.gz: 455670249f7eb076763eb09268602d7658ab4446bd6e70a4c164aa8e4b29c00c9b65a8d4910883bd0cc4f7c39b14a0b76b6b32845cb59374a76e52cfc5167024
7
- data.tar.gz: 05b4142380220cdd1cc5e645225ab6482901508b2b1b0bf4258dbc996f0fd1b6fa1e7d184f0e776a3fe87ddb48aa7b75786bc0adcb13ea02fd407bd0c7bb42a6
6
+ metadata.gz: 18d32c6cb4a60cfac861e91a5a40dc2c6120b2884ddaf1eaa623bc223718a77724b93b9e4d6adbef8b984a152218c49bb5efa53b6892d333a738e52586d6402f
7
+ data.tar.gz: bfa0bd079a97d783ade970ec58f074b5edf16b74567227aa825c61593829e48ec4aa395b0fb0387ab1caf79e358e75eae226d990d9ef3fe7f6e374da2b27a01c
data/README.md CHANGED
@@ -19,7 +19,14 @@ let person = Person.parse(json: json)
19
19
 
20
20
  ## Usage
21
21
 
22
- Define a model with and **add `//@jsoncop` just before model definition line**:
22
+ 1. Install JSONCop with `sudo gem install jsoncop --verbose` below in system ruby version
23
+ 2. Run `cop install` in project root folder
24
+ 3. **Add `//@jsoncop` just before model definition line**
25
+
26
+ ```shell
27
+ $ sudo gem install jsoncop --verbose
28
+ ~/project $ cop install
29
+ ```
23
30
 
24
31
  ```swift
25
32
  //@jsoncop
@@ -28,21 +35,73 @@ struct Person {
28
35
  let name: String
29
36
  }
30
37
  ```
31
- Run `cop install` in project root folder.
32
-
33
- ```shell
34
- $ cop install
35
- ```
36
38
 
37
- This will generate several parsing methods in current file without affecting other part of your codes:
39
+ Then, each time build action is triggered, JSONCop would generate several parsing methods in swift files.
38
40
 
39
41
  ![](./images/jsoncop-demo.png)
40
42
 
41
43
  All the code between `// MARK: - JSONCop-Start` and `// MARK: - JSONCop-End` and will be replaced when re-run `cop install` in current project folder. Other codes will remain unchanged. Please don't write any codes in this area.
42
44
 
45
+ ```ruby
46
+ extension Person {
47
+ static func parse(json: Any) -> Person? {
48
+ guard let json = json as? [String: Any] else { return nil }
49
+ guard let id = json["id"] as? Int,
50
+ let name = json["name"] as? String,
51
+ let projects = (json["projects"] as? [[String: Any]]).flatMap(projectsJSONTransformer) else { return nil }
52
+ return Person(id: id, name: name, projects: projects)
53
+ }
54
+ static func parses(jsons: Any) -> [Person] {
55
+ guard let jsons = jsons as? [[String: Any]] else { return [] }
56
+ return jsons.flatMap(parse)
57
+ }
58
+ }
59
+ ```
60
+
61
+ Checkout [JSONCopExample](./JSONCopExample) for more information.
62
+
63
+ ## Customize
64
+
65
+ + JSON key to attribute customization
66
+
67
+ ```swift
68
+ struct Person {
69
+ let id: Int
70
+ let name: String
71
+
72
+ static func JSONKeyPathByPropertyKey() -> [String: String] {
73
+ return ["nickname": "name"]
74
+ }
75
+ }
76
+ ```
77
+
78
+ + Value transformer customization
79
+
80
+ ```swift
81
+ struct Person {
82
+ let id: Int
83
+ let name: String
84
+ let gender: Gender
85
+ let projects: [Project]
86
+
87
+ enum Gender: Int {
88
+ case male = 0
89
+ case female = 1
90
+ }
91
+
92
+ static func genderJSONTransformer(value: Int) -> Gender? {
93
+ return Gender(rawValue: value)
94
+ }
95
+
96
+ static func projectsJSONTransformer(value: [[String: Any]]) -> [Project] {
97
+ return value.flatMap(Project.parse)
98
+ }
99
+ }
100
+ ```
101
+
43
102
  ## Installation
44
103
 
45
- ```
104
+ ```shell
46
105
  sudo gem install jsoncop --verbose
47
106
  ```
48
107
 
@@ -0,0 +1,36 @@
1
+ module JSONCop
2
+ class Command
3
+ class Generate < Command
4
+
5
+ require "jsoncop/analyzer"
6
+ require "jsoncop/generator"
7
+
8
+ self.summary = ""
9
+ self.description = <<-DESC
10
+ DESC
11
+
12
+ def initialize(argv)
13
+ super
14
+ end
15
+
16
+ def run
17
+ Dir.glob("**/*.swift").each do |file|
18
+ analyzer = create_analyzer_for_file file
19
+ model = analyzer.analyze!
20
+ next unless model
21
+
22
+ generator = create_generator_for_file file, model
23
+ generator.generate!
24
+ end
25
+ end
26
+
27
+ def create_analyzer_for_file(file_path)
28
+ Analyzer.new file_path
29
+ end
30
+
31
+ def create_generator_for_file(file_path, model)
32
+ Generator.new file_path, model
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,9 +1,12 @@
1
+ require "xcodeproj"
2
+
1
3
  module JSONCop
2
4
  class Command
3
5
  class Install < Command
4
6
 
5
- require "jsoncop/analyzer"
6
- require "jsoncop/generator"
7
+ BUILD_PHASE_PREFIX = "[JC] ".freeze
8
+
9
+ JSONCOP_INSTALL_PHASE_NAME = "JSONCop Install Script".freeze
7
10
 
8
11
  self.summary = ""
9
12
  self.description = <<-DESC
@@ -14,22 +17,31 @@ module JSONCop
14
17
  end
15
18
 
16
19
  def run
17
- Dir.glob("**/*.swift").each do |file|
18
- analyzer = create_analyzer_for_file file
19
- model = analyzer.analyze!
20
- next unless model
21
-
22
- generator = create_generator_for_file file, model
23
- generator.generate!
24
- end
20
+ project = Xcodeproj::Project.open(Dir.glob("*.xcodeproj").first)
21
+ native_target = project.targets.first
22
+ phase = create_or_update_build_phase(native_target, JSONCOP_INSTALL_PHASE_NAME)
23
+ phase.shell_path = "/usr/bin/ruby"
24
+ phase.shell_script = install_shell_script
25
+ project.save
25
26
  end
26
27
 
27
- def create_analyzer_for_file(file_path)
28
- Analyzer.new file_path
28
+ def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
29
+ prefixed_phase_name = BUILD_PHASE_PREFIX + phase_name
30
+ build_phases = target.build_phases.grep(phase_class)
31
+ build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = prefixed_phase_name if p } ||
32
+ target.project.new(phase_class).tap do |phase|
33
+ phase.name = prefixed_phase_name
34
+ phase.show_env_vars_in_log = '0'
35
+ target.build_phases.unshift phase
36
+ end
29
37
  end
30
38
 
31
- def create_generator_for_file(file_path, model)
32
- Generator.new file_path, model
39
+ def install_shell_script
40
+ <<-SCRIPT#!/usr/bin/env ruby
41
+ require 'jsoncop'
42
+ Encoding.default_external = Encoding::UTF_8
43
+ JSONCop::Command.run(["generate"])
44
+ SCRIPT
33
45
  end
34
46
  end
35
47
  end
@@ -4,6 +4,7 @@ require 'claide'
4
4
  module JSONCop
5
5
  class Command < CLAide::Command
6
6
  require "jsoncop/command/install"
7
+ require "jsoncop/command/generate"
7
8
  require "jsoncop/command/uninstall"
8
9
 
9
10
  self.abstract_command = true
@@ -1,3 +1,3 @@
1
1
  module JSONCop
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsoncop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Draveness
@@ -14,96 +14,116 @@ dependencies:
14
14
  name: claide
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.0.0
20
- - - "<"
20
+ - - <
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
27
+ - - '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.0.0
30
- - - "<"
30
+ - - <
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: colored
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ~>
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.2'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ~>
45
45
  - !ruby/object:Gem::Version
46
46
  version: '1.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: xcodeproj
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.0
54
+ - - <
55
+ - !ruby/object:Gem::Version
56
+ version: '2.0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: 1.2.0
64
+ - - <
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
47
67
  - !ruby/object:Gem::Dependency
48
68
  name: activesupport
49
69
  requirement: !ruby/object:Gem::Requirement
50
70
  requirements:
51
- - - ">="
71
+ - - '>='
52
72
  - !ruby/object:Gem::Version
53
- version: 4.2.6
54
- - - "<"
73
+ version: '3'
74
+ - - <
55
75
  - !ruby/object:Gem::Version
56
76
  version: '5.0'
57
77
  type: :runtime
58
78
  prerelease: false
59
79
  version_requirements: !ruby/object:Gem::Requirement
60
80
  requirements:
61
- - - ">="
81
+ - - '>='
62
82
  - !ruby/object:Gem::Version
63
- version: 4.2.6
64
- - - "<"
83
+ version: '3'
84
+ - - <
65
85
  - !ruby/object:Gem::Version
66
86
  version: '5.0'
67
87
  - !ruby/object:Gem::Dependency
68
88
  name: bundler
69
89
  requirement: !ruby/object:Gem::Requirement
70
90
  requirements:
71
- - - "~>"
91
+ - - ~>
72
92
  - !ruby/object:Gem::Version
73
93
  version: '1.12'
74
94
  type: :development
75
95
  prerelease: false
76
96
  version_requirements: !ruby/object:Gem::Requirement
77
97
  requirements:
78
- - - "~>"
98
+ - - ~>
79
99
  - !ruby/object:Gem::Version
80
100
  version: '1.12'
81
101
  - !ruby/object:Gem::Dependency
82
102
  name: rake
83
103
  requirement: !ruby/object:Gem::Requirement
84
104
  requirements:
85
- - - "~>"
105
+ - - ~>
86
106
  - !ruby/object:Gem::Version
87
107
  version: '10.0'
88
108
  type: :development
89
109
  prerelease: false
90
110
  version_requirements: !ruby/object:Gem::Requirement
91
111
  requirements:
92
- - - "~>"
112
+ - - ~>
93
113
  - !ruby/object:Gem::Version
94
114
  version: '10.0'
95
115
  - !ruby/object:Gem::Dependency
96
116
  name: rspec
97
117
  requirement: !ruby/object:Gem::Requirement
98
118
  requirements:
99
- - - "~>"
119
+ - - ~>
100
120
  - !ruby/object:Gem::Version
101
121
  version: '3.0'
102
122
  type: :development
103
123
  prerelease: false
104
124
  version_requirements: !ruby/object:Gem::Requirement
105
125
  requirements:
106
- - - "~>"
126
+ - - ~>
107
127
  - !ruby/object:Gem::Version
108
128
  version: '3.0'
109
129
  description: A light-weight JSON to model method generator.
@@ -114,20 +134,21 @@ executables:
114
134
  extensions: []
115
135
  extra_rdoc_files: []
116
136
  files:
117
- - LICENSE
118
- - README.md
119
- - bin/cop
120
- - lib/jsoncop.rb
121
137
  - lib/jsoncop/analyzer.rb
122
- - lib/jsoncop/command.rb
138
+ - lib/jsoncop/command/generate.rb
123
139
  - lib/jsoncop/command/install.rb
124
140
  - lib/jsoncop/command/uninstall.rb
141
+ - lib/jsoncop/command.rb
125
142
  - lib/jsoncop/generator.rb
126
143
  - lib/jsoncop/helper.rb
127
144
  - lib/jsoncop/model/attribute.rb
128
145
  - lib/jsoncop/model/model.rb
129
146
  - lib/jsoncop/model/transformer.rb
130
147
  - lib/jsoncop/version.rb
148
+ - lib/jsoncop.rb
149
+ - bin/cop
150
+ - README.md
151
+ - LICENSE
131
152
  homepage: https://github.com/Draveness/JSONCop
132
153
  licenses:
133
154
  - MIT
@@ -138,17 +159,17 @@ require_paths:
138
159
  - lib
139
160
  required_ruby_version: !ruby/object:Gem::Requirement
140
161
  requirements:
141
- - - ">="
162
+ - - '>='
142
163
  - !ruby/object:Gem::Version
143
164
  version: '0'
144
165
  required_rubygems_version: !ruby/object:Gem::Requirement
145
166
  requirements:
146
- - - ">="
167
+ - - '>='
147
168
  - !ruby/object:Gem::Version
148
169
  version: '0'
149
170
  requirements: []
150
171
  rubyforge_project:
151
- rubygems_version: 2.6.6
172
+ rubygems_version: 2.0.14.1
152
173
  signing_key:
153
174
  specification_version: 4
154
175
  summary: A JSON to model method generator.