jsoncop 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/README.md +67 -8
- data/lib/jsoncop/command/generate.rb +36 -0
- data/lib/jsoncop/command/install.rb +26 -14
- data/lib/jsoncop/command.rb +1 -0
- data/lib/jsoncop/version.rb +1 -1
- metadata +48 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4661699526bb0f0bc7066755875aa0cdf87f3005
|
4
|
+
data.tar.gz: 4185ad9d96938c2dd3ac93e91767f2faca424c53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
39
|
+
Then, each time build action is triggered, JSONCop would generate several parsing methods in swift files.
|
38
40
|
|
39
41
|

|
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
|
-
|
6
|
-
|
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("
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
28
|
-
|
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
|
32
|
-
|
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
|
data/lib/jsoncop/command.rb
CHANGED
data/lib/jsoncop/version.rb
CHANGED
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.
|
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:
|
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:
|
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.
|
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.
|